# HG changeset patch # User Nina Engelhardt # Date 1370278159 -7200 # Node ID df464a215387e4e1a3e764a45a0fc46e700b1cda # Parent 0715109abb082e77c8b9a9b283af6c8de6dc792c add implementations of (some) nanos api functions diff -r 0715109abb08 -r df464a215387 nanos-vss.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nanos-vss.c Mon Jun 03 18:49:19 2013 +0200 @@ -0,0 +1,200 @@ +#include + +#include "VSs.h" + +/*nanos_submit +nanos_current_wd +nanos_create_wd_compact +nanos_handle_error +nanos_create_wd_and_run_compact + +nanos_wg_wait_completion //taskwait +nanos_wait_on //taskwait on +nanos_set_lock //critical start +nanos_unset_lock //critical end + +nanos_omp_set_interface +nanos_smp_factory*/ + +nanos_wd_t nanos_current_wd(void) { + return (nanos_wd_t) ((VSsSemData*) currVP->semanticData)->taskStub; +} + +nanos_err_t nanos_create_wd_compact(nanos_wd_t *wd, nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props, + size_t data_size, void ** data, nanos_wg_t wg, nanos_copy_data_t **copies) { + VSsTaskStub* ts = (VSsTaskStub*) malloc(sizeof (VSsTaskStub)); + void* alloc_data = malloc(data_size); + *data = alloc_data; + ts->args = alloc_data; + + nanos_device_t* dev = (nanos_device_t*) &const_data[1]; + + VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType)); + + taskType->fn = *((VSsTaskFnPtr*) dev[0].arg); + taskType->sizeOfArgs = data_size; + + ts->taskType = taskType; + + *wd = (nanos_wd_t) ts; + + return NANOS_OK; +} + +nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_deps, nanos_dependence_t *deps, nanos_team_t team) { + + int32* depsTypes = malloc(sizeof (int32) * num_deps); + size_t* depsSizes = malloc(sizeof (size_t) * num_deps); + void** depsAddrs = malloc(sizeof (void*)*num_deps); + + int i; + for (i = 0; i < num_deps; i++) { + depsAddrs[i] = deps[i].address; + depsTypes[i] = (deps[i].flags.output) ? WRITER : READER; + depsSizes[i] = deps[i].size; + } + + VSsTaskStub* ts = (VSsTaskStub*) wd; + + + + VSsTaskType* taskType = ts->taskType; + taskType->numDeps = num_deps; + taskType->depsTypes = depsTypes; + taskType->depsSizes = depsSizes; + + + VSsSemReq reqData; + + reqData.reqType = submit_task; + + reqData.taskType = taskType; + reqData.args = ts->args; + reqData.deps = depsAddrs; + reqData.callingSlv = currVP; + + reqData.taskID = NULL; + + free(ts); + + VMS_WL__send_sem_request(&reqData, currVP); + + return NANOS_OK; +} + +nanos_err_t nanos_create_wd_and_run_compact(nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props, + size_t data_size, void * data, size_t num_deps, nanos_dependence_t *deps, + nanos_copy_data_t *copies, nanos_translate_args_t translate_args) { + + + int32* depsTypes = malloc(sizeof (int32) * num_deps); + size_t* depsSizes = malloc(sizeof (size_t) * num_deps); + void** depsAddrs = malloc(sizeof (void*)*num_deps); + + int i; + for (i = 0; i < num_deps; i++) { + depsAddrs[i] = deps[i].address; + depsTypes[i] = (deps[i].flags.output) ? WRITER : READER; + depsSizes[i] = deps[i].size; + } + + /* const_data is declared as: + * + * struct nanos_const_wd_definition_local_t + { + nanos_const_wd_definition_t base; + nanos_device_t devices[1]; + }; + * and devices[0].arg is the function to call + * so ugly pointer tricks to get it from there + */ + + nanos_device_t* dev = (nanos_device_t*) &const_data[1]; + + VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType)); + + taskType->fn = *((VSsTaskFnPtr*) dev[0].arg); + taskType->numDeps = num_deps; + taskType->depsTypes = depsTypes; + taskType->depsSizes = depsSizes; + taskType->sizeOfArgs = data_size; + + VSsSemReq reqData; + + reqData.reqType = submit_task; + + reqData.taskType = taskType; + reqData.args = data; + reqData.deps = depsAddrs; + reqData.callingSlv = currVP; + + reqData.taskID = NULL; + + VMS_WL__send_sem_request(&reqData, currVP); + + return NANOS_OK; +} + +void nanos_handle_error(nanos_err_t err) { + exit(err); +} + +nanos_err_t nanos_wg_wait_completion(nanos_wg_t wg, bool avoid_flush) { + VSsSemReq reqData; + + reqData.reqType = taskwait; + reqData.callingSlv = currVP; + + VMS_WL__send_sem_request(&reqData, currVP); + + return NANOS_OK; +} + +nanos_err_t nanos_wait_on(size_t num_deps, nanos_dependence_t *deps) { + VSsSemReq reqData; + + reqData.reqType = taskwait_on; + reqData.callingSlv = currVP; + + int i; + for (i = 0; i < num_deps; i++) { + reqData.args = deps[i].address; + VMS_WL__send_sem_request(&reqData, currVP); + } + + return NANOS_OK; +} + +nanos_err_t nanos_set_lock(nanos_lock_t *lock) { + VSsSemReq reqData; + + reqData.reqType = critical_start; + reqData.callingSlv = currVP; + + reqData.criticalID = lock; + + VMS_WL__send_sem_request(&reqData, currVP); + + return NANOS_OK; +} + +nanos_err_t nanos_unset_lock(nanos_lock_t *lock) { + VSsSemReq reqData; + + reqData.reqType = critical_end; + reqData.callingSlv = currVP; + + reqData.criticalID = lock; + + VMS_WL__send_sem_request(&reqData, currVP); + + return NANOS_OK; +} + +void * nanos_smp_factory( void *args){ + return NULL; +} + +void nanos_omp_set_interface ( void * arg){ + return; +} \ No newline at end of file