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