view 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
line source
1 #include <nanox/nanos.h>
3 #include "VSs.h"
5 /*nanos_submit
6 nanos_current_wd
7 nanos_create_wd_compact
8 nanos_handle_error
9 nanos_create_wd_and_run_compact
11 nanos_wg_wait_completion //taskwait
12 nanos_wait_on //taskwait on
13 nanos_set_lock //critical start
14 nanos_unset_lock //critical end
16 nanos_omp_set_interface
17 nanos_smp_factory*/
19 nanos_wd_t nanos_current_wd(void) {
20 return (nanos_wd_t) ((VSsSemData*) currVP->semanticData)->taskStub;
21 }
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,
24 size_t data_size, void ** data, nanos_wg_t wg, nanos_copy_data_t **copies) {
25 VSsTaskStub* ts = (VSsTaskStub*) malloc(sizeof (VSsTaskStub));
26 void* alloc_data = malloc(data_size);
27 *data = alloc_data;
28 ts->args = alloc_data;
30 nanos_device_t* dev = (nanos_device_t*) &const_data[1];
32 VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType));
34 taskType->fn = *((VSsTaskFnPtr*) dev[0].arg);
35 taskType->sizeOfArgs = data_size;
37 ts->taskType = taskType;
39 *wd = (nanos_wd_t) ts;
41 return NANOS_OK;
42 }
44 nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_deps, nanos_dependence_t *deps, nanos_team_t team) {
46 int32* depsTypes = malloc(sizeof (int32) * num_deps);
47 size_t* depsSizes = malloc(sizeof (size_t) * num_deps);
48 void** depsAddrs = malloc(sizeof (void*)*num_deps);
50 int i;
51 for (i = 0; i < num_deps; i++) {
52 depsAddrs[i] = deps[i].address;
53 depsTypes[i] = (deps[i].flags.output) ? WRITER : READER;
54 depsSizes[i] = deps[i].size;
55 }
57 VSsTaskStub* ts = (VSsTaskStub*) wd;
61 VSsTaskType* taskType = ts->taskType;
62 taskType->numDeps = num_deps;
63 taskType->depsTypes = depsTypes;
64 taskType->depsSizes = depsSizes;
67 VSsSemReq reqData;
69 reqData.reqType = submit_task;
71 reqData.taskType = taskType;
72 reqData.args = ts->args;
73 reqData.deps = depsAddrs;
74 reqData.callingSlv = currVP;
76 reqData.taskID = NULL;
78 free(ts);
80 VMS_WL__send_sem_request(&reqData, currVP);
82 return NANOS_OK;
83 }
85 nanos_err_t nanos_create_wd_and_run_compact(nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props,
86 size_t data_size, void * data, size_t num_deps, nanos_dependence_t *deps,
87 nanos_copy_data_t *copies, nanos_translate_args_t translate_args) {
90 int32* depsTypes = malloc(sizeof (int32) * num_deps);
91 size_t* depsSizes = malloc(sizeof (size_t) * num_deps);
92 void** depsAddrs = malloc(sizeof (void*)*num_deps);
94 int i;
95 for (i = 0; i < num_deps; i++) {
96 depsAddrs[i] = deps[i].address;
97 depsTypes[i] = (deps[i].flags.output) ? WRITER : READER;
98 depsSizes[i] = deps[i].size;
99 }
101 /* const_data is declared as:
102 *
103 * struct nanos_const_wd_definition_local_t
104 {
105 nanos_const_wd_definition_t base;
106 nanos_device_t devices[1];
107 };
108 * and devices[0].arg is the function to call
109 * so ugly pointer tricks to get it from there
110 */
112 nanos_device_t* dev = (nanos_device_t*) &const_data[1];
114 VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType));
116 taskType->fn = *((VSsTaskFnPtr*) dev[0].arg);
117 taskType->numDeps = num_deps;
118 taskType->depsTypes = depsTypes;
119 taskType->depsSizes = depsSizes;
120 taskType->sizeOfArgs = data_size;
122 VSsSemReq reqData;
124 reqData.reqType = submit_task;
126 reqData.taskType = taskType;
127 reqData.args = data;
128 reqData.deps = depsAddrs;
129 reqData.callingSlv = currVP;
131 reqData.taskID = NULL;
133 VMS_WL__send_sem_request(&reqData, currVP);
135 return NANOS_OK;
136 }
138 void nanos_handle_error(nanos_err_t err) {
139 exit(err);
140 }
142 nanos_err_t nanos_wg_wait_completion(nanos_wg_t wg, bool avoid_flush) {
143 VSsSemReq reqData;
145 reqData.reqType = taskwait;
146 reqData.callingSlv = currVP;
148 VMS_WL__send_sem_request(&reqData, currVP);
150 return NANOS_OK;
151 }
153 nanos_err_t nanos_wait_on(size_t num_deps, nanos_dependence_t *deps) {
154 VSsSemReq reqData;
156 reqData.reqType = taskwait_on;
157 reqData.callingSlv = currVP;
159 int i;
160 for (i = 0; i < num_deps; i++) {
161 reqData.args = deps[i].address;
162 VMS_WL__send_sem_request(&reqData, currVP);
163 }
165 return NANOS_OK;
166 }
168 nanos_err_t nanos_set_lock(nanos_lock_t *lock) {
169 VSsSemReq reqData;
171 reqData.reqType = critical_start;
172 reqData.callingSlv = currVP;
174 reqData.criticalID = lock;
176 VMS_WL__send_sem_request(&reqData, currVP);
178 return NANOS_OK;
179 }
181 nanos_err_t nanos_unset_lock(nanos_lock_t *lock) {
182 VSsSemReq reqData;
184 reqData.reqType = critical_end;
185 reqData.callingSlv = currVP;
187 reqData.criticalID = lock;
189 VMS_WL__send_sem_request(&reqData, currVP);
191 return NANOS_OK;
192 }
194 void * nanos_smp_factory( void *args){
195 return NULL;
196 }
198 void nanos_omp_set_interface ( void * arg){
199 return;