X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3203ed1f4fb6f4617e94d5351661ba07e8b8f833..507785035fffb029577ed608142f0cb8a43f77e9:/src/simix/popping_private.h diff --git a/src/simix/popping_private.h b/src/simix/popping_private.h index 4f31ac74fa..0d5427b7bc 100644 --- a/src/simix/popping_private.h +++ b/src/simix/popping_private.h @@ -8,6 +8,7 @@ #define _POPPING_PRIVATE_H #include +#include SG_BEGIN_DECL() @@ -65,7 +66,185 @@ XBT_PRIVATE void SIMIX_simcall_answer(smx_simcall_t); XBT_PRIVATE void SIMIX_simcall_handle(smx_simcall_t, int); XBT_PRIVATE void SIMIX_simcall_exit(smx_synchro_t); XBT_PRIVATE const char *SIMIX_simcall_name(e_smx_simcall_t kind); +XBT_PRIVATE void SIMIX_run_kernel(void* code); SG_END_DECL() +#ifdef __cplusplus + +namespace simgrid { +namespace simix { + +template struct marshal_t {}; +#define SIMIX_MARSHAL(T, field) \ + template<> struct marshal_t { \ + static void marshal(u_smx_scalar& simcall, T value) \ + { \ + simcall.field = value; \ + } \ + static T unmarshal(u_smx_scalar const& simcall) \ + { \ + return simcall.field; \ + } \ + }; + +SIMIX_MARSHAL(char, c); +SIMIX_MARSHAL(short, s); +SIMIX_MARSHAL(int, i); +SIMIX_MARSHAL(long, l); +SIMIX_MARSHAL(unsigned char, uc); +SIMIX_MARSHAL(unsigned short, us); +SIMIX_MARSHAL(unsigned int, ui); +SIMIX_MARSHAL(unsigned long, ul); +SIMIX_MARSHAL(float, f); +SIMIX_MARSHAL(double, d); +SIMIX_MARSHAL(FPtr, fp); + +template struct marshal_t { + static void marshal(u_smx_scalar& simcall, T* value) + { + simcall.dp = value; + } + static T* unmarshal(u_smx_scalar const& simcall) + { + return simcall.dp; + } +}; + +template<> struct marshal_t { + static void unmarshal(u_smx_scalar const& simcall) {} +}; + +template inline +void marshal(u_smx_scalar& simcall, T const& value) +{ + marshal_t::marshal(simcall, value); +} + +template inline +T unmarshal(u_smx_scalar const& simcall) +{ + return marshal_t::unmarshal(simcall); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, A&& a) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, A&& a, B&& b) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); + marshal(simcall->args[1], std::forward(b)); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, A&& a, B&& b, C&& c) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); + marshal(simcall->args[1], std::forward(b)); + marshal(simcall->args[2], std::forward(c)); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, A&& a, B&& b, C&& c, D&& d) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); + marshal(simcall->args[1], std::forward(b)); + marshal(simcall->args[2], std::forward(c)); + marshal(simcall->args[3], std::forward(d)); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, A&& a, B&& b, C&& c, D&& d, E&& e) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); + marshal(simcall->args[1], std::forward(b)); + marshal(simcall->args[2], std::forward(c)); + marshal(simcall->args[3], std::forward(d)); + marshal(simcall->args[4], std::forward(e)); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, + A&& a, B&& b, C&& c, D&& d, E&& e, F&& f) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); + marshal(simcall->args[1], std::forward(b)); + marshal(simcall->args[2], std::forward(c)); + marshal(simcall->args[3], std::forward(d)); + marshal(simcall->args[4], std::forward(e)); + marshal(simcall->args[5], std::forward(f)); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, + A&& a, B&& b, C&& c, D&& d, E&& e, F&& f, G&& g) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); + marshal(simcall->args[1], std::forward(b)); + marshal(simcall->args[2], std::forward(c)); + marshal(simcall->args[3], std::forward(d)); + marshal(simcall->args[4], std::forward(e)); + marshal(simcall->args[5], std::forward(f)); + marshal(simcall->args[6], std::forward(g)); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, + A&& a, B&& b, C&& c, D&& d, E&& e, F&& f, G&& g, H&& h) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); + marshal(simcall->args[1], std::forward(b)); + marshal(simcall->args[2], std::forward(c)); + marshal(simcall->args[3], std::forward(d)); + marshal(simcall->args[4], std::forward(e)); + marshal(simcall->args[5], std::forward(f)); + marshal(simcall->args[6], std::forward(g)); + marshal(simcall->args[7], std::forward(h)); +} + +template inline +void marshal(smx_simcall_t simcall, e_smx_simcall_t call, + A&& a, B&& b, C&& c, D&& d, E&& e, F&& f, G&& g, H&& h, I&& i) +{ + simcall->call = call; + memset(&simcall->result, 0, sizeof(simcall->result)); + marshal(simcall->args[0], std::forward(a)); + marshal(simcall->args[1], std::forward(b)); + marshal(simcall->args[2], std::forward(c)); + marshal(simcall->args[3], std::forward(d)); + marshal(simcall->args[4], std::forward(e)); + marshal(simcall->args[5], std::forward(f)); + marshal(simcall->args[6], std::forward(g)); + marshal(simcall->args[7], std::forward(h)); + marshal(simcall->args[8], std::forward(i)); +} + +} +} + +#endif + #endif