From: shenshei Date: Fri, 30 Nov 2012 14:07:38 +0000 (+0100) Subject: New simcalls work X-Git-Tag: v3_9_rc1~86^2~237^2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/09a5e38f227f42cf1567a9ead8ed528a13fd35b1 New simcalls work --- diff --git a/src/mc/mc_request.c b/src/mc/mc_request.c index 332e85764d..a80b869e77 100644 --- a/src/mc/mc_request.c +++ b/src/mc/mc_request.c @@ -27,36 +27,36 @@ int MC_request_depend(smx_simcall_t r1, smx_simcall_t r2) { if( (r1->call == SIMCALL_COMM_ISEND || r1->call == SIMCALL_COMM_IRECV) && r2->call == SIMCALL_COMM_WAIT){ - if(r2->comm_wait.comm->comm.rdv == NULL) + if(simcall_comm_wait__get__comm(r2)->comm.rdv == NULL) return FALSE; - smx_rdv_t rdv = r1->call == SIMCALL_COMM_ISEND ? r1->comm_isend.rdv : r1->comm_irecv.rdv; + smx_rdv_t rdv = r1->call == SIMCALL_COMM_ISEND ? simcall_comm_isend__get__rdv(r1) : simcall_comm_irecv__get__rdv(r1); - if(r2->comm_wait.comm->comm.rdv != rdv) + if(simcall_comm_wait__get__comm(r2)->comm.rdv != rdv) return FALSE; - if(r2->comm_wait.comm->comm.type == SIMIX_COMM_SEND && r1->call == SIMCALL_COMM_ISEND) + if(simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_SEND && r1->call == SIMCALL_COMM_ISEND) return FALSE; - if(r2->comm_wait.comm->comm.type == SIMIX_COMM_RECEIVE && r1->call == SIMCALL_COMM_IRECV) + if(simcall_comm_wait__get__comm(r2)->comm.type == SIMIX_COMM_RECEIVE && r1->call == SIMCALL_COMM_IRECV) return FALSE; } if( (r2->call == SIMCALL_COMM_ISEND || r2->call == SIMCALL_COMM_IRECV) && r1->call == SIMCALL_COMM_WAIT){ - if(r1->comm_wait.comm->comm.rdv != NULL) + if(simcall_comm_wait__get__comm(r1)->comm.rdv != NULL) return FALSE; - smx_rdv_t rdv = r2->call == SIMCALL_COMM_ISEND ? r2->comm_isend.rdv : r2->comm_irecv.rdv; + smx_rdv_t rdv = r2->call == SIMCALL_COMM_ISEND ? simcall_comm_isend__get__rdv(r2) : simcall_comm_irecv__get__rdv(r2); - if(r1->comm_wait.comm->comm.rdv != rdv) + if(simcall_comm_wait__get__comm(r1)->comm.rdv != rdv) return FALSE; - if(r1->comm_wait.comm->comm.type == SIMIX_COMM_SEND && r2->call == SIMCALL_COMM_ISEND) + if(simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_SEND && r2->call == SIMCALL_COMM_ISEND) return FALSE; - if(r1->comm_wait.comm->comm.type == SIMIX_COMM_RECEIVE && r2->call == SIMCALL_COMM_IRECV) + if(simcall_comm_wait__get__comm(r1)->comm.type == SIMIX_COMM_RECEIVE && r2->call == SIMCALL_COMM_IRECV) return FALSE; } @@ -75,78 +75,78 @@ int MC_request_depend(smx_simcall_t r1, smx_simcall_t r2) { return FALSE;*/ if(r1->call == SIMCALL_COMM_ISEND && r2->call == SIMCALL_COMM_ISEND - && r1->comm_isend.rdv != r2->comm_isend.rdv) + && simcall_comm_isend__get__rdv(r1) != simcall_comm_isend__get__rdv(r2)) return FALSE; if(r1->call == SIMCALL_COMM_IRECV && r2->call == SIMCALL_COMM_IRECV - && r1->comm_irecv.rdv != r2->comm_irecv.rdv) + && simcall_comm_irecv__get__rdv(r1) != simcall_comm_irecv__get__rdv(r2)) return FALSE; if(r1->call == SIMCALL_COMM_WAIT && (r2->call == SIMCALL_COMM_WAIT || r2->call == SIMCALL_COMM_TEST) - && (r1->comm_wait.comm->comm.src_proc == NULL - || r1->comm_wait.comm->comm.dst_proc == NULL)) + && (simcall_comm_wait__get__comm(r1)->comm.src_proc == NULL + || simcall_comm_wait__get__comm(r1)->comm.dst_proc == NULL)) return FALSE; if(r2->call == SIMCALL_COMM_WAIT && (r1->call == SIMCALL_COMM_WAIT || r1->call == SIMCALL_COMM_TEST) - && (r2->comm_wait.comm->comm.src_proc == NULL - || r2->comm_wait.comm->comm.dst_proc == NULL)) + && (simcall_comm_wait__get__comm(r2)->comm.src_proc == NULL + || simcall_comm_wait__get__comm(r2)->comm.dst_proc == NULL)) return FALSE; if(r1->call == SIMCALL_COMM_WAIT && r2->call == SIMCALL_COMM_WAIT - && r1->comm_wait.comm->comm.src_buff == r2->comm_wait.comm->comm.src_buff - && r1->comm_wait.comm->comm.dst_buff == r2->comm_wait.comm->comm.dst_buff) + && simcall_comm_wait__get__comm(r1)->comm.src_buff == simcall_comm_wait__get__comm(r2)->comm.src_buff + && simcall_comm_wait__get__comm(r1)->comm.dst_buff == simcall_comm_wait__get__comm(r2)->comm.dst_buff) return FALSE; if (r1->call == SIMCALL_COMM_WAIT && r2->call == SIMCALL_COMM_WAIT - && r1->comm_wait.comm->comm.src_buff != NULL - && r1->comm_wait.comm->comm.dst_buff != NULL - && r2->comm_wait.comm->comm.src_buff != NULL - && r2->comm_wait.comm->comm.dst_buff != NULL - && r1->comm_wait.comm->comm.dst_buff != r2->comm_wait.comm->comm.src_buff - && r1->comm_wait.comm->comm.dst_buff != r2->comm_wait.comm->comm.dst_buff - && r2->comm_wait.comm->comm.dst_buff != r1->comm_wait.comm->comm.src_buff) + && simcall_comm_wait__get__comm(r1)->comm.src_buff != NULL + && simcall_comm_wait__get__comm(r1)->comm.dst_buff != NULL + && simcall_comm_wait__get__comm(r2)->comm.src_buff != NULL + && simcall_comm_wait__get__comm(r2)->comm.dst_buff != NULL + && simcall_comm_wait__get__comm(r1)->comm.dst_buff != simcall_comm_wait__get__comm(r2)->comm.src_buff + && simcall_comm_wait__get__comm(r1)->comm.dst_buff != simcall_comm_wait__get__comm(r2)->comm.dst_buff + && simcall_comm_wait__get__comm(r2)->comm.dst_buff != simcall_comm_wait__get__comm(r1)->comm.src_buff) return FALSE; if(r1->call == SIMCALL_COMM_TEST && - (r1->comm_test.comm == NULL - || r1->comm_test.comm->comm.src_buff == NULL - || r1->comm_test.comm->comm.dst_buff == NULL)) + (simcall_comm_test__get__comm(r1) == NULL + || simcall_comm_test__get__comm(r1)->comm.src_buff == NULL + || simcall_comm_test__get__comm(r1)->comm.dst_buff == NULL)) return FALSE; if(r2->call == SIMCALL_COMM_TEST && - (r2->comm_test.comm == NULL - || r2->comm_test.comm->comm.src_buff == NULL - || r2->comm_test.comm->comm.dst_buff == NULL)) + (simcall_comm_test__get__comm(r2) == NULL + || simcall_comm_test__get__comm(r2)->comm.src_buff == NULL + || simcall_comm_test__get__comm(r2)->comm.dst_buff == NULL)) return FALSE; if(r1->call == SIMCALL_COMM_TEST && r2->call == SIMCALL_COMM_WAIT - && r1->comm_test.comm->comm.src_buff == r2->comm_wait.comm->comm.src_buff - && r1->comm_test.comm->comm.dst_buff == r2->comm_wait.comm->comm.dst_buff) + && simcall_comm_test__get__comm(r1)->comm.src_buff == simcall_comm_wait__get__comm(r2)->comm.src_buff + && simcall_comm_test__get__comm(r1)->comm.dst_buff == simcall_comm_wait__get__comm(r2)->comm.dst_buff) return FALSE; if(r1->call == SIMCALL_COMM_WAIT && r2->call == SIMCALL_COMM_TEST - && r1->comm_wait.comm->comm.src_buff == r2->comm_test.comm->comm.src_buff - && r1->comm_wait.comm->comm.dst_buff == r2->comm_test.comm->comm.dst_buff) + && simcall_comm_wait__get__comm(r1)->comm.src_buff == simcall_comm_test__get__comm(r2)->comm.src_buff + && simcall_comm_wait__get__comm(r1)->comm.dst_buff == simcall_comm_test__get__comm(r2)->comm.dst_buff) return FALSE; if (r1->call == SIMCALL_COMM_WAIT && r2->call == SIMCALL_COMM_TEST - && r1->comm_wait.comm->comm.src_buff != NULL - && r1->comm_wait.comm->comm.dst_buff != NULL - && r2->comm_test.comm->comm.src_buff != NULL - && r2->comm_test.comm->comm.dst_buff != NULL - && r1->comm_wait.comm->comm.dst_buff != r2->comm_test.comm->comm.src_buff - && r1->comm_wait.comm->comm.dst_buff != r2->comm_test.comm->comm.dst_buff - && r2->comm_test.comm->comm.dst_buff != r1->comm_wait.comm->comm.src_buff) + && simcall_comm_wait__get__comm(r1)->comm.src_buff != NULL + && simcall_comm_wait__get__comm(r1)->comm.dst_buff != NULL + && simcall_comm_test__get__comm(r2)->comm.src_buff != NULL + && simcall_comm_test__get__comm(r2)->comm.dst_buff != NULL + && simcall_comm_wait__get__comm(r1)->comm.dst_buff != simcall_comm_test__get__comm(r2)->comm.src_buff + && simcall_comm_wait__get__comm(r1)->comm.dst_buff != simcall_comm_test__get__comm(r2)->comm.dst_buff + && simcall_comm_test__get__comm(r2)->comm.dst_buff != simcall_comm_wait__get__comm(r1)->comm.src_buff) return FALSE; if (r1->call == SIMCALL_COMM_TEST && r2->call == SIMCALL_COMM_WAIT - && r1->comm_test.comm->comm.src_buff != NULL - && r1->comm_test.comm->comm.dst_buff != NULL - && r2->comm_wait.comm->comm.src_buff != NULL - && r2->comm_wait.comm->comm.dst_buff != NULL - && r1->comm_test.comm->comm.dst_buff != r2->comm_wait.comm->comm.src_buff - && r1->comm_test.comm->comm.dst_buff != r2->comm_wait.comm->comm.dst_buff - && r2->comm_wait.comm->comm.dst_buff != r1->comm_test.comm->comm.src_buff) + && simcall_comm_test__get__comm(r1)->comm.src_buff != NULL + && simcall_comm_test__get__comm(r1)->comm.dst_buff != NULL + && simcall_comm_wait__get__comm(r2)->comm.src_buff != NULL + && simcall_comm_wait__get__comm(r2)->comm.dst_buff != NULL + && simcall_comm_test__get__comm(r1)->comm.dst_buff != simcall_comm_wait__get__comm(r2)->comm.src_buff + && simcall_comm_test__get__comm(r1)->comm.dst_buff != simcall_comm_wait__get__comm(r2)->comm.dst_buff + && simcall_comm_wait__get__comm(r2)->comm.dst_buff != simcall_comm_test__get__comm(r1)->comm.src_buff) return FALSE; @@ -179,19 +179,19 @@ char *MC_request_to_string(smx_simcall_t req, int value) switch(req->call){ case SIMCALL_COMM_ISEND: type = xbt_strdup("iSend"); - p = pointer_to_string(req->comm_isend.src_buff); - bs = buff_size_to_string(req->comm_isend.src_buff_size); + p = pointer_to_string(simcall_comm_isend__get__src_buff(req)); + bs = buff_size_to_string(simcall_comm_isend__get__src_buff_size(req)); args = bprintf("src=%s, buff=%s, size=%s", req->issuer->name, p, bs); break; case SIMCALL_COMM_IRECV: - size = req->comm_irecv.dst_buff_size ? *req->comm_irecv.dst_buff_size : 0; + size = simcall_comm_irecv__get__dst_buff_size(req) ? *simcall_comm_irecv__get__dst_buff_size(req) : 0; type = xbt_strdup("iRecv"); - p = pointer_to_string(req->comm_irecv.dst_buff); + p = pointer_to_string(simcall_comm_irecv__get__dst_buff(req)); bs = buff_size_to_string(size); args = bprintf("dst=%s, buff=%s, size=%s", req->issuer->name, p, bs); break; case SIMCALL_COMM_WAIT: - act = req->comm_wait.comm; + act = simcall_comm_wait__get__comm(req); if(value == -1){ type = xbt_strdup("WaitTimeout"); p = pointer_to_string(act); @@ -207,7 +207,7 @@ char *MC_request_to_string(smx_simcall_t req, int value) } break; case SIMCALL_COMM_TEST: - act = req->comm_test.comm; + act = simcall_comm_test__get__comm(req); if(act->comm.src_proc == NULL || act->comm.dst_proc == NULL){ type = xbt_strdup("Test FALSE"); p = pointer_to_string(act); @@ -223,9 +223,9 @@ char *MC_request_to_string(smx_simcall_t req, int value) case SIMCALL_COMM_WAITANY: type = xbt_strdup("WaitAny"); - p = pointer_to_string(xbt_dynar_get_as(req->comm_waitany.comms, value, smx_action_t)); + p = pointer_to_string(xbt_dynar_get_as(simcall_comm_waitany__get__comms(req), value, smx_action_t)); args = bprintf("comm=%s (%d of %lu)", p, - value+1, xbt_dynar_length(req->comm_waitany.comms)); + value+1, xbt_dynar_length(simcall_comm_waitany__get__comms(req))); break; case SIMCALL_COMM_TESTANY: @@ -234,7 +234,7 @@ char *MC_request_to_string(smx_simcall_t req, int value) args = xbt_strdup("-"); }else{ type = xbt_strdup("TestAny"); - args = bprintf("(%d of %lu)", value+1, xbt_dynar_length(req->comm_testany.comms)); + args = bprintf("(%d of %lu)", value+1, xbt_dynar_length(simcall_comm_testany__get__comms(req))); } break; @@ -265,7 +265,7 @@ unsigned int MC_request_testany_fail(smx_simcall_t req) unsigned int cursor; smx_action_t action; - xbt_dynar_foreach(req->comm_testany.comms, cursor, action){ + xbt_dynar_foreach(simcall_comm_testany__get__comms(req), cursor, action){ if(action->comm.src_proc && action->comm.dst_proc) return FALSE; } @@ -298,22 +298,22 @@ int MC_request_is_enabled(smx_simcall_t req) /* If it has a timeout it will be always be enabled, because even if the * communication is not ready, it can timeout and won't block. * On the other hand if it hasn't a timeout, check if the comm is ready.*/ - if(req->comm_wait.timeout >= 0){ + if(simcall_comm_wait__get__timeout(req) >= 0){ if(_surf_mc_timeout == 1){ return TRUE; }else{ - act = req->comm_wait.comm; + act = simcall_comm_wait__get__comm(req); return (act->comm.src_proc && act->comm.dst_proc); } }else{ - act = req->comm_wait.comm; + act = simcall_comm_wait__get__comm(req); return (act->comm.src_proc && act->comm.dst_proc); } break; case SIMCALL_COMM_WAITANY: /* Check if it has at least one communication ready */ - xbt_dynar_foreach(req->comm_waitany.comms, index, act) { + xbt_dynar_foreach(simcall_comm_waitany__get__comms(req), index, act) { if (act->comm.src_proc && act->comm.dst_proc){ return TRUE; } @@ -335,17 +335,17 @@ int MC_request_is_enabled_by_idx(smx_simcall_t req, unsigned int idx) case SIMCALL_COMM_WAIT: /* FIXME: check also that src and dst processes are not suspended */ - act = req->comm_wait.comm; + act = simcall_comm_wait__get__comm(req); return (act->comm.src_proc && act->comm.dst_proc); break; case SIMCALL_COMM_WAITANY: - act = xbt_dynar_get_as(req->comm_waitany.comms, idx, smx_action_t); + act = xbt_dynar_get_as(simcall_comm_waitany__get__comms(req), idx, smx_action_t); return (act->comm.src_proc && act->comm.dst_proc); break; case SIMCALL_COMM_TESTANY: - act = xbt_dynar_get_as(req->comm_testany.comms, idx, smx_action_t); + act = xbt_dynar_get_as(simcall_comm_testany__get__comms(req), idx, smx_action_t); return (act->comm.src_proc && act->comm.dst_proc); break; diff --git a/src/mc/mc_state.c b/src/mc/mc_state.c index 39eef8ad70..7faf1f1260 100644 --- a/src/mc/mc_state.c +++ b/src/mc/mc_state.c @@ -85,9 +85,9 @@ void MC_state_set_executed_request(mc_state_t state, smx_simcall_t req, int valu case SIMCALL_COMM_WAITANY: state->internal_req.call = SIMCALL_COMM_WAIT; state->internal_req.issuer = req->issuer; - state->internal_comm = *xbt_dynar_get_as(req->comm_waitany.comms, value, smx_action_t); - state->internal_req.comm_wait.comm = &state->internal_comm; - state->internal_req.comm_wait.timeout = 0; + state->internal_comm = *xbt_dynar_get_as(simcall_comm_waitany__get__comms(req), value, smx_action_t); + simcall_comm_wait__set__comm(&state->internal_req, &state->internal_comm); + simcall_comm_wait__set__timeout(&state->internal_req, 0); break; case SIMCALL_COMM_TESTANY: @@ -95,24 +95,24 @@ void MC_state_set_executed_request(mc_state_t state, smx_simcall_t req, int valu state->internal_req.issuer = req->issuer; if(value > 0) - state->internal_comm = *xbt_dynar_get_as(req->comm_testany.comms, value, smx_action_t); + state->internal_comm = *xbt_dynar_get_as(simcall_comm_testany__get__comms(req), value, smx_action_t); - state->internal_req.comm_wait.comm = &state->internal_comm; - state->internal_req.comm_test.result = value; + simcall_comm_test__set__comm(&state->internal_req, &state->internal_comm); + simcall_comm_test__set__result(&state->internal_req, value); break; case SIMCALL_COMM_WAIT: state->internal_req = *req; - state->internal_comm = *(req->comm_wait.comm); - state->executed_req.comm_wait.comm = &state->internal_comm; - state->internal_req.comm_wait.comm = &state->internal_comm; + state->internal_comm = *(simcall_comm_wait__get__comm(req)); + simcall_comm_wait__set__comm(&state->executed_req, &state->internal_comm); + simcall_comm_wait__set__comm(&state->internal_req, &state->internal_comm); break; case SIMCALL_COMM_TEST: state->internal_req = *req; - state->internal_comm = *req->comm_test.comm; - state->executed_req.comm_test.comm = &state->internal_comm; - state->internal_req.comm_test.comm = &state->internal_comm; + state->internal_comm = *simcall_comm_test__get__comm(req); + simcall_comm_test__set__comm(&state->executed_req, &state->internal_comm); + simcall_comm_test__set__comm(&state->internal_req, &state->internal_comm); break; default: @@ -146,14 +146,14 @@ smx_simcall_t MC_state_get_request(mc_state_t state, int *value) switch(process->simcall.call){ case SIMCALL_COMM_WAITANY: *value = -1; - while(procstate->interleave_count < xbt_dynar_length(process->simcall.comm_waitany.comms)){ + while(procstate->interleave_count < xbt_dynar_length(simcall_comm_waitany__get__comms(&process->simcall))){ if(MC_request_is_enabled_by_idx(&process->simcall, procstate->interleave_count++)){ *value = procstate->interleave_count-1; break; } } - if(procstate->interleave_count >= xbt_dynar_length(process->simcall.comm_waitany.comms)) + if(procstate->interleave_count >= xbt_dynar_length(simcall_comm_waitany__get__comms(&process->simcall))) procstate->state = MC_DONE; if(*value != -1) @@ -164,14 +164,14 @@ smx_simcall_t MC_state_get_request(mc_state_t state, int *value) case SIMCALL_COMM_TESTANY: start_count = procstate->interleave_count; *value = -1; - while(procstate->interleave_count < xbt_dynar_length(process->simcall.comm_testany.comms)){ + while(procstate->interleave_count < xbt_dynar_length(simcall_comm_testany__get__comms(&process->simcall))){ if(MC_request_is_enabled_by_idx(&process->simcall, procstate->interleave_count++)){ *value = procstate->interleave_count - 1; break; } } - if(procstate->interleave_count >= xbt_dynar_length(process->simcall.comm_testany.comms)) + if(procstate->interleave_count >= xbt_dynar_length(simcall_comm_testany__get__comms(&process->simcall))) procstate->state = MC_DONE; if(*value != -1 || start_count == 0) @@ -180,8 +180,8 @@ smx_simcall_t MC_state_get_request(mc_state_t state, int *value) break; case SIMCALL_COMM_WAIT: - if(process->simcall.comm_wait.comm->comm.src_proc - && process->simcall.comm_wait.comm->comm.dst_proc){ + if(simcall_comm_wait__get__comm(&process->simcall)->comm.src_proc + && simcall_comm_wait__get__comm(&process->simcall)->comm.dst_proc){ *value = 0; }else{ *value = -1; diff --git a/src/msg/msg_host.c b/src/msg/msg_host.c index 6d9f463481..a503903cb5 100644 --- a/src/msg/msg_host.c +++ b/src/msg/msg_host.c @@ -28,7 +28,7 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(msg); /********************************* Host **************************************/ msg_host_t __MSG_host_create(smx_host_t workstation) { - const char *name = simcall_host_get_name(workstation); + const char *name = SIMIX_host_get_name(workstation); msg_host_t host = xbt_new0(s_msg_host_t, 1); s_msg_vm_t vm; // simply to compute the offset @@ -77,7 +77,7 @@ msg_host_t MSG_get_host_by_name(const char *name) */ msg_error_t MSG_host_set_data(msg_host_t host, void *data) { - simcall_host_set_data(host->smx_host,data); + SIMIX_host_set_data(host->smx_host,data); return MSG_OK; } @@ -91,7 +91,7 @@ msg_error_t MSG_host_set_data(msg_host_t host, void *data) */ void *MSG_host_get_data(msg_host_t host) { - return simcall_host_get_data(host->smx_host); + return SIMIX_host_get_data(host->smx_host); } /** \ingroup m_host_management @@ -102,7 +102,7 @@ void *MSG_host_get_data(msg_host_t host) its name. */ const char *MSG_host_get_name(msg_host_t host) { - return simcall_host_get_name(host->smx_host); + return SIMIX_host_get_name(host->smx_host); } /** \ingroup m_host_management diff --git a/src/simix/smx_global.c b/src/simix/smx_global.c index b82be914fe..3cdbdc06ad 100644 --- a/src/simix/smx_global.c +++ b/src/simix/smx_global.c @@ -24,6 +24,9 @@ static void SIMIX_action_mallocator_reset_f(void* action); static void SIMIX_clean(void); +SIMCALL_LIST(SIMCALL_RES_GETSET, SIMCALL_SEP_NOTHING) +SIMCALL_LIST(SIMCALL_ARG_GETSET, SIMCALL_SEP_NOTHING) + /* FIXME: Yeah, I'll do it in a portable maner one day [Mt] */ #include diff --git a/src/simix/smx_host.c b/src/simix/smx_host.c index f3767bfce9..f0b1e0d6b0 100644 --- a/src/simix/smx_host.c +++ b/src/simix/smx_host.c @@ -505,7 +505,7 @@ void SIMIX_execution_finish(smx_action_t action) } simcall->issuer->waiting_action = NULL; - simcall->host_execution_wait.result = action->state; + simcall_host_execution_wait__set__result(simcall, action->state); SIMIX_simcall_answer(simcall); } diff --git a/src/simix/smx_io.c b/src/simix/smx_io.c index 9251bd38b0..383510b531 100644 --- a/src/simix/smx_io.c +++ b/src/simix/smx_io.c @@ -162,9 +162,9 @@ smx_action_t SIMIX_file_close(smx_process_t process, smx_file_t fp) } //SIMIX FILE STAT -void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t buf) +void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t *buf) { - smx_action_t action = SIMIX_file_stat(simcall->issuer, fd, buf); + smx_action_t action = SIMIX_file_stat(simcall->issuer, fd, *buf); xbt_fifo_push(action->simcalls, simcall); simcall->issuer->waiting_action = action; } @@ -235,8 +235,7 @@ smx_action_t SIMIX_file_unlink(smx_process_t process, smx_file_t fd) void SIMIX_pre_file_ls(smx_simcall_t simcall, const char* mount, const char* path) { - smx_action_t action = SIMIX_file_ls(simcall->issuer, - simcall->file_ls.mount, simcall->file_ls.path); + smx_action_t action = SIMIX_file_ls(simcall->issuer, mount, path); xbt_fifo_push(action->simcalls, simcall); simcall->issuer->waiting_action = action; } @@ -290,32 +289,32 @@ void SIMIX_post_io(smx_action_t action) case SIMCALL_FILE_OPEN:; smx_file_t tmp = xbt_new(s_smx_file_t,1); tmp->surf_file = (action->io.surf_io)->file; - simcall->result.p = tmp; + simcall_file_open__set__result(simcall, tmp); break; case SIMCALL_FILE_CLOSE: - xbt_free(simcall->file_close.fp); - simcall->result.i = 0; + xbt_free(simcall_file_close__get__fp(simcall)); + simcall_file_close__set__result(simcall, 0); break; case SIMCALL_FILE_WRITE: - simcall->result.si = (action->io.surf_io)->cost; + simcall_file_write__set__result(simcall, (action->io.surf_io)->cost); break; case SIMCALL_FILE_READ: - simcall->result.d = (action->io.surf_io)->cost; + simcall_file_read__set__result(simcall, (action->io.surf_io)->cost); break; case SIMCALL_FILE_STAT: - simcall->result.i = 0; - dst = &(simcall->file_stat.buf); + simcall_file_stat__set__result(simcall, 0); + dst = simcall_file_stat__get__buf(simcall); src = &((action->io.surf_io)->stat); file_stat_copy(src,dst); break; case SIMCALL_FILE_UNLINK: - xbt_free(simcall->file_unlink.fd); - simcall->result.i = 0; + xbt_free(simcall_file_unlink__get__fd(simcall)); + simcall_file_unlink__set__result(simcall, 0); break; case SIMCALL_FILE_LS: @@ -327,7 +326,7 @@ void SIMIX_post_io(smx_action_t action) xbt_dict_set((action->io.surf_io)->ls_dict,key,dst,free_file_stat); } } - simcall->file_ls.result = (action->io.surf_io)->ls_dict; + simcall_file_ls__set__result(simcall, (action->io.surf_io)->ls_dict); break; default: diff --git a/src/simix/smx_io_private.h b/src/simix/smx_io_private.h index 6e7848c42c..c158322e86 100644 --- a/src/simix/smx_io_private.h +++ b/src/simix/smx_io_private.h @@ -17,7 +17,7 @@ void SIMIX_pre_file_write(smx_simcall_t simcall, const void *ptr, size_t size, void SIMIX_pre_file_open(smx_simcall_t simcall, const char* mount, const char* path, const char* mode); void SIMIX_pre_file_close(smx_simcall_t simcall, smx_file_t fp); -void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t buf); +void SIMIX_pre_file_stat(smx_simcall_t simcall, smx_file_t fd, s_file_stat_t *buf); void SIMIX_pre_file_unlink(smx_simcall_t simcall, smx_file_t fd); void SIMIX_pre_file_ls(smx_simcall_t simcall, const char* mount, const char* path); diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index 25c9b2b9cb..b1351cbda4 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -626,8 +626,8 @@ void SIMIX_pre_comm_wait(smx_simcall_t simcall, smx_action_t action, double time void SIMIX_pre_comm_test(smx_simcall_t simcall, smx_action_t action) { if(MC_is_active()){ - simcall->result.i = action->comm.src_proc && action->comm.dst_proc; - if(simcall->result.i){ + simcall_comm_test__set__result(simcall, action->comm.src_proc && action->comm.dst_proc); + if(simcall_comm_test__get__result(simcall)){ action->state = SIMIX_DONE; xbt_fifo_push(action->simcalls, simcall); SIMIX_comm_finish(action); @@ -637,8 +637,8 @@ void SIMIX_pre_comm_test(smx_simcall_t simcall, smx_action_t action) return; } - simcall->result.i = (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING); - if (simcall->result.i) { + simcall_comm_test__set__result(simcall, (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING)); + if (simcall_comm_test__get__result(simcall)) { xbt_fifo_push(action->simcalls, simcall); SIMIX_comm_finish(action); } else { @@ -651,14 +651,14 @@ void SIMIX_pre_comm_testany(smx_simcall_t simcall, xbt_dynar_t actions) int idx = simcall->mc_value; unsigned int cursor; smx_action_t action; - simcall->result.i = -1; + simcall_comm_testany__set__result(simcall, -1); if (MC_is_active()){ if(idx == -1){ SIMIX_simcall_answer(simcall); }else{ action = xbt_dynar_get_as(actions, idx, smx_action_t); - simcall->result.i = idx; + simcall_comm_testany__set__result(simcall, idx); xbt_fifo_push(action->simcalls, simcall); action->state = SIMIX_DONE; SIMIX_comm_finish(action); @@ -666,9 +666,9 @@ void SIMIX_pre_comm_testany(smx_simcall_t simcall, xbt_dynar_t actions) return; } - xbt_dynar_foreach(simcall->comm_testany.comms,cursor,action) { + xbt_dynar_foreach(simcall_comm_testany__get__comms(simcall), cursor,action) { if (action->state != SIMIX_WAITING && action->state != SIMIX_RUNNING) { - simcall->result.i = cursor; + simcall_comm_testany__set__result(simcall, cursor); xbt_fifo_push(action->simcalls, simcall); SIMIX_comm_finish(action); return; @@ -686,7 +686,7 @@ void SIMIX_pre_comm_waitany(smx_simcall_t simcall, xbt_dynar_t actions) if (MC_is_active()){ action = xbt_dynar_get_as(actions, idx, smx_action_t); xbt_fifo_push(action->simcalls, simcall); - simcall->result.i = idx; + simcall_comm_waitany__set__result(simcall, idx); action->state = SIMIX_DONE; SIMIX_comm_finish(action); return; @@ -708,7 +708,7 @@ void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall) { smx_action_t action; unsigned int cursor = 0; - xbt_dynar_t actions = simcall->comm_waitany.comms; + xbt_dynar_t actions = simcall_comm_waitany__get__comms(simcall); xbt_dynar_foreach(actions, cursor, action) { xbt_fifo_remove(action->simcalls, simcall); @@ -782,7 +782,7 @@ void SIMIX_comm_finish(smx_action_t action) if (simcall->call == SIMCALL_COMM_WAITANY) { SIMIX_waitany_remove_simcall_from_actions(simcall); if (!MC_is_active()) - simcall->result.i = xbt_dynar_search(simcall->comm_waitany.comms, &action); + simcall_comm_waitany__set__result(simcall, xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &action)); } /* If the action is still in a rendez-vous point then remove from it */ @@ -857,10 +857,10 @@ void SIMIX_comm_finish(smx_action_t action) /* if there is an exception during a waitany or a testany, indicate the position of the failed communication */ if (simcall->issuer->doexception) { if (simcall->call == SIMCALL_COMM_WAITANY) { - simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall->comm_waitany.comms, &action); + simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall_comm_waitany__get__comms(simcall), &action); } else if (simcall->call == SIMCALL_COMM_TESTANY) { - simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall->comm_testany.comms, &action); + simcall->issuer->running_ctx->exception.value = xbt_dynar_search(simcall_comm_testany__get__comms(simcall), &action); } } diff --git a/src/simix/smx_process.c b/src/simix/smx_process.c index 5df9a90400..4ed440f223 100644 --- a/src/simix/smx_process.c +++ b/src/simix/smx_process.c @@ -634,7 +634,7 @@ void SIMIX_pre_process_sleep(smx_simcall_t simcall, double duration) { if (MC_is_active()) { MC_process_clock_add(simcall->issuer, duration); - simcall->result.i = SIMIX_DONE; + simcall_process_sleep__set__result(simcall, SIMIX_DONE); SIMIX_simcall_answer(simcall); return; } @@ -697,7 +697,7 @@ void SIMIX_post_process_sleep(smx_action_t action) workstation.get_state(simcall->issuer->smx_host->host) != SURF_RESOURCE_ON) { simcall->issuer->context->iwannadie = 1; } - simcall->result.i = state; + simcall_process_sleep__set__result(simcall, state); simcall->issuer->waiting_action = NULL; SIMIX_simcall_answer(simcall); diff --git a/src/simix/smx_smurf.c b/src/simix/smx_smurf.c index 6948eee64f..0dc477fbeb 100644 --- a/src/simix/smx_smurf.c +++ b/src/simix/smx_smurf.c @@ -129,13 +129,6 @@ SIMCALL_LIST #undef SIMCALL_ENUM_ELEMENT };*/ -SIMCALL_LIST(SIMCALL_FUNC, SIMCALL_SEP_NOTHING) - -void SIMIX_simcall_typecheck(const char *fmt, ...) -{ - return; -} - smx_simcall_t __SIMIX_simcall(e_smx_simcall_t simcall_id, u_smx_scalar_t *args) { smx_process_t self = SIMIX_process_self(); diff --git a/src/simix/smx_smurf_private.h b/src/simix/smx_smurf_private.h index 0e96f7f42f..ac677cddec 100644 --- a/src/simix/smx_smurf_private.h +++ b/src/simix/smx_smurf_private.h @@ -46,7 +46,6 @@ #define FE_9(I, WHAT, X, ...) WHAT(I, X), FE_8(I+1, WHAT, __VA_ARGS__) #define FE_10(I, WHAT, X, ...) WHAT(I, X), FE_9(I+1, WHAT, __VA_ARGS__) - /* NOTE: add as many FE_n as needed (maximum number of simcall arguments )*/ /* Make a MAP macro usgin FOLD (will apply 'action' to the arguments. @@ -57,6 +56,23 @@ #define MAP(action, ...) \ GET_MACRO(, ##__VA_ARGS__, FE_10,FE_9,FE_8,FE_7,FE_6,FE_5,FE_4,FE_3,FE_2,FE_1, FE_0) (0, action, __VA_ARGS__) +/* MAP with default arguments */ +#define APPLY_MAP(WHAT, I, X, ...) WHAT(I, __VA_ARGS__, X) +#define FE_DA_0(I, WHAT, args, X, ...) +#define FE_DA_1(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) +#define FE_DA_2(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_1(I+1, WHAT, args, __VA_ARGS__) +#define FE_DA_3(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_2(I+1, WHAT, args, __VA_ARGS__) +#define FE_DA_4(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_3(I+1, WHAT, args, __VA_ARGS__) +#define FE_DA_5(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_4(I+1, WHAT, args, __VA_ARGS__) +#define FE_DA_6(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_5(I+1, WHAT, args, __VA_ARGS__) +#define FE_DA_7(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_6(I+1, WHAT, args, __VA_ARGS__) +#define FE_DA_8(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_7(I+1, WHAT, args, __VA_ARGS__) +#define FE_DA_9(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_8(I+1, WHAT, args, __VA_ARGS__) +#define FE_DA_10(I, WHAT, args, X, ...) APPLY_MAP(WHAT, I, X, args) FE_DA_9(I+1, WHAT, args, __VA_ARGS__) + +#define MAP_WITH_DEFAULT_ARGS(action, args, ...) \ + GET_MACRO(, ##__VA_ARGS__, FE_DA_10,FE_DA_9,FE_DA_8,FE_DA_7,FE_DA_6,FE_DA_5,FE_DA_4,FE_DA_3,FE_DA_2,FE_DA_1, FE_DA_0) (0, action, args, __VA_ARGS__) + /* * Define scalar type wrappers to ease the use of simcalls. * These are used to wrap the arguments in SIMIX_simcall macro. @@ -75,7 +91,6 @@ #define TPTR(n) (n, void*, p) #define TCPTR(n) (n, const void*, cp) #define TSIZE(n) (n, size_t, si) -#define TSTAT(n) (n, s_file_stat_t, fs) #define TVOID(n) (n, void) #define TSPEC(n,t) (n, t, p) @@ -91,6 +106,10 @@ #define SIMCALL_FORMAT_(name, type, field) %field #define SIMCALL_FORMAT(i, v) SIMCALL_FORMAT_ v +/* get the field of the parameter */ +#define SIMCALL_FIELD_(name, type, field) field +#define SIMCALL_FIELD(i, v) SIMCALL_FIELD_ v + /* get the parameter declaration */ #define SIMCALL_ARG_(name, type, field) type name #define SIMCALL_ARG(i, v) SIMCALL_ARG_ v @@ -146,7 +165,7 @@ /* generate the simcalls functions */ #define SIMCALL_FUNC(type, name, answer, res, ...)\ - SIMCALL_FUNC_RETURN_TYPE(res) simcall_BODY_##name(MAP(SIMCALL_ARG, ##__VA_ARGS__)) { \ + inline static SIMCALL_FUNC_RETURN_TYPE(res) simcall_BODY_##name(MAP(SIMCALL_ARG, ##__VA_ARGS__)) { \ SIMCALL_FUNC_SIMCALL(res) __SIMIX_simcall(type, (u_smx_scalar_t[]){MAP(SIMCALL_INIT_FIELD, ##__VA_ARGS__)}); \ SIMCALL_FUNC_RETURN(res)\ } @@ -154,7 +173,7 @@ /* generate the simcalls prototypes functions */ #define VOID_IF_EMPTY(...) GET_CLEAN(,##__VA_ARGS__,,,,,,,,,,,void) #define SIMCALL_FUNC_PROTO(type, name, answer, res, ...)\ - SIMCALL_FUNC_RETURN_TYPE(res) simcall_BODY_##name(VOID_IF_EMPTY(__VA_ARGS__) MAP(SIMCALL_ARG, ##__VA_ARGS__)); + inline static SIMCALL_FUNC_RETURN_TYPE(res) simcall_BODY_##name(VOID_IF_EMPTY(__VA_ARGS__) MAP(SIMCALL_ARG, ##__VA_ARGS__)); /* generate a comma if there is an argument*/ @@ -172,127 +191,191 @@ SIMCALL_RESULT_END(answer, res)\ break; + +/* + * Generate simcall args and result getter/setter + */ +#define SIMCALL_GS_SC_NAME_(n) n +#define SIMCALL_GS_SC_NAME(n) SIMCALL_GS_SC_NAME_ n +#define SIMCALL_GS_ARG_NAME(n) SIMCALL_NAME_ n +#define JOIN2(_0, _1) _0 ##__## _1 +#define JOIN3(_0, _1, _2) JOIN2(_0 ##__## _1, _2) +#define JOIN4(_0, _1, _2, _3) JOIN3(_0 ##_## _1, _2, _3) +#define SIMCALL_GS_FUNC(scname, setget, vname) \ + JOIN4(simcall, scname, setget, vname) + +/* generate the simcalls args getter/setter */ +#define SIMCALL_ARG_GETSET_(i, name, v) \ + inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall){\ + return simcall->args[i].SIMCALL_FIELD_ v ;\ + }\ + inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v){\ + simcall->args[i].SIMCALL_FIELD_ v = SIMCALL_NAME_ v ;\ + } + +#define SIMCALL_ARG_GETSET(type, name, answer, res, ...)\ + MAP_WITH_DEFAULT_ARGS(SIMCALL_ARG_GETSET_, (name), ##__VA_ARGS__) + +/* generate the simcalls args getter/setter protos*/ +#define SIMCALL_ARG_GETSET_PROTO_(i, name, v) \ + inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall);\ + inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME(name), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v); + +#define SIMCALL_ARG_GETSET_PROTO(type, name, answer, res, ...)\ + MAP_WITH_DEFAULT_ARGS(SIMCALL_ARG_GETSET_PROTO_, (name), ##__VA_ARGS__) + +/* generate the simcalls result getter/setter */ +#define SIMCALL_WITH_RES_GETSET(name, v) \ + inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall){\ + return simcall->result.SIMCALL_FIELD_ v ;\ + }\ + inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v){\ + simcall->result.SIMCALL_FIELD_ v = SIMCALL_NAME_ v ;\ + } +#define SIMCALL_WITHOUT_RES_GETSET(name, v) +#define SIMCALL_RES_GETSET__(name, type, ...)\ + MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RES_GETSET, SIMCALL_WITHOUT_RES_GETSET) +#define SIMCALL_RES_GETSET_(scname, v)\ + SIMCALL_RES_GETSET__ v (scname, v) +#define SIMCALL_RES_GETSET(type, name, answer, res, ...)\ + SIMCALL_RES_GETSET_(name, res) + +/* generate the simcalls result getter/setter protos*/ +#define SIMCALL_WITH_RES_GETSET_PROTO(name, v) \ + inline SIMCALL_FUNC_RETURN_TYPE(v) SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), get, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall);\ + inline void SIMCALL_GS_FUNC(SIMCALL_GS_SC_NAME((name)), set, SIMCALL_GS_ARG_NAME(v))(smx_simcall_t simcall, SIMCALL_ARG_ v); +#define SIMCALL_WITHOUT_RES_GETSET_PROTO(name, v) +#define SIMCALL_RES_GETSET_PROTO__(name, type, ...)\ + MAYBE2(,##__VA_ARGS__, SIMCALL_WITH_RES_GETSET_PROTO, SIMCALL_WITHOUT_RES_GETSET_PROTO) +#define SIMCALL_RES_GETSET_PROTO_(scname, v)\ + SIMCALL_RES_GETSET_PROTO__ v (scname, v) +#define SIMCALL_RES_GETSET_PROTO(type, name, answer, res, ...)\ + SIMCALL_RES_GETSET_PROTO_(name, res) + + + + /* stringify arguments */ #define STRINGIFY_(...) #__VA_ARGS__ #define STRINGIFY(...) STRINGIFY_(__VA_ARGS__) /* the list of simcalls definitions */ -#define SIMCALL_LIST1(action, sep) \ -action(SIMCALL_HOST_GET_BY_NAME, host_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(NAME)) sep \ -action(SIMCALL_HOST_GET_NAME, host_get_name, WITH_ANSWER, TSTRING(result), TSPEC(host, smx_host_t)) sep \ -action(SIMCALL_HOST_GET_PROPERTIES, host_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \ -action(SIMCALL_HOST_GET_SPEED, host_get_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \ -action(SIMCALL_HOST_GET_AVAILABLE_SPEED, host_get_available_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(result, smx_host_t)) sep \ -action(SIMCALL_HOST_GET_STATE, host_get_state, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \ -action(SIMCALL_HOST_GET_DATA, host_get_data, WITH_ANSWER, TPTR(result), TSPEC(host, smx_host_t)) sep \ -action(SIMCALL_HOST_SET_DATA, host_set_data, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t), TPTR(data)) sep \ -action(SIMCALL_HOST_EXECUTE, host_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TSPEC(host, smx_host_t), TDOUBLE(computation_amount), TDOUBLE(priority)) sep \ -action(SIMCALL_HOST_PARALLEL_EXECUTE, host_parallel_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TINT(host_nb), TSPEC(host_list, smx_host_t*), TSPEC(computation_amount, double*), TSPEC(communication_amount, double*), TDOUBLE(amount), TDOUBLE(rate)) sep \ -action(SIMCALL_HOST_EXECUTION_DESTROY, host_execution_destroy, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \ -action(SIMCALL_HOST_EXECUTION_CANCEL, host_execution_cancel, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \ -action(SIMCALL_HOST_EXECUTION_GET_REMAINS, host_execution_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(execution, smx_action_t)) sep \ -action(SIMCALL_HOST_EXECUTION_GET_STATE, host_execution_get_state, WITH_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \ -action(SIMCALL_HOST_EXECUTION_SET_PRIORITY, host_execution_set_priority, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t), TDOUBLE(priority)) sep \ -action(SIMCALL_HOST_EXECUTION_WAIT, host_execution_wait, WITHOUT_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \ -action(SIMCALL_PROCESS_CREATE, process_create, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t*), TSTRING(name), TSPEC(code, xbt_main_func_t), TPTR(data), TSTRING(hostname), TDOUBLE(kill_time), TINT(argc), TSPEC(argv, char**), TSPEC(properties, xbt_dict_t), TINT(auto_restart)) sep \ -action(SIMCALL_PROCESS_KILL, process_kill, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_KILLALL, process_killall, WITH_ANSWER, TVOID(result)) sep \ -action(SIMCALL_PROCESS_CLEANUP, process_cleanup, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_CHANGE_HOST, process_change_host, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(dest, smx_host_t)) sep \ -action(SIMCALL_PROCESS_SUSPEND, process_suspend, WITHOUT_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_RESUME, process_resume, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_COUNT, process_count, WITH_ANSWER, TINT(result)) sep \ -action(SIMCALL_PROCESS_GET_DATA, process_get_data, WITH_ANSWER, TPTR(result), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_SET_DATA, process_set_data, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TPTR(data)) sep \ -action(SIMCALL_PROCESS_GET_HOST, process_get_host, WITH_ANSWER, TSPEC(result, smx_host_t), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_GET_NAME, process_get_name, WITH_ANSWER, TSTRING(result), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_IS_SUSPENDED, process_is_suspended, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_GET_PROPERTIES, process_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_PROCESS_SLEEP, process_sleep, WITHOUT_ANSWER, TINT(result), TDOUBLE(duration)) sep \ -action(SIMCALL_PROCESS_ON_EXIT, process_on_exit, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(fun, int_f_pvoid_t), TPTR(data)) sep \ -action(SIMCALL_PROCESS_AUTO_RESTART_SET, process_auto_restart_set, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TINT(auto_restart)) sep \ -action(SIMCALL_PROCESS_RESTART, process_restart, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(process, smx_process_t)) sep \ -action(SIMCALL_RDV_CREATE, rdv_create, WITH_ANSWER, TSPEC(result, smx_rdv_t), TSTRING(name)) sep \ -action(SIMCALL_RDV_DESTROY, rdv_destroy, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t)) sep \ -action(SIMCALL_RDV_GET_BY_NAME, rdv_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \ -action(SIMCALL_RDV_COMM_COUNT_BY_HOST, rdv_comm_count_by_host, WITH_ANSWER, TUINT(result), TSPEC(rdv, smx_rdv_t), TSPEC(host, smx_host_t)) sep \ -action(SIMCALL_RDV_GET_HEAD, rdv_get_head, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t)) sep \ -action(SIMCALL_RDV_SET_RECV, rdv_set_receiver, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TSPEC(receiver, smx_process_t)) sep \ -action(SIMCALL_RDV_GET_RECV, rdv_get_receiver, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(rdv, smx_rdv_t)) sep \ -action(SIMCALL_COMM_IPROBE, comm_iprobe, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TINT(src), TINT(tag), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \ -action(SIMCALL_COMM_SEND, comm_send, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \ -action(SIMCALL_COMM_ISEND, comm_isend, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TSPEC(clean_fun, simix_clean_func_t), TPTR(data), TINT(detached)) sep \ -action(SIMCALL_COMM_RECV, comm_recv, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \ -action(SIMCALL_COMM_IRECV, comm_irecv, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \ -action(SIMCALL_COMM_DESTROY, comm_destroy, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_COMM_CANCEL, comm_cancel, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_COMM_WAITANY, comm_waitany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \ -action(SIMCALL_COMM_WAIT, comm_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(comm, smx_action_t), TDOUBLE(timeout)) sep \ -action(SIMCALL_COMM_TEST, comm_test, WITHOUT_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_COMM_TESTANY, comm_testany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \ -action(SIMCALL_COMM_GET_REMAINS, comm_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_COMM_GET_STATE, comm_get_state, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_COMM_GET_SRC_DATA, comm_get_src_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_COMM_GET_DST_DATA, comm_get_dst_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_COMM_GET_SRC_PROC, comm_get_src_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_COMM_GET_DST_PROC, comm_get_dst_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \ -action(SIMCALL_MUTEX_INIT, mutex_init, WITH_ANSWER, TSPEC(result, smx_mutex_t)) sep \ -action(SIMCALL_MUTEX_DESTROY, mutex_destroy, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \ -action(SIMCALL_MUTEX_LOCK, mutex_lock, WITHOUT_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \ -action(SIMCALL_MUTEX_TRYLOCK, mutex_trylock, WITH_ANSWER, TINT(result), TSPEC(mutex, smx_mutex_t)) sep \ -action(SIMCALL_MUTEX_UNLOCK, mutex_unlock, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \ -action(SIMCALL_COND_INIT, cond_init, WITH_ANSWER, TSPEC(result, smx_cond_t)) sep \ -action(SIMCALL_COND_DESTROY, cond_destroy, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \ -action(SIMCALL_COND_SIGNAL, cond_signal, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \ -action(SIMCALL_COND_WAIT, cond_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t)) sep \ -action(SIMCALL_COND_WAIT_TIMEOUT, cond_wait_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t), TDOUBLE(timeout)) sep \ -action(SIMCALL_COND_BROADCAST, cond_broadcast, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \ -action(SIMCALL_SEM_INIT, sem_init, WITH_ANSWER, TSPEC(result, smx_sem_t), TINT(capacity)) sep \ -action(SIMCALL_SEM_DESTROY, sem_destroy, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \ -action(SIMCALL_SEM_RELEASE, sem_release, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \ -action(SIMCALL_SEM_WOULD_BLOCK, sem_would_block, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \ -action(SIMCALL_SEM_ACQUIRE, sem_acquire, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \ -action(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem_acquire_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t), TDOUBLE(timeout)) sep \ -action(SIMCALL_SEM_GET_CAPACITY, sem_get_capacity, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \ -action(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TDOUBLE(result), TPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \ -action(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TCPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \ -action(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path), TSTRING(mode)) sep \ -action(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fp, smx_file_t)) sep \ -action(SIMCALL_FILE_STAT, file_stat, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t), TSTAT(buf)) sep \ -action(SIMCALL_FILE_UNLINK, file_unlink, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \ -action(SIMCALL_FILE_LS, file_ls, WITHOUT_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(mount), TSTRING(path)) sep \ -action(SIMCALL_ASR_GET_PROPERTIES, asr_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(name)) sep +#define SIMCALL_LIST1(ACTION, sep) \ +ACTION(SIMCALL_HOST_GET_BY_NAME, host_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \ +ACTION(SIMCALL_HOST_GET_NAME, host_get_name, WITH_ANSWER, TSTRING(result), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_GET_PROPERTIES, host_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_GET_SPEED, host_get_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_GET_AVAILABLE_SPEED, host_get_available_speed, WITH_ANSWER, TDOUBLE(result), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_GET_STATE, host_get_state, WITH_ANSWER, TINT(result), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_GET_DATA, host_get_data, WITH_ANSWER, TPTR(result), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_HOST_SET_DATA, host_set_data, WITH_ANSWER, TVOID(result), TSPEC(host, smx_host_t), TPTR(data)) sep \ +ACTION(SIMCALL_HOST_EXECUTE, host_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TSPEC(host, smx_host_t), TDOUBLE(computation_amount), TDOUBLE(priority)) sep \ +ACTION(SIMCALL_HOST_PARALLEL_EXECUTE, host_parallel_execute, WITH_ANSWER, TSPEC(result, smx_action_t), TSTRING(name), TINT(host_nb), TSPEC(host_list, smx_host_t*), TSPEC(computation_amount, double*), TSPEC(communication_amount, double*), TDOUBLE(amount), TDOUBLE(rate)) sep \ +ACTION(SIMCALL_HOST_EXECUTION_DESTROY, host_execution_destroy, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \ +ACTION(SIMCALL_HOST_EXECUTION_CANCEL, host_execution_cancel, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t)) sep \ +ACTION(SIMCALL_HOST_EXECUTION_GET_REMAINS, host_execution_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(execution, smx_action_t)) sep \ +ACTION(SIMCALL_HOST_EXECUTION_GET_STATE, host_execution_get_state, WITH_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \ +ACTION(SIMCALL_HOST_EXECUTION_SET_PRIORITY, host_execution_set_priority, WITH_ANSWER, TVOID(result), TSPEC(execution, smx_action_t), TDOUBLE(priority)) sep \ +ACTION(SIMCALL_HOST_EXECUTION_WAIT, host_execution_wait, WITHOUT_ANSWER, TINT(result), TSPEC(execution, smx_action_t)) sep \ +ACTION(SIMCALL_PROCESS_CREATE, process_create, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t*), TSTRING(name), TSPEC(code, xbt_main_func_t), TPTR(data), TSTRING(hostname), TDOUBLE(kill_time), TINT(argc), TSPEC(argv, char**), TSPEC(properties, xbt_dict_t), TINT(auto_restart)) sep \ +ACTION(SIMCALL_PROCESS_KILL, process_kill, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_KILLALL, process_killall, WITH_ANSWER, TVOID(result)) sep \ +ACTION(SIMCALL_PROCESS_CLEANUP, process_cleanup, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_CHANGE_HOST, process_change_host, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(dest, smx_host_t)) sep \ +ACTION(SIMCALL_PROCESS_SUSPEND, process_suspend, WITHOUT_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_RESUME, process_resume, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_COUNT, process_count, WITH_ANSWER, TINT(result)) sep \ +ACTION(SIMCALL_PROCESS_GET_DATA, process_get_data, WITH_ANSWER, TPTR(result), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_SET_DATA, process_set_data, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TPTR(data)) sep \ +ACTION(SIMCALL_PROCESS_GET_HOST, process_get_host, WITH_ANSWER, TSPEC(result, smx_host_t), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_GET_NAME, process_get_name, WITH_ANSWER, TSTRING(result), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_IS_SUSPENDED, process_is_suspended, WITH_ANSWER, TINT(result), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_GET_PROPERTIES, process_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_PROCESS_SLEEP, process_sleep, WITHOUT_ANSWER, TINT(result), TDOUBLE(duration)) sep \ +ACTION(SIMCALL_PROCESS_ON_EXIT, process_on_exit, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TSPEC(fun, int_f_pvoid_t), TPTR(data)) sep \ +ACTION(SIMCALL_PROCESS_AUTO_RESTART_SET, process_auto_restart_set, WITH_ANSWER, TVOID(result), TSPEC(process, smx_process_t), TINT(auto_restart)) sep \ +ACTION(SIMCALL_PROCESS_RESTART, process_restart, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(process, smx_process_t)) sep \ +ACTION(SIMCALL_RDV_CREATE, rdv_create, WITH_ANSWER, TSPEC(result, smx_rdv_t), TSTRING(name)) sep \ +ACTION(SIMCALL_RDV_DESTROY, rdv_destroy, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t)) sep \ +ACTION(SIMCALL_RDV_GET_BY_NAME, rdv_get_by_name, WITH_ANSWER, TSPEC(result, smx_host_t), TSTRING(name)) sep \ +ACTION(SIMCALL_RDV_COMM_COUNT_BY_HOST, rdv_comm_count_by_host, WITH_ANSWER, TUINT(result), TSPEC(rdv, smx_rdv_t), TSPEC(host, smx_host_t)) sep \ +ACTION(SIMCALL_RDV_GET_HEAD, rdv_get_head, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t)) sep \ +ACTION(SIMCALL_RDV_SET_RECV, rdv_set_receiver, WITH_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TSPEC(receiver, smx_process_t)) sep \ +ACTION(SIMCALL_RDV_GET_RECV, rdv_get_receiver, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(rdv, smx_rdv_t)) sep \ +ACTION(SIMCALL_COMM_IPROBE, comm_iprobe, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TINT(src), TINT(tag), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \ +ACTION(SIMCALL_COMM_SEND, comm_send, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \ +ACTION(SIMCALL_COMM_ISEND, comm_isend, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TDOUBLE(task_size), TDOUBLE(rate), TPTR(src_buff), TSIZE(src_buff_size), TSPEC(match_fun, simix_match_func_t), TSPEC(clean_fun, simix_clean_func_t), TPTR(data), TINT(detached)) sep \ +ACTION(SIMCALL_COMM_RECV, comm_recv, WITHOUT_ANSWER, TVOID(result), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data), TDOUBLE(timeout)) sep \ +ACTION(SIMCALL_COMM_IRECV, comm_irecv, WITH_ANSWER, TSPEC(result, smx_action_t), TSPEC(rdv, smx_rdv_t), TPTR(dst_buff), TSPEC(dst_buff_size, size_t*), TSPEC(match_fun, simix_match_func_t), TPTR(data)) sep \ +ACTION(SIMCALL_COMM_DESTROY, comm_destroy, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_COMM_CANCEL, comm_cancel, WITH_ANSWER, TVOID(result), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_COMM_WAITANY, comm_waitany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \ +ACTION(SIMCALL_COMM_WAIT, comm_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(comm, smx_action_t), TDOUBLE(timeout)) sep \ +ACTION(SIMCALL_COMM_TEST, comm_test, WITHOUT_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_COMM_TESTANY, comm_testany, WITHOUT_ANSWER, TINT(result), TSPEC(comms, xbt_dynar_t)) sep \ +ACTION(SIMCALL_COMM_GET_REMAINS, comm_get_remains, WITH_ANSWER, TDOUBLE(result), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_COMM_GET_STATE, comm_get_state, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_COMM_GET_SRC_DATA, comm_get_src_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_COMM_GET_DST_DATA, comm_get_dst_data, WITH_ANSWER, TPTR(result), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_COMM_GET_SRC_PROC, comm_get_src_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_COMM_GET_DST_PROC, comm_get_dst_proc, WITH_ANSWER, TSPEC(result, smx_process_t), TSPEC(comm, smx_action_t)) sep \ +ACTION(SIMCALL_MUTEX_INIT, mutex_init, WITH_ANSWER, TSPEC(result, smx_mutex_t)) sep \ +ACTION(SIMCALL_MUTEX_DESTROY, mutex_destroy, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \ +ACTION(SIMCALL_MUTEX_LOCK, mutex_lock, WITHOUT_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \ +ACTION(SIMCALL_MUTEX_TRYLOCK, mutex_trylock, WITH_ANSWER, TINT(result), TSPEC(mutex, smx_mutex_t)) sep \ +ACTION(SIMCALL_MUTEX_UNLOCK, mutex_unlock, WITH_ANSWER, TVOID(result), TSPEC(mutex, smx_mutex_t)) sep \ +ACTION(SIMCALL_COND_INIT, cond_init, WITH_ANSWER, TSPEC(result, smx_cond_t)) sep \ +ACTION(SIMCALL_COND_DESTROY, cond_destroy, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \ +ACTION(SIMCALL_COND_SIGNAL, cond_signal, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \ +ACTION(SIMCALL_COND_WAIT, cond_wait, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t)) sep \ +ACTION(SIMCALL_COND_WAIT_TIMEOUT, cond_wait_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t), TSPEC(mutex, smx_mutex_t), TDOUBLE(timeout)) sep \ +ACTION(SIMCALL_COND_BROADCAST, cond_broadcast, WITH_ANSWER, TVOID(result), TSPEC(cond, smx_cond_t)) sep \ +ACTION(SIMCALL_SEM_INIT, sem_init, WITH_ANSWER, TSPEC(result, smx_sem_t), TINT(capacity)) sep \ +ACTION(SIMCALL_SEM_DESTROY, sem_destroy, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \ +ACTION(SIMCALL_SEM_RELEASE, sem_release, WITH_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \ +ACTION(SIMCALL_SEM_WOULD_BLOCK, sem_would_block, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \ +ACTION(SIMCALL_SEM_ACQUIRE, sem_acquire, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t)) sep \ +ACTION(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem_acquire_timeout, WITHOUT_ANSWER, TVOID(result), TSPEC(sem, smx_sem_t), TDOUBLE(timeout)) sep \ +ACTION(SIMCALL_SEM_GET_CAPACITY, sem_get_capacity, WITH_ANSWER, TINT(result), TSPEC(sem, smx_sem_t)) sep \ +ACTION(SIMCALL_FILE_READ, file_read, WITHOUT_ANSWER, TDOUBLE(result), TPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \ +ACTION(SIMCALL_FILE_WRITE, file_write, WITHOUT_ANSWER, TSIZE(result), TCPTR(ptr), TSIZE(size), TSIZE(nmemb), TSPEC(stream, smx_file_t)) sep \ +ACTION(SIMCALL_FILE_OPEN, file_open, WITHOUT_ANSWER, TSPEC(result, smx_file_t), TSTRING(mount), TSTRING(path), TSTRING(mode)) sep \ +ACTION(SIMCALL_FILE_CLOSE, file_close, WITHOUT_ANSWER, TINT(result), TSPEC(fp, smx_file_t)) sep \ +ACTION(SIMCALL_FILE_STAT, file_stat, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t), TSPEC(buf, s_file_stat_t*)) sep \ +ACTION(SIMCALL_FILE_UNLINK, file_unlink, WITHOUT_ANSWER, TINT(result), TSPEC(fd, smx_file_t)) sep \ +ACTION(SIMCALL_FILE_LS, file_ls, WITHOUT_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(mount), TSTRING(path)) sep \ +ACTION(SIMCALL_ASR_GET_PROPERTIES, asr_get_properties, WITH_ANSWER, TSPEC(result, xbt_dict_t), TSTRING(name)) sep /* SIMCALL_COMM_IS_LATENCY_BOUNDED and SIMCALL_SET_CATEGORY make things complicated * because they are not always present */ #ifdef HAVE_LATENCY_BOUND_TRACKING -#define SIMCALL_LIST2(action, sep) \ -action(SIMCALL_COMM_IS_LATENCY_BOUNDED, comm_is_latency_bounded, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep +#define SIMCALL_LIST2(ACTION, sep) \ +ACTION(SIMCALL_COMM_IS_LATENCY_BOUNDED, comm_is_latency_bounded, WITH_ANSWER, TINT(result), TSPEC(comm, smx_action_t)) sep #else -#define SIMCALL_LIST2(action, sep) +#define SIMCALL_LIST2(ACTION, sep) #endif #ifdef HAVE_TRACING -#define SIMCALL_LIST3(action, sep) \ -action(SIMCALL_SET_CATEGORY, set_category, WITH_ANSWER, TVOID(result), TSPEC(action, smx_action_t), TSTRING(category)) sep +#define SIMCALL_LIST3(ACTION, sep) \ +ACTION(SIMCALL_SET_CATEGORY, set_category, WITH_ANSWER, TVOID(result), TSPEC(action, smx_action_t), TSTRING(category)) sep #else -#define SIMCALL_LIST3(action, sep) +#define SIMCALL_LIST3(ACTION, sep) #endif #ifdef HAVE_MC -#define SIMCALL_LIST4(action, sep) \ -action(SIMCALL_MC_SNAPSHOT, mc_snapshot, WITH_ANSWER, TPTR(result)) sep \ -action(SIMCALL_MC_COMPARE_SNAPSHOTS, mc_compare_snapshots, WITH_ANSWER, TINT(result), TPTR(s1), TPTR(s2)) sep +#define SIMCALL_LIST4(ACTION, sep) \ +ACTION(SIMCALL_MC_SNAPSHOT, mc_snapshot, WITH_ANSWER, TPTR(result)) sep \ +ACTION(SIMCALL_MC_COMPARE_SNAPSHOTS, mc_compare_snapshots, WITH_ANSWER, TINT(result), TPTR(s1), TPTR(s2)) sep #else -#define SIMCALL_LIST4(action, sep) +#define SIMCALL_LIST4(ACTION, sep) #endif /* SIMCALL_LIST is the final macro to use */ -#define SIMCALL_LIST(action, ...) \ - SIMCALL_LIST1(action, ##__VA_ARGS__)\ - SIMCALL_LIST2(action, ##__VA_ARGS__)\ - SIMCALL_LIST3(action, ##__VA_ARGS__)\ - SIMCALL_LIST4(action, ##__VA_ARGS__) +#define SIMCALL_LIST(ACTION, ...) \ + SIMCALL_LIST1(ACTION, ##__VA_ARGS__)\ + SIMCALL_LIST2(ACTION, ##__VA_ARGS__)\ + SIMCALL_LIST3(ACTION, ##__VA_ARGS__)\ + SIMCALL_LIST4(ACTION, ##__VA_ARGS__) /* you can redefine the following macro differently to generate something else @@ -332,7 +415,6 @@ union u_smx_scalar { float f; double d; size_t si; - s_file_stat_t fs; void* p; const void* cp; }; @@ -347,488 +429,7 @@ typedef struct s_smx_simcall { union u_smx_scalar *args; union u_smx_scalar result; //FIXME: union u_smx_scalar retval; - union { - - struct { - const char *name; - smx_host_t result; - } host_get_by_name; - - struct { - smx_host_t host; - const char* result; - } host_get_name; - - struct { - smx_host_t host; - xbt_dict_t result; - } host_get_properties; - - struct { - smx_host_t host; - double result; - } host_get_speed; - - struct { - smx_host_t host; - double result; - } host_get_available_speed; - - struct { - smx_host_t host; - int result; - } host_get_state; - - struct { - smx_host_t host; - void* result; - } host_get_data; - - struct { - smx_host_t host; - void* data; - } host_set_data; - - struct { - const char* name; - smx_host_t host; - double computation_amount; - double priority; - smx_action_t result; - } host_execute; - - struct { - const char *name; - int host_nb; - smx_host_t *host_list; - double *computation_amount; - double *communication_amount; - double amount; - double rate; - smx_action_t result; - } host_parallel_execute; - - struct { - smx_action_t execution; - } host_execution_destroy; - - struct { - smx_action_t execution; - } host_execution_cancel; - - struct { - smx_action_t execution; - double result; - } host_execution_get_remains; - - struct { - smx_action_t execution; - e_smx_state_t result; - } host_execution_get_state; - - struct { - smx_action_t execution; - double priority; - } host_execution_set_priority; - - struct { - smx_action_t execution; - struct s_smx_simcall *simcall; - e_smx_state_t result; - - } host_execution_wait; - - struct { - smx_process_t *process; - const char *name; - xbt_main_func_t code; - void *data; - const char *hostname; - double kill_time; - int argc; - char **argv; - xbt_dict_t properties; - int auto_restart; - } process_create; - - struct { - smx_process_t process; - } process_kill; - - struct { - smx_process_t process; - } process_cleanup; - - struct { - smx_process_t process; - smx_host_t dest; - } process_change_host; - - struct { - smx_process_t process; - } process_suspend; - - struct { - smx_process_t process; - } process_resume; - - struct { - int result; - } process_count; - - struct { - smx_process_t process; - void* result; - } process_get_data; - - struct { - smx_process_t process; - void* data; - } process_set_data; - - struct { - smx_process_t process; - smx_host_t result; - } process_get_host; - - struct { - smx_process_t process; - const char *result; - } process_get_name; - - struct { - smx_process_t process; - int result; - } process_is_suspended; - - struct { - smx_process_t process; - xbt_dict_t result; - } process_get_properties; - - struct { - double duration; - e_smx_state_t result; - } process_sleep; - - struct { - smx_process_t process; - int_f_pvoid_t fun; - void *data; - } process_on_exit; - - struct { - smx_process_t process; - int auto_restart; - } process_auto_restart; - - struct { - smx_process_t process; - smx_process_t result; - } process_restart; - - struct { - const char *name; - smx_rdv_t result; - } rdv_create; - - struct { - smx_rdv_t rdv; - } rdv_destroy; - - struct { - const char* name; - smx_rdv_t result; - } rdv_get_by_name; - - struct { - smx_rdv_t rdv; - smx_host_t host; - unsigned int result; - } rdv_comm_count_by_host; - - struct { - smx_rdv_t rdv; - smx_action_t result; - } rdv_get_head; - - struct { - smx_rdv_t rdv; - smx_process_t receiver; - } rdv_set_rcv_proc; - - struct { - smx_rdv_t rdv; - smx_process_t result; - } rdv_get_rcv_proc; - - struct { - smx_rdv_t rdv; - double task_size; - double rate; - void *src_buff; - size_t src_buff_size; - int (*match_fun)(void *, void *, smx_action_t); - void *data; - double timeout; - } comm_send; - - struct { - smx_rdv_t rdv; - double task_size; - double rate; - void *src_buff; - size_t src_buff_size; - int (*match_fun)(void *, void *, smx_action_t); - void (*clean_fun)(void *); - void *data; - int detached; - smx_action_t result; - } comm_isend; - - struct { - smx_rdv_t rdv; - void *dst_buff; - size_t *dst_buff_size; - int (*match_fun)(void *, void *, smx_action_t); - void *data; - double timeout; - } comm_recv; - - struct { - smx_rdv_t rdv; - void *dst_buff; - size_t *dst_buff_size; - int (*match_fun)(void *, void *, smx_action_t); - void *data; - smx_action_t result; - } comm_irecv; - - struct { - smx_rdv_t rdv; - int src; - int tag; - int (*match_fun)(void *, void *, smx_action_t); - void *data; - smx_action_t result; - } comm_iprobe; - - struct { - smx_action_t comm; - } comm_destroy; - - struct { - smx_action_t comm; - } comm_cancel; - - struct { - xbt_dynar_t comms; - unsigned int result; - } comm_waitany; - - struct { - smx_action_t comm; - double timeout; - } comm_wait; - - struct { - smx_action_t comm; - int result; - } comm_test; - - struct { - xbt_dynar_t comms; - int result; - } comm_testany; - - struct { - smx_action_t comm; - double result; - } comm_get_remains; - - struct { - smx_action_t comm; - e_smx_state_t result; - } comm_get_state; - - struct { - smx_action_t comm; - void *result; - } comm_get_src_data; - - struct { - smx_action_t comm; - void *result; - } comm_get_dst_data; - - struct { - smx_action_t comm; - smx_process_t result; - } comm_get_src_proc; - - struct { - smx_action_t comm; - smx_process_t result; - } comm_get_dst_proc; - -#ifdef HAVE_LATENCY_BOUND_TRACKING - struct { - smx_action_t comm; - int result; - } comm_is_latency_bounded; -#endif - -#ifdef HAVE_TRACING - struct { - smx_action_t action; - const char *category; - } set_category; -#endif - - struct { - smx_mutex_t result; - } mutex_init; - - struct { - smx_mutex_t mutex; - } mutex_lock; - - struct { - smx_mutex_t mutex; - int result; - } mutex_trylock; - - struct { - smx_mutex_t mutex; - } mutex_unlock; - - struct { - smx_mutex_t mutex; - } mutex_destroy; - - struct { - smx_cond_t result; - } cond_init; - - struct { - smx_cond_t cond; - } cond_destroy; - - struct { - smx_cond_t cond; - } cond_signal; - - struct { - smx_cond_t cond; - smx_mutex_t mutex; - } cond_wait; - - struct { - smx_cond_t cond; - smx_mutex_t mutex; - double timeout; - } cond_wait_timeout; - - struct { - smx_cond_t cond; - } cond_broadcast; - - struct { - int capacity; - smx_sem_t result; - } sem_init; - - struct { - smx_sem_t sem; - } sem_destroy; - - struct { - smx_sem_t sem; - } sem_release; - - struct { - smx_sem_t sem; - int result; - } sem_would_block; - - struct { - smx_sem_t sem; - } sem_acquire; - - struct { - smx_sem_t sem; - double timeout; - } sem_acquire_timeout; - - struct { - smx_sem_t sem; - int result; - } sem_get_capacity; - - struct { - void *ptr; - size_t size; - size_t nmemb; - smx_file_t stream; - double result; - } file_read; - - struct { - const void *ptr; - size_t size; - size_t nmemb; - smx_file_t stream; - size_t result; - } file_write; - - struct { - const char* mount; - const char* path; - const char* mode; - smx_file_t result; - } file_open; - - struct { - smx_file_t fp; - int result; - } file_close; - - struct { - smx_file_t fd; - s_file_stat_t buf; - int result; - } file_stat; - - struct { - smx_file_t fd; - int result; - } file_unlink; - - struct { - const char *mount; - const char *path; - xbt_dict_t result; - } file_ls; - - struct { - const char* name; - xbt_dict_t result; - } asr_get_properties; - - struct{ - void *s; - } mc_snapshot; - - struct{ - void *snapshot1; - void *snapshot2; - int result; - } mc_compare_snapshots; - - /* ****************************************************************************************** */ - /* TUTORIAL: New API */ - /* ****************************************************************************************** */ struct { const char* param1; double param2; @@ -838,7 +439,8 @@ typedef struct s_smx_simcall { }; } s_smx_simcall_t, *smx_simcall_t; - +SIMCALL_LIST(SIMCALL_RES_GETSET_PROTO, SIMCALL_SEP_NOTHING) +SIMCALL_LIST(SIMCALL_ARG_GETSET_PROTO, SIMCALL_SEP_NOTHING) /******************************** General *************************************/ @@ -853,85 +455,8 @@ xbt_dict_t SIMIX_pre_asr_get_properties(smx_simcall_t simcall, const char *name) /*************************** New simcall interface ****************************/ -#define SIMIX_pack_args(...) (u_smx_scalar_t[]){MAP(INIT_FIELD, __VA_ARGS__)} - - -/* - * Define scalar type wrappers to ease the use of simcalls. - * These are used to wrap the arguments in SIMIX_simcall macro. - */ -#define CHAR(x) (c,x) -#define STRING(x) (cc,x) -#define SHORT(x) (s,x) -#define INT(x) (i,x) -#define LONG(x) (l,x) -#define UCHAR(x) (uc,x) -#define USHORT(x) (us,x) -#define UINT(x) (ui,x) -#define ULONG(x) (ul,x) -#define FLOAT(x) (f,x) -#define DOUBLE(x) (d,x) -#define PTR(x) (p,x) - -/* - * Some macro machinery to get a MAP over the arguments of a variadic macro. - * It uses a FOLD to apply a macro to every argument, and because there is - * no recursion in the C preprocessor we must create a new macro for every - * depth of FOLD's recursion. - */ - -/* FOLD macro */ -#define FE_0(WHAT, X, ...) -#define FE_1(I, WHAT, X) WHAT(I, X) -#define FE_2(I, WHAT, X, ...) WHAT(I, X), FE_1(I+1, WHAT, __VA_ARGS__) -#define FE_3(I, WHAT, X, ...) WHAT(I, X), FE_2(I+1, WHAT, __VA_ARGS__) -#define FE_4(I, WHAT, X, ...) WHAT(I, X), FE_3(I+1, WHAT, __VA_ARGS__) -#define FE_5(I, WHAT, X, ...) WHAT(I, X), FE_4(I+1, WHAT, __VA_ARGS__) -#define FE_6(I, WHAT, X, ...) WHAT(I, X), FE_5(I+1, WHAT, __VA_ARGS__) -#define FE_7(I, WHAT, X, ...) WHAT(I, X), FE_6(I+1, WHAT, __VA_ARGS__) -#define FE_8(I, WHAT, X, ...) WHAT(I, X), FE_7(I+1, WHAT, __VA_ARGS__) -#define FE_9(I, WHAT, X, ...) WHAT(I, X), FE_8(I+1, WHAT, __VA_ARGS__) -#define FE_10(I, WHAT, X, ...) WHAT(I, X), FE_9(I+1, WHAT, __VA_ARGS__) - - -/* NOTE: add as many FE_n as needed (maximum number of simcall arguments )*/ - -/* Make a MAP macro usgin FOLD (will apply 'action' to the arguments. - * GET_MACRO is a smart hack that counts the number of arguments passed to - * the variadic macro, and it is used to invoke the right FOLD depth. - */ -#define GET_MACRO(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,NAME,...) NAME -#define MAP(action, ...) \ - GET_MACRO(, ##__VA_ARGS__, FE_10,FE_9,FE_8,FE_7,FE_6,FE_5,FE_4,FE_3,FE_2,FE_1, FE_0) (0, action, __VA_ARGS__) - -/* Generate code to initialize the field 'x' with value 'y' of an structure or union */ -#define INIT_FIELD_(x,y) {.x = y} -#define INIT_FIELD(t) INIT_FIELD_ t - -/* Project the second element of a tuple */ -#define SECOND_(x, y) y -#define SECOND(t) SECOND_ t - -/* - * \brief Simcall invocation macro - * It calls a dummy function that uses the format attribute to ensure typesafety (see - * gcc format attribute), then it invokes the real simcall function packing the - * user provided arguments in an array. - * \param id a simcall id (from the simcall enumeration ids) - * - */ -#define SIMIX_simcall(id, ...) \ - SIMIX_simcall_typecheck(simcall_types[id], MAP(SECOND, __VA_ARGS__)); \ - __SIMIX_simcall(id, (u_smx_scalar_t[]){MAP(INIT_FIELD, __VA_ARGS__)}) - smx_simcall_t __SIMIX_simcall(e_smx_simcall_t simcall_id, u_smx_scalar_t *args); -/* - * \biref Dummy variadic function used to typecheck the arguments of a simcall - * \param fmt A format string following printf style - */ -void SIMIX_simcall_typecheck(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); - typedef smx_action_t (*simcall_handler_t)(u_smx_scalar_t *); extern const char *simcall_types[]; diff --git a/src/simix/smx_synchro.c b/src/simix/smx_synchro.c index f5f354d303..587e852b5f 100644 --- a/src/simix/smx_synchro.c +++ b/src/simix/smx_synchro.c @@ -41,23 +41,23 @@ void SIMIX_synchro_stop_waiting(smx_process_t process, smx_simcall_t simcall) switch (simcall->call) { case SIMCALL_MUTEX_LOCK: - xbt_swag_remove(process, simcall->mutex_lock.mutex->sleeping); + xbt_swag_remove(process, simcall_mutex_lock__get__mutex(simcall)->sleeping); break; case SIMCALL_COND_WAIT: - xbt_swag_remove(process, simcall->cond_wait.cond->sleeping); + xbt_swag_remove(process, simcall_cond_wait__get__cond(simcall)->sleeping); break; case SIMCALL_COND_WAIT_TIMEOUT: - xbt_swag_remove(process, simcall->cond_wait_timeout.cond->sleeping); + xbt_swag_remove(process, simcall_cond_wait_timeout__get__cond(simcall)->sleeping); break; case SIMCALL_SEM_ACQUIRE: - xbt_swag_remove(process, simcall->sem_acquire.sem->sleeping); + xbt_swag_remove(process, simcall_sem_acquire__get__sem(simcall)->sleeping); break; case SIMCALL_SEM_ACQUIRE_TIMEOUT: - xbt_swag_remove(process, simcall->sem_acquire_timeout.sem->sleeping); + xbt_swag_remove(process, simcall_sem_acquire_timeout__get__sem(simcall)->sleeping); break; default: @@ -350,10 +350,9 @@ void SIMIX_cond_signal(smx_cond_t cond) /* Now transform the cond wait simcall into a mutex lock one */ simcall = &proc->simcall; if(simcall->call == SIMCALL_COND_WAIT) - mutex = simcall->cond_wait.mutex; + mutex = simcall_cond_wait__get__mutex(simcall); else - mutex = simcall->cond_wait_timeout.mutex; - + mutex = simcall_cond_wait_timeout__get__mutex(simcall); simcall->call = SIMCALL_MUTEX_LOCK; SIMIX_pre_mutex_lock(simcall, mutex); diff --git a/src/simix/smx_user.c b/src/simix/smx_user.c index 8bd8e5349c..faac628ff6 100644 --- a/src/simix/smx_user.c +++ b/src/simix/smx_user.c @@ -18,6 +18,8 @@ SIMCALL_LIST(SIMCALL_TYPE, SIMCALL_SEP_COMMA) [SIMCALL_NONE] = "NONE" }; +SIMCALL_LIST(SIMCALL_FUNC, SIMCALL_SEP_NOTHING) + /** * \ingroup simix_host_management * \brief Returns a host given its name. @@ -760,7 +762,7 @@ int simcall_comm_testany(xbt_dynar_t comms) void simcall_comm_wait(smx_action_t comm, double timeout) { xbt_assert(isfinite(timeout), "timeout is not finite!"); - simcall_comm_wait(comm, timeout); + simcall_BODY_comm_wait(comm, timeout); } #ifdef HAVE_TRACING @@ -1062,8 +1064,7 @@ int simcall_file_close(smx_file_t fp) */ int simcall_file_stat(smx_file_t fd, s_file_stat_t *buf) { - //*buf = simcall->file_stat.buf; - return simcall_BODY_file_stat(fd, *buf); + return simcall_BODY_file_stat(fd, buf); } /**