annotate nanos-vss.c @ 40:df464a215387

add implementations of (some) nanos api functions
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Mon, 03 Jun 2013 18:49:19 +0200
parents
children 37bb39da5ff1
rev   line source
nengel@40 1 #include <nanox/nanos.h>
nengel@40 2
nengel@40 3 #include "VSs.h"
nengel@40 4
nengel@40 5 /*nanos_submit
nengel@40 6 nanos_current_wd
nengel@40 7 nanos_create_wd_compact
nengel@40 8 nanos_handle_error
nengel@40 9 nanos_create_wd_and_run_compact
nengel@40 10
nengel@40 11 nanos_wg_wait_completion //taskwait
nengel@40 12 nanos_wait_on //taskwait on
nengel@40 13 nanos_set_lock //critical start
nengel@40 14 nanos_unset_lock //critical end
nengel@40 15
nengel@40 16 nanos_omp_set_interface
nengel@40 17 nanos_smp_factory*/
nengel@40 18
nengel@40 19 nanos_wd_t nanos_current_wd(void) {
nengel@40 20 return (nanos_wd_t) ((VSsSemData*) currVP->semanticData)->taskStub;
nengel@40 21 }
nengel@40 22
nengel@40 23 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,
nengel@40 24 size_t data_size, void ** data, nanos_wg_t wg, nanos_copy_data_t **copies) {
nengel@40 25 VSsTaskStub* ts = (VSsTaskStub*) malloc(sizeof (VSsTaskStub));
nengel@40 26 void* alloc_data = malloc(data_size);
nengel@40 27 *data = alloc_data;
nengel@40 28 ts->args = alloc_data;
nengel@40 29
nengel@40 30 nanos_device_t* dev = (nanos_device_t*) &const_data[1];
nengel@40 31
nengel@40 32 VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType));
nengel@40 33
nengel@40 34 taskType->fn = *((VSsTaskFnPtr*) dev[0].arg);
nengel@40 35 taskType->sizeOfArgs = data_size;
nengel@40 36
nengel@40 37 ts->taskType = taskType;
nengel@40 38
nengel@40 39 *wd = (nanos_wd_t) ts;
nengel@40 40
nengel@40 41 return NANOS_OK;
nengel@40 42 }
nengel@40 43
nengel@40 44 nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_deps, nanos_dependence_t *deps, nanos_team_t team) {
nengel@40 45
nengel@40 46 int32* depsTypes = malloc(sizeof (int32) * num_deps);
nengel@40 47 size_t* depsSizes = malloc(sizeof (size_t) * num_deps);
nengel@40 48 void** depsAddrs = malloc(sizeof (void*)*num_deps);
nengel@40 49
nengel@40 50 int i;
nengel@40 51 for (i = 0; i < num_deps; i++) {
nengel@40 52 depsAddrs[i] = deps[i].address;
nengel@40 53 depsTypes[i] = (deps[i].flags.output) ? WRITER : READER;
nengel@40 54 depsSizes[i] = deps[i].size;
nengel@40 55 }
nengel@40 56
nengel@40 57 VSsTaskStub* ts = (VSsTaskStub*) wd;
nengel@40 58
nengel@40 59
nengel@40 60
nengel@40 61 VSsTaskType* taskType = ts->taskType;
nengel@40 62 taskType->numDeps = num_deps;
nengel@40 63 taskType->depsTypes = depsTypes;
nengel@40 64 taskType->depsSizes = depsSizes;
nengel@40 65
nengel@40 66
nengel@40 67 VSsSemReq reqData;
nengel@40 68
nengel@40 69 reqData.reqType = submit_task;
nengel@40 70
nengel@40 71 reqData.taskType = taskType;
nengel@40 72 reqData.args = ts->args;
nengel@40 73 reqData.deps = depsAddrs;
nengel@40 74 reqData.callingSlv = currVP;
nengel@40 75
nengel@40 76 reqData.taskID = NULL;
nengel@40 77
nengel@40 78 free(ts);
nengel@40 79
nengel@40 80 VMS_WL__send_sem_request(&reqData, currVP);
nengel@40 81
nengel@40 82 return NANOS_OK;
nengel@40 83 }
nengel@40 84
nengel@40 85 nanos_err_t nanos_create_wd_and_run_compact(nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props,
nengel@40 86 size_t data_size, void * data, size_t num_deps, nanos_dependence_t *deps,
nengel@40 87 nanos_copy_data_t *copies, nanos_translate_args_t translate_args) {
nengel@40 88
nengel@40 89
nengel@40 90 int32* depsTypes = malloc(sizeof (int32) * num_deps);
nengel@40 91 size_t* depsSizes = malloc(sizeof (size_t) * num_deps);
nengel@40 92 void** depsAddrs = malloc(sizeof (void*)*num_deps);
nengel@40 93
nengel@40 94 int i;
nengel@40 95 for (i = 0; i < num_deps; i++) {
nengel@40 96 depsAddrs[i] = deps[i].address;
nengel@40 97 depsTypes[i] = (deps[i].flags.output) ? WRITER : READER;
nengel@40 98 depsSizes[i] = deps[i].size;
nengel@40 99 }
nengel@40 100
nengel@40 101 /* const_data is declared as:
nengel@40 102 *
nengel@40 103 * struct nanos_const_wd_definition_local_t
nengel@40 104 {
nengel@40 105 nanos_const_wd_definition_t base;
nengel@40 106 nanos_device_t devices[1];
nengel@40 107 };
nengel@40 108 * and devices[0].arg is the function to call
nengel@40 109 * so ugly pointer tricks to get it from there
nengel@40 110 */
nengel@40 111
nengel@40 112 nanos_device_t* dev = (nanos_device_t*) &const_data[1];
nengel@40 113
nengel@40 114 VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType));
nengel@40 115
nengel@40 116 taskType->fn = *((VSsTaskFnPtr*) dev[0].arg);
nengel@40 117 taskType->numDeps = num_deps;
nengel@40 118 taskType->depsTypes = depsTypes;
nengel@40 119 taskType->depsSizes = depsSizes;
nengel@40 120 taskType->sizeOfArgs = data_size;
nengel@40 121
nengel@40 122 VSsSemReq reqData;
nengel@40 123
nengel@40 124 reqData.reqType = submit_task;
nengel@40 125
nengel@40 126 reqData.taskType = taskType;
nengel@40 127 reqData.args = data;
nengel@40 128 reqData.deps = depsAddrs;
nengel@40 129 reqData.callingSlv = currVP;
nengel@40 130
nengel@40 131 reqData.taskID = NULL;
nengel@40 132
nengel@40 133 VMS_WL__send_sem_request(&reqData, currVP);
nengel@40 134
nengel@40 135 return NANOS_OK;
nengel@40 136 }
nengel@40 137
nengel@40 138 void nanos_handle_error(nanos_err_t err) {
nengel@40 139 exit(err);
nengel@40 140 }
nengel@40 141
nengel@40 142 nanos_err_t nanos_wg_wait_completion(nanos_wg_t wg, bool avoid_flush) {
nengel@40 143 VSsSemReq reqData;
nengel@40 144
nengel@40 145 reqData.reqType = taskwait;
nengel@40 146 reqData.callingSlv = currVP;
nengel@40 147
nengel@40 148 VMS_WL__send_sem_request(&reqData, currVP);
nengel@40 149
nengel@40 150 return NANOS_OK;
nengel@40 151 }
nengel@40 152
nengel@40 153 nanos_err_t nanos_wait_on(size_t num_deps, nanos_dependence_t *deps) {
nengel@40 154 VSsSemReq reqData;
nengel@40 155
nengel@40 156 reqData.reqType = taskwait_on;
nengel@40 157 reqData.callingSlv = currVP;
nengel@40 158
nengel@40 159 int i;
nengel@40 160 for (i = 0; i < num_deps; i++) {
nengel@40 161 reqData.args = deps[i].address;
nengel@40 162 VMS_WL__send_sem_request(&reqData, currVP);
nengel@40 163 }
nengel@40 164
nengel@40 165 return NANOS_OK;
nengel@40 166 }
nengel@40 167
nengel@40 168 nanos_err_t nanos_set_lock(nanos_lock_t *lock) {
nengel@40 169 VSsSemReq reqData;
nengel@40 170
nengel@40 171 reqData.reqType = critical_start;
nengel@40 172 reqData.callingSlv = currVP;
nengel@40 173
nengel@40 174 reqData.criticalID = lock;
nengel@40 175
nengel@40 176 VMS_WL__send_sem_request(&reqData, currVP);
nengel@40 177
nengel@40 178 return NANOS_OK;
nengel@40 179 }
nengel@40 180
nengel@40 181 nanos_err_t nanos_unset_lock(nanos_lock_t *lock) {
nengel@40 182 VSsSemReq reqData;
nengel@40 183
nengel@40 184 reqData.reqType = critical_end;
nengel@40 185 reqData.callingSlv = currVP;
nengel@40 186
nengel@40 187 reqData.criticalID = lock;
nengel@40 188
nengel@40 189 VMS_WL__send_sem_request(&reqData, currVP);
nengel@40 190
nengel@40 191 return NANOS_OK;
nengel@40 192 }
nengel@40 193
nengel@40 194 void * nanos_smp_factory( void *args){
nengel@40 195 return NULL;
nengel@40 196 }
nengel@40 197
nengel@40 198 void nanos_omp_set_interface ( void * arg){
nengel@40 199 return;
nengel@40 200 }