Mercurial > cgi-bin > hgwebdir.cgi > VMS > VMS_Implementations > VSs_impls > VSs__MC_shared_impl
changeset 40:df464a215387 dev_expl_VP_and_DKU
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 | 0715109abb08 |
| children | 37bb39da5ff1 |
| files | nanos-vss.c |
| diffstat | 1 files changed, 200 insertions(+), 0 deletions(-) [+] |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/nanos-vss.c Mon Jun 03 18:49:19 2013 +0200 1.3 @@ -0,0 +1,200 @@ 1.4 +#include <nanox/nanos.h> 1.5 + 1.6 +#include "VSs.h" 1.7 + 1.8 +/*nanos_submit 1.9 +nanos_current_wd 1.10 +nanos_create_wd_compact 1.11 +nanos_handle_error 1.12 +nanos_create_wd_and_run_compact 1.13 + 1.14 +nanos_wg_wait_completion //taskwait 1.15 +nanos_wait_on //taskwait on 1.16 +nanos_set_lock //critical start 1.17 +nanos_unset_lock //critical end 1.18 + 1.19 +nanos_omp_set_interface 1.20 +nanos_smp_factory*/ 1.21 + 1.22 +nanos_wd_t nanos_current_wd(void) { 1.23 + return (nanos_wd_t) ((VSsSemData*) currVP->semanticData)->taskStub; 1.24 +} 1.25 + 1.26 +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, 1.27 + size_t data_size, void ** data, nanos_wg_t wg, nanos_copy_data_t **copies) { 1.28 + VSsTaskStub* ts = (VSsTaskStub*) malloc(sizeof (VSsTaskStub)); 1.29 + void* alloc_data = malloc(data_size); 1.30 + *data = alloc_data; 1.31 + ts->args = alloc_data; 1.32 + 1.33 + nanos_device_t* dev = (nanos_device_t*) &const_data[1]; 1.34 + 1.35 + VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType)); 1.36 + 1.37 + taskType->fn = *((VSsTaskFnPtr*) dev[0].arg); 1.38 + taskType->sizeOfArgs = data_size; 1.39 + 1.40 + ts->taskType = taskType; 1.41 + 1.42 + *wd = (nanos_wd_t) ts; 1.43 + 1.44 + return NANOS_OK; 1.45 +} 1.46 + 1.47 +nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_deps, nanos_dependence_t *deps, nanos_team_t team) { 1.48 + 1.49 + int32* depsTypes = malloc(sizeof (int32) * num_deps); 1.50 + size_t* depsSizes = malloc(sizeof (size_t) * num_deps); 1.51 + void** depsAddrs = malloc(sizeof (void*)*num_deps); 1.52 + 1.53 + int i; 1.54 + for (i = 0; i < num_deps; i++) { 1.55 + depsAddrs[i] = deps[i].address; 1.56 + depsTypes[i] = (deps[i].flags.output) ? WRITER : READER; 1.57 + depsSizes[i] = deps[i].size; 1.58 + } 1.59 + 1.60 + VSsTaskStub* ts = (VSsTaskStub*) wd; 1.61 + 1.62 + 1.63 + 1.64 + VSsTaskType* taskType = ts->taskType; 1.65 + taskType->numDeps = num_deps; 1.66 + taskType->depsTypes = depsTypes; 1.67 + taskType->depsSizes = depsSizes; 1.68 + 1.69 + 1.70 + VSsSemReq reqData; 1.71 + 1.72 + reqData.reqType = submit_task; 1.73 + 1.74 + reqData.taskType = taskType; 1.75 + reqData.args = ts->args; 1.76 + reqData.deps = depsAddrs; 1.77 + reqData.callingSlv = currVP; 1.78 + 1.79 + reqData.taskID = NULL; 1.80 + 1.81 + free(ts); 1.82 + 1.83 + VMS_WL__send_sem_request(&reqData, currVP); 1.84 + 1.85 + return NANOS_OK; 1.86 +} 1.87 + 1.88 +nanos_err_t nanos_create_wd_and_run_compact(nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props, 1.89 + size_t data_size, void * data, size_t num_deps, nanos_dependence_t *deps, 1.90 + nanos_copy_data_t *copies, nanos_translate_args_t translate_args) { 1.91 + 1.92 + 1.93 + int32* depsTypes = malloc(sizeof (int32) * num_deps); 1.94 + size_t* depsSizes = malloc(sizeof (size_t) * num_deps); 1.95 + void** depsAddrs = malloc(sizeof (void*)*num_deps); 1.96 + 1.97 + int i; 1.98 + for (i = 0; i < num_deps; i++) { 1.99 + depsAddrs[i] = deps[i].address; 1.100 + depsTypes[i] = (deps[i].flags.output) ? WRITER : READER; 1.101 + depsSizes[i] = deps[i].size; 1.102 + } 1.103 + 1.104 + /* const_data is declared as: 1.105 + * 1.106 + * struct nanos_const_wd_definition_local_t 1.107 + { 1.108 + nanos_const_wd_definition_t base; 1.109 + nanos_device_t devices[1]; 1.110 + }; 1.111 + * and devices[0].arg is the function to call 1.112 + * so ugly pointer tricks to get it from there 1.113 + */ 1.114 + 1.115 + nanos_device_t* dev = (nanos_device_t*) &const_data[1]; 1.116 + 1.117 + VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType)); 1.118 + 1.119 + taskType->fn = *((VSsTaskFnPtr*) dev[0].arg); 1.120 + taskType->numDeps = num_deps; 1.121 + taskType->depsTypes = depsTypes; 1.122 + taskType->depsSizes = depsSizes; 1.123 + taskType->sizeOfArgs = data_size; 1.124 + 1.125 + VSsSemReq reqData; 1.126 + 1.127 + reqData.reqType = submit_task; 1.128 + 1.129 + reqData.taskType = taskType; 1.130 + reqData.args = data; 1.131 + reqData.deps = depsAddrs; 1.132 + reqData.callingSlv = currVP; 1.133 + 1.134 + reqData.taskID = NULL; 1.135 + 1.136 + VMS_WL__send_sem_request(&reqData, currVP); 1.137 + 1.138 + return NANOS_OK; 1.139 +} 1.140 + 1.141 +void nanos_handle_error(nanos_err_t err) { 1.142 + exit(err); 1.143 +} 1.144 + 1.145 +nanos_err_t nanos_wg_wait_completion(nanos_wg_t wg, bool avoid_flush) { 1.146 + VSsSemReq reqData; 1.147 + 1.148 + reqData.reqType = taskwait; 1.149 + reqData.callingSlv = currVP; 1.150 + 1.151 + VMS_WL__send_sem_request(&reqData, currVP); 1.152 + 1.153 + return NANOS_OK; 1.154 +} 1.155 + 1.156 +nanos_err_t nanos_wait_on(size_t num_deps, nanos_dependence_t *deps) { 1.157 + VSsSemReq reqData; 1.158 + 1.159 + reqData.reqType = taskwait_on; 1.160 + reqData.callingSlv = currVP; 1.161 + 1.162 + int i; 1.163 + for (i = 0; i < num_deps; i++) { 1.164 + reqData.args = deps[i].address; 1.165 + VMS_WL__send_sem_request(&reqData, currVP); 1.166 + } 1.167 + 1.168 + return NANOS_OK; 1.169 +} 1.170 + 1.171 +nanos_err_t nanos_set_lock(nanos_lock_t *lock) { 1.172 + VSsSemReq reqData; 1.173 + 1.174 + reqData.reqType = critical_start; 1.175 + reqData.callingSlv = currVP; 1.176 + 1.177 + reqData.criticalID = lock; 1.178 + 1.179 + VMS_WL__send_sem_request(&reqData, currVP); 1.180 + 1.181 + return NANOS_OK; 1.182 +} 1.183 + 1.184 +nanos_err_t nanos_unset_lock(nanos_lock_t *lock) { 1.185 + VSsSemReq reqData; 1.186 + 1.187 + reqData.reqType = critical_end; 1.188 + reqData.callingSlv = currVP; 1.189 + 1.190 + reqData.criticalID = lock; 1.191 + 1.192 + VMS_WL__send_sem_request(&reqData, currVP); 1.193 + 1.194 + return NANOS_OK; 1.195 +} 1.196 + 1.197 +void * nanos_smp_factory( void *args){ 1.198 + return NULL; 1.199 +} 1.200 + 1.201 +void nanos_omp_set_interface ( void * arg){ 1.202 + return; 1.203 +} 1.204 \ No newline at end of file
