Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Pfff. These functions are actually not available from the high APIs
[simgrid.git] / src / simix / popping_private.h
index cedca92..71bd4ed 100644 (file)
@@ -7,13 +7,15 @@
 #ifndef _POPPING_PRIVATE_H
 #define _POPPING_PRIVATE_H
 
+#include <xbt/base.h>
+#include <simgrid/simix.h>
+
 SG_BEGIN_DECL()
 
 /********************************* Simcalls *********************************/
 XBT_PUBLIC_DATA(const char*) simcall_names[]; /* Name of each simcall */
 
 #include "popping_enum.h" /* Definition of e_smx_simcall_t, with one value per simcall */
-#include "mc/mc_forward.h" /* Definition of mc_snapshot_t, used by one simcall */
 
 typedef int (*simix_match_func_t)(void *, void *, smx_synchro_t);
 typedef void (*simix_copy_data_func_t)(smx_synchro_t, void*, size_t);
@@ -59,11 +61,189 @@ typedef struct s_smx_simcall {
 
 /******************************** General *************************************/
 
-void SIMIX_simcall_answer(smx_simcall_t);
-void SIMIX_simcall_handle(smx_simcall_t, int);
-void SIMIX_simcall_exit(smx_synchro_t);
-const char *SIMIX_simcall_name(e_smx_simcall_t kind);
+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<typename T> struct marshal_t {};
+#define SIMIX_MARSHAL(T, field) \
+  template<> struct marshal_t<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<typename T> struct marshal_t<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<void> {
+  static void unmarshal(u_smx_scalar const& simcall) {}
+};
+
+template<class T> inline
+void marshal(u_smx_scalar& simcall, T const& value)
+{
+  marshal_t<T>::marshal(simcall, value);
+}
+
+template<class T> inline
+T unmarshal(u_smx_scalar const& simcall)
+{
+  return marshal_t<T>::unmarshal(simcall);
+}
+
+template<class A> 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>(a));
+}
+
+template<class A, class B> 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>(a));
+  marshal(simcall->args[1], std::forward<B>(b));
+}
+
+template<class A, class B, class C> 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>(a));
+  marshal(simcall->args[1], std::forward<B>(b));
+  marshal(simcall->args[2], std::forward<C>(c));
+}
+
+template<class A, class B, class C, class D> 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>(a));
+  marshal(simcall->args[1], std::forward<B>(b));
+  marshal(simcall->args[2], std::forward<C>(c));
+  marshal(simcall->args[3], std::forward<D>(d));
+}
+
+template<class A, class B, class C, class D, class E> 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>(a));
+  marshal(simcall->args[1], std::forward<B>(b));
+  marshal(simcall->args[2], std::forward<C>(c));
+  marshal(simcall->args[3], std::forward<D>(d));
+  marshal(simcall->args[4], std::forward<E>(e));
+}
+
+template<class A, class B, class C, class D, class E, class F> 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>(a));
+  marshal(simcall->args[1], std::forward<B>(b));
+  marshal(simcall->args[2], std::forward<C>(c));
+  marshal(simcall->args[3], std::forward<D>(d));
+  marshal(simcall->args[4], std::forward<E>(e));
+  marshal(simcall->args[5], std::forward<F>(f));
+}
+
+template<class A, class B, class C, class D, class E, class F, class G> 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>(a));
+  marshal(simcall->args[1], std::forward<B>(b));
+  marshal(simcall->args[2], std::forward<C>(c));
+  marshal(simcall->args[3], std::forward<D>(d));
+  marshal(simcall->args[4], std::forward<E>(e));
+  marshal(simcall->args[5], std::forward<F>(f));
+  marshal(simcall->args[6], std::forward<G>(g));
+}
+
+template<class A, class B, class C,
+          class D, class E, class F, class G, class H> 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>(a));
+  marshal(simcall->args[1], std::forward<B>(b));
+  marshal(simcall->args[2], std::forward<C>(c));
+  marshal(simcall->args[3], std::forward<D>(d));
+  marshal(simcall->args[4], std::forward<E>(e));
+  marshal(simcall->args[5], std::forward<F>(f));
+  marshal(simcall->args[6], std::forward<G>(g));
+  marshal(simcall->args[7], std::forward<H>(h));
+}
+
+template<class A, class B, class C,
+          class D, class E, class F,
+          class G, class H, class I> 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>(a));
+  marshal(simcall->args[1], std::forward<B>(b));
+  marshal(simcall->args[2], std::forward<C>(c));
+  marshal(simcall->args[3], std::forward<D>(d));
+  marshal(simcall->args[4], std::forward<E>(e));
+  marshal(simcall->args[5], std::forward<F>(f));
+  marshal(simcall->args[6], std::forward<G>(g));
+  marshal(simcall->args[7], std::forward<H>(h));
+  marshal(simcall->args[8], std::forward<I>(i));
+}
+
+}
+}
+
+#endif
+
 #endif