From: mquinson Date: Mon, 9 Jul 2007 17:39:13 +0000 (+0000) Subject: Hello xbt/synchro module (synchronization working both in simulation and real life... X-Git-Tag: v3.3~1663 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/9e208fa1fce2449fb9d83259d4d4cb2fe9f6cdfb?ds=sidebyside Hello xbt/synchro module (synchronization working both in simulation and real life, for use in GRAS mainly but not only). Implementation would be cleaner (and a bit faster) with ELF symbol aliasing, but I'm not sure of how it works under windows, so I prefer to play safe for now git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3697 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/Makefile.am b/src/Makefile.am index 08bec14a0e..a99e4616f2 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -133,6 +133,12 @@ XBT_SRC=\ xbt/cunit.c \ xbt/graphxml_parse.c +XBT_RL_SRC = \ + xbt/xbt_rl_synchro.c + +XBT_SG_SRC = \ + xbt/xbt_sg_synchro.c + SURF_SRC= \ surf/maxmin.c \ surf/lagrange.c \ @@ -219,6 +225,8 @@ GRAS_RL_SRC= \ gras/Virtu/rl_dns.c\ \ gras/Msg/rl_msg.c + +GRAS_RL_SRC+=$(XBT_RL_SRC) GRAS_SG_SRC= gras/Transport/sg_transport.c gras/Transport/transport_plugin_sg.c \ \ @@ -228,6 +236,8 @@ GRAS_SG_SRC= gras/Transport/sg_transport.c gras/Transport/transport_plugin_sg.c \ gras/Msg/sg_msg.c +GRAS_SG_SRC+=$(XBT_SG_SRC) + AMOK_SRC= \ amok/amok_base.c \ amok/Bandwidth/bandwidth.c amok/Bandwidth/saturate.c \ diff --git a/src/Makefile.in b/src/Makefile.in index 6d6b9569fe..f54beca387 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -85,13 +85,14 @@ am__objects_1 = snprintf.lo xbt_str.lo ex.lo xbt_virtu.lo sysdep.lo \ am__objects_2 = gras.lo transport.lo msg.lo rpc.lo timer.lo process.lo \ gras_module.lo ddt_create.lo ddt_convert.lo ddt_exchange.lo \ cbps.lo datadesc.lo ddt_parse.lo ddt_parse.yy.lo -am__objects_3 = rl_stubs.lo xbt_os_thread.lo rl_transport.lo \ +am__objects_3 = xbt_rl_synchro.lo +am__objects_4 = rl_stubs.lo xbt_os_thread.lo rl_transport.lo \ transport_plugin_file.lo transport_plugin_tcp.lo rl_emul.lo \ - rl_process.lo rl_time.lo rl_dns.lo rl_msg.lo -am__objects_4 = amok_base.lo bandwidth.lo saturate.lo \ + rl_process.lo rl_time.lo rl_dns.lo rl_msg.lo $(am__objects_3) +am__objects_5 = amok_base.lo bandwidth.lo saturate.lo \ peermanagement.lo am_libgras_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ - $(am__objects_3) $(am__objects_4) + $(am__objects_4) $(am__objects_5) libgras_la_OBJECTS = $(am_libgras_la_OBJECTS) libgras_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ @@ -130,29 +131,30 @@ am__libsimgrid_la_SOURCES_DIST = xbt/snprintf.c xbt/xbt_str.c xbt/ex.c \ gras/Transport/sg_transport.c \ gras/Transport/transport_plugin_sg.c gras/Virtu/sg_emul.c \ gras/Virtu/sg_process.c gras/Virtu/sg_time.c \ - gras/Virtu/sg_dns.c gras/Msg/sg_msg.c amok/amok_base.c \ - amok/Bandwidth/bandwidth.c amok/Bandwidth/saturate.c \ - amok/PeerManagement/peermanagement.c -am__objects_5 = maxmin.lo lagrange.lo trace_mgr.lo surf.lo \ + gras/Virtu/sg_dns.c gras/Msg/sg_msg.c xbt/xbt_sg_synchro.c \ + amok/amok_base.c amok/Bandwidth/bandwidth.c \ + amok/Bandwidth/saturate.c amok/PeerManagement/peermanagement.c +am__objects_6 = maxmin.lo lagrange.lo trace_mgr.lo surf.lo \ surfxml_parse.lo cpu.lo network.lo workstation.lo \ surf_timer.lo network_dassf.lo workstation_KCCFLN05.lo -am__objects_6 = gtnets_simulator.lo gtnets_topology.lo \ +am__objects_7 = gtnets_simulator.lo gtnets_topology.lo \ gtnets_interface.lo network_gtnets.lo -@USE_GTNETS_TRUE@am__objects_7 = $(am__objects_6) -@HAVE_SDP_TRUE@am__objects_8 = sdp.lo -am__objects_9 = smx_global.lo smx_deployment.lo smx_config.lo \ +@USE_GTNETS_TRUE@am__objects_8 = $(am__objects_7) +@HAVE_SDP_TRUE@am__objects_9 = sdp.lo +am__objects_10 = smx_global.lo smx_deployment.lo smx_config.lo \ smx_environment.lo smx_host.lo smx_process.lo smx_action.lo \ smx_synchro.lo -am__objects_10 = context.lo -am__objects_11 = msg_config.lo task.lo host.lo m_process.lo gos.lo \ +am__objects_11 = context.lo +am__objects_12 = msg_config.lo task.lo host.lo m_process.lo gos.lo \ global.lo environment.lo deployment.lo -am__objects_12 = sd_global.lo sd_link.lo sd_task.lo sd_workstation.lo -am__objects_13 = sg_transport.lo transport_plugin_sg.lo sg_emul.lo \ - sg_process.lo sg_time.lo sg_dns.lo sg_msg.lo -am_libsimgrid_la_OBJECTS = $(am__objects_1) $(am__objects_5) \ - $(am__objects_7) $(am__objects_8) $(am__objects_9) \ - $(am__objects_10) $(am__objects_11) $(am__objects_12) \ - $(am__objects_2) $(am__objects_13) $(am__objects_4) +am__objects_13 = sd_global.lo sd_link.lo sd_task.lo sd_workstation.lo +am__objects_14 = xbt_sg_synchro.lo +am__objects_15 = sg_transport.lo transport_plugin_sg.lo sg_emul.lo \ + sg_process.lo sg_time.lo sg_dns.lo sg_msg.lo $(am__objects_14) +am_libsimgrid_la_OBJECTS = $(am__objects_1) $(am__objects_6) \ + $(am__objects_8) $(am__objects_9) $(am__objects_10) \ + $(am__objects_11) $(am__objects_12) $(am__objects_13) \ + $(am__objects_2) $(am__objects_15) $(am__objects_5) libsimgrid_la_OBJECTS = $(am_libsimgrid_la_OBJECTS) libsimgrid_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ @@ -196,19 +198,19 @@ am__libsimgrid4java_la_SOURCES_DIST = xbt/snprintf.c xbt/xbt_str.c \ gras/Transport/sg_transport.c \ gras/Transport/transport_plugin_sg.c gras/Virtu/sg_emul.c \ gras/Virtu/sg_process.c gras/Virtu/sg_time.c \ - gras/Virtu/sg_dns.c gras/Msg/sg_msg.c amok/amok_base.c \ - amok/Bandwidth/bandwidth.c amok/Bandwidth/saturate.c \ - amok/PeerManagement/peermanagement.c -am__objects_14 = jxbt_context.lo xbt_os_thread.lo -am__objects_15 = jxbt_utilities.lo jmsg.lo jmsg_channel.lo \ + gras/Virtu/sg_dns.c gras/Msg/sg_msg.c xbt/xbt_sg_synchro.c \ + amok/amok_base.c amok/Bandwidth/bandwidth.c \ + amok/Bandwidth/saturate.c amok/PeerManagement/peermanagement.c +am__objects_16 = jxbt_context.lo xbt_os_thread.lo +am__objects_17 = jxbt_utilities.lo jmsg.lo jmsg_channel.lo \ jmsg_host.lo jmsg_parallel_task.lo jmsg_process.lo \ jmsg_task.lo @HAVE_JAVA_TRUE@am_libsimgrid4java_la_OBJECTS = $(am__objects_1) \ -@HAVE_JAVA_TRUE@ $(am__objects_5) $(am__objects_7) \ -@HAVE_JAVA_TRUE@ $(am__objects_8) $(am__objects_9) \ -@HAVE_JAVA_TRUE@ $(am__objects_14) $(am__objects_15) \ -@HAVE_JAVA_TRUE@ $(am__objects_11) $(am__objects_2) \ -@HAVE_JAVA_TRUE@ $(am__objects_13) $(am__objects_4) +@HAVE_JAVA_TRUE@ $(am__objects_6) $(am__objects_8) \ +@HAVE_JAVA_TRUE@ $(am__objects_9) $(am__objects_10) \ +@HAVE_JAVA_TRUE@ $(am__objects_16) $(am__objects_17) \ +@HAVE_JAVA_TRUE@ $(am__objects_12) $(am__objects_2) \ +@HAVE_JAVA_TRUE@ $(am__objects_15) $(am__objects_5) libsimgrid4java_la_OBJECTS = $(am_libsimgrid4java_la_OBJECTS) libsimgrid4java_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ @@ -218,12 +220,12 @@ PROGRAMS = $(noinst_PROGRAMS) am__testall_SOURCES_DIST = ./cunit_unit.c ./ex_unit.c ./dynar_unit.c \ ./dict_unit.c ./set_unit.c ./swag_unit.c ./xbt_str_unit.c \ ./config_unit.c simgrid_units_main.c -@GRAMINE_MODE_FALSE@am__objects_16 = cunit_unit.$(OBJEXT) \ +@GRAMINE_MODE_FALSE@am__objects_18 = cunit_unit.$(OBJEXT) \ @GRAMINE_MODE_FALSE@ ex_unit.$(OBJEXT) dynar_unit.$(OBJEXT) \ @GRAMINE_MODE_FALSE@ dict_unit.$(OBJEXT) set_unit.$(OBJEXT) \ @GRAMINE_MODE_FALSE@ swag_unit.$(OBJEXT) xbt_str_unit.$(OBJEXT) \ @GRAMINE_MODE_FALSE@ config_unit.$(OBJEXT) -@GRAMINE_MODE_FALSE@am_testall_OBJECTS = $(am__objects_16) \ +@GRAMINE_MODE_FALSE@am_testall_OBJECTS = $(am__objects_18) \ @GRAMINE_MODE_FALSE@ simgrid_units_main.$(OBJEXT) testall_OBJECTS = $(am_testall_OBJECTS) @GRAMINE_MODE_FALSE@testall_DEPENDENCIES = libgras.la @@ -492,6 +494,12 @@ XBT_SRC = \ xbt/cunit.c \ xbt/graphxml_parse.c +XBT_RL_SRC = \ + xbt/xbt_rl_synchro.c + +XBT_SG_SRC = \ + xbt/xbt_sg_synchro.c + SURF_SRC = \ surf/maxmin.c \ surf/lagrange.c \ @@ -566,26 +574,16 @@ GRAS_COMMON_SRC = \ gras/DataDesc/datadesc_interface.h gras/DataDesc/datadesc_private.h \ gras/DataDesc/ddt_parse.c gras/DataDesc/ddt_parse.yy.c gras/DataDesc/ddt_parse.yy.h -GRAS_RL_SRC = \ - gras/rl_stubs.c xbt/xbt_os_thread.c \ - \ - gras/Transport/rl_transport.c \ - gras/Transport/transport_plugin_file.c gras/Transport/transport_plugin_tcp.c \ - \ - gras/Virtu/rl_emul.c \ - gras/Virtu/rl_process.c gras/Virtu/rl_time.c \ - gras/Virtu/rl_dns.c\ - \ - gras/Msg/rl_msg.c - -GRAS_SG_SRC = gras/Transport/sg_transport.c gras/Transport/transport_plugin_sg.c \ - \ - gras/Virtu/sg_emul.c \ - gras/Virtu/sg_process.c gras/Virtu/sg_time.c \ - gras/Virtu/sg_dns.c\ - \ - gras/Msg/sg_msg.c - +GRAS_RL_SRC = gras/rl_stubs.c xbt/xbt_os_thread.c \ + gras/Transport/rl_transport.c \ + gras/Transport/transport_plugin_file.c \ + gras/Transport/transport_plugin_tcp.c gras/Virtu/rl_emul.c \ + gras/Virtu/rl_process.c gras/Virtu/rl_time.c \ + gras/Virtu/rl_dns.c gras/Msg/rl_msg.c $(XBT_RL_SRC) +GRAS_SG_SRC = gras/Transport/sg_transport.c \ + gras/Transport/transport_plugin_sg.c gras/Virtu/sg_emul.c \ + gras/Virtu/sg_process.c gras/Virtu/sg_time.c \ + gras/Virtu/sg_dns.c gras/Msg/sg_msg.c $(XBT_SG_SRC) AMOK_SRC = \ amok/amok_base.c \ amok/Bandwidth/bandwidth.c amok/Bandwidth/saturate.c \ @@ -855,6 +853,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbt_matrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbt_os_thread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbt_peer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbt_rl_synchro.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbt_sg_synchro.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbt_str.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbt_str_unit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbt_virtu.Plo@am__quote@ @@ -1237,6 +1237,13 @@ rl_msg.lo: gras/Msg/rl_msg.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o rl_msg.lo `test -f 'gras/Msg/rl_msg.c' || echo '$(srcdir)/'`gras/Msg/rl_msg.c +xbt_rl_synchro.lo: xbt/xbt_rl_synchro.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xbt_rl_synchro.lo -MD -MP -MF $(DEPDIR)/xbt_rl_synchro.Tpo -c -o xbt_rl_synchro.lo `test -f 'xbt/xbt_rl_synchro.c' || echo '$(srcdir)/'`xbt/xbt_rl_synchro.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/xbt_rl_synchro.Tpo $(DEPDIR)/xbt_rl_synchro.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xbt/xbt_rl_synchro.c' object='xbt_rl_synchro.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xbt_rl_synchro.lo `test -f 'xbt/xbt_rl_synchro.c' || echo '$(srcdir)/'`xbt/xbt_rl_synchro.c + amok_base.lo: amok/amok_base.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT amok_base.lo -MD -MP -MF $(DEPDIR)/amok_base.Tpo -c -o amok_base.lo `test -f 'amok/amok_base.c' || echo '$(srcdir)/'`amok/amok_base.c @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/amok_base.Tpo $(DEPDIR)/amok_base.Plo @@ -1552,6 +1559,13 @@ sg_msg.lo: gras/Msg/sg_msg.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sg_msg.lo `test -f 'gras/Msg/sg_msg.c' || echo '$(srcdir)/'`gras/Msg/sg_msg.c +xbt_sg_synchro.lo: xbt/xbt_sg_synchro.c +@am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xbt_sg_synchro.lo -MD -MP -MF $(DEPDIR)/xbt_sg_synchro.Tpo -c -o xbt_sg_synchro.lo `test -f 'xbt/xbt_sg_synchro.c' || echo '$(srcdir)/'`xbt/xbt_sg_synchro.c +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/xbt_sg_synchro.Tpo $(DEPDIR)/xbt_sg_synchro.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='xbt/xbt_sg_synchro.c' object='xbt_sg_synchro.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xbt_sg_synchro.lo `test -f 'xbt/xbt_sg_synchro.c' || echo '$(srcdir)/'`xbt/xbt_sg_synchro.c + jxbt_context.lo: java/jxbt_context.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT jxbt_context.lo -MD -MP -MF $(DEPDIR)/jxbt_context.Tpo -c -o jxbt_context.lo `test -f 'java/jxbt_context.c' || echo '$(srcdir)/'`java/jxbt_context.c @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/jxbt_context.Tpo $(DEPDIR)/jxbt_context.Plo diff --git a/src/include/simix/datatypes.h b/src/include/simix/datatypes.h index 3d69b6fbfd..dfcc5a96a6 100644 --- a/src/include/simix/datatypes.h +++ b/src/include/simix/datatypes.h @@ -10,6 +10,7 @@ #define SIMIX_DATATYPE_H #include "xbt/misc.h" #include "xbt/swag.h" +#include "xbt/fifo.h" SG_BEGIN_DECL() @@ -67,12 +68,16 @@ typedef struct s_smx_simdata_process *smx_simdata_process_t; /** @brief Process datatype @ingroup m_datatypes_management_details @{ */ typedef struct s_smx_process { - char *name; /**< @brief process name if any */ - smx_simdata_process_t simdata; /**< @brief simulator data */ - s_xbt_swag_hookup_t process_hookup; - s_xbt_swag_hookup_t synchro_hookup; - s_xbt_swag_hookup_t host_proc_hookup; - void *data; /**< @brief user data */ + + /* KEEP IT IN SYNC WITH s_xbt_thread_ from src/xbt_sg_thread.h */ + char *name; /**< @brief process name if any */ + smx_simdata_process_t simdata; /**< @brief simulator data */ + s_xbt_swag_hookup_t process_hookup; + s_xbt_swag_hookup_t synchro_hookup; + s_xbt_swag_hookup_t host_proc_hookup; + void *data; /**< @brief user data */ + /* KEEP IT IN SYNC WITH s_smx_process_ from src/xbt_sg_thread.h */ + } s_smx_process_t; /** @} */ /** @brief Agent datatype diff --git a/src/simix/private.h b/src/simix/private.h index a961d898a0..91252f0116 100644 --- a/src/simix/private.h +++ b/src/simix/private.h @@ -69,15 +69,21 @@ typedef struct s_smx_process_arg { /********************************* Mutex and Conditional ****************************/ typedef struct s_smx_mutex { - xbt_swag_t sleeping; /* list of sleeping process */ - int using; + + /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_mutex */ + xbt_swag_t sleeping; /* list of sleeping process */ + int using; + /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_mutex */ } s_smx_mutex_t; typedef struct s_smx_cond { - xbt_swag_t sleeping; /* list of sleeping process */ - smx_mutex_t mutex; - xbt_fifo_t actions; /* list of actions */ + + /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_cond */ + xbt_swag_t sleeping; /* list of sleeping process */ + smx_mutex_t mutex; + xbt_fifo_t actions; /* list of actions */ + /* KEEP IT IN SYNC WITH src/xbt_sg_thread.c::struct s_xbt_cond */ } s_smx_cond_t; diff --git a/src/xbt/xbt_os_thread.c b/src/xbt/xbt_os_thread.c index 91b38feb45..a4b7fa8f6e 100644 --- a/src/xbt/xbt_os_thread.c +++ b/src/xbt/xbt_os_thread.c @@ -23,6 +23,7 @@ #include typedef struct xbt_os_thread_ { + /* KEEP IT IN SYNC WITH xbt_thread.c */ pthread_t t; void *param; pvoid_f_pvoid_t *start_routine; @@ -99,6 +100,7 @@ void xbt_os_thread_yield(void) { } /****** mutex related functions ******/ typedef struct xbt_os_mutex_ { + /* KEEP IT IN SYNC WITH xbt_thread.c */ pthread_mutex_t m; } s_xbt_os_mutex_t; @@ -142,6 +144,7 @@ void xbt_os_mutex_destroy(xbt_os_mutex_t mutex) { /***** condition related functions *****/ typedef struct xbt_os_cond_ { + /* KEEP IT IN SYNC WITH xbt_thread.c */ pthread_cond_t c; } s_xbt_os_cond_t; @@ -191,6 +194,7 @@ void xbt_os_cond_destroy(xbt_os_cond_t cond){ #elif defined(WIN32) typedef struct xbt_os_thread_ { + /* KEEP IT IN SYNC WITH xbt_thread */ HANDLE handle; /* the win thread handle */ unsigned long id; /* the win thread id */ pvoid_f_pvoid_t *start_routine; @@ -272,6 +276,7 @@ void xbt_os_thread_yield(void) { /****** mutex related functions ******/ typedef struct xbt_os_mutex_ { + /* KEEP IT IN SYNC WITH xbt_thread.c */ CRITICAL_SECTION lock; } s_xbt_os_mutex_t; @@ -311,6 +316,7 @@ void xbt_os_mutex_destroy(xbt_os_mutex_t mutex) { }; typedef struct xbt_os_cond_ { + /* KEEP IT IN SYNC WITH xbt_thread.c */ HANDLE events[MAX_EVENTS]; unsigned int waiters_count; /* the number of waiters */ diff --git a/src/xbt/xbt_rl_synchro.c b/src/xbt/xbt_rl_synchro.c new file mode 100644 index 0000000000..1a6b52f48b --- /dev/null +++ b/src/xbt/xbt_rl_synchro.c @@ -0,0 +1,116 @@ +/* $Id$ */ + +/* xbt_synchro -- Synchronization virtualized depending on whether we are */ +/* in simulation or real life (act on simulated processes) */ + +/* This is the real life implementation, using xbt_os_thread to be portable */ +/* to windows and linux. */ + +/* Copyright 2006,2007 Malek Cherier, Martin Quinson + * All right reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "xbt/sysdep.h" +#include "xbt/ex.h" +#include "portable.h" + +#include "xbt/synchro.h" /* This module */ +#include "xbt/xbt_os_thread.h" /* The implementation we use */ + +/* the implementation would be cleaner (and faster) with ELF symbol aliasing */ + + +struct xbt_thread_ { + /* KEEP IT IN SYNC WITH xbt_os_thread (both win and lin parts) */ +#ifdef HAVE_PTHREAD_H + pthread_t t; + void *param; + pvoid_f_pvoid_t *start_routine; +#elif defined(WIN32) + HANDLE handle; /* the win thread handle */ + unsigned long id; /* the win thread id */ + pvoid_f_pvoid_t *start_routine; + void* param; +#endif +}; + +xbt_thread_t xbt_thread_create(pvoid_f_pvoid_t start_routine, + void* param) { + return (xbt_thread_t)xbt_os_thread_create(start_routine,param); +} + +void +xbt_thread_join(xbt_thread_t thread,void ** thread_return) { + xbt_os_thread_join( (xbt_os_thread_t)thread, thread_return ); +} + +void xbt_thread_exit(int *retval) { + xbt_os_thread_exit( retval ); +} + +xbt_thread_t xbt_thread_self(void) { + return (xbt_thread_t)xbt_os_thread_self(); +} + +void xbt_thread_yield(void) { + xbt_os_thread_yield(); +} +/****** mutex related functions ******/ +struct xbt_mutex_ { + /* KEEP IT IN SYNC WITH OS IMPLEMENTATION (both win and lin) */ +#ifdef HAVE_PTHREAD_H + pthread_mutex_t m; +#elif defined(WIN32) + CRITICAL_SECTION lock; +#endif +}; + +xbt_mutex_t xbt_mutex_init(void) { + return (xbt_mutex_t)xbt_os_mutex_init(); +} + +void xbt_mutex_lock(xbt_mutex_t mutex) { + xbt_os_mutex_lock( (xbt_os_mutex_t)mutex ); +} + +void xbt_mutex_unlock(xbt_mutex_t mutex) { + xbt_os_mutex_unlock( (xbt_os_mutex_t)mutex ); +} + +void xbt_mutex_destroy(xbt_mutex_t mutex) { + xbt_os_mutex_destroy( (xbt_os_mutex_t)mutex ); +} + +/***** condition related functions *****/ +typedef struct xbt_cond_ { + /* KEEP IT IN SYNC WITH OS IMPLEMENTATION (both win and lin) */ +#ifdef HAVE_PTHREAD_H + pthread_cond_t c; +#elif defined(WIN32) + HANDLE events[MAX_EVENTS]; + + unsigned int waiters_count; /* the number of waiters */ + CRITICAL_SECTION waiters_count_lock; /* protect access to waiters_count */ +#endif +} s_xbt_cond_t; + +xbt_cond_t xbt_cond_init(void) { + return (xbt_cond_t) xbt_os_cond_init(); +} + +void xbt_cond_wait(xbt_cond_t cond, xbt_mutex_t mutex) { + xbt_os_cond_wait( (xbt_os_cond_t)cond, (xbt_os_mutex_t)mutex ); +} + +void xbt_cond_signal(xbt_cond_t cond) { + xbt_os_cond_signal( (xbt_os_cond_t)cond ); +} + +void xbt_cond_broadcast(xbt_cond_t cond){ + xbt_os_cond_broadcast( (xbt_os_cond_t)cond ); +} +void xbt_cond_destroy(xbt_cond_t cond){ + xbt_os_cond_destroy( (xbt_os_cond_t)cond ); +} diff --git a/src/xbt/xbt_sg_synchro.c b/src/xbt/xbt_sg_synchro.c new file mode 100644 index 0000000000..080ab79e3d --- /dev/null +++ b/src/xbt/xbt_sg_synchro.c @@ -0,0 +1,108 @@ +/* $Id$ */ + +/* xbt_synchro -- Synchronization virtualized depending on whether we are */ +/* in simulation or real life (act on simulated processes) */ + +/* This is the simulation implementation, using simix. */ + +/* Copyright 2006,2007 Malek Cherier, Martin Quinson + * All right reserved. */ + +/* This program is free software; you can redistribute it and/or modify it + * under the terms of the license (GNU LGPL) which comes with this package. */ + +#include "xbt/ex.h" + +#include "xbt/synchro.h" /* This module */ + +#include "simix/simix.h" /* used implementation */ +#include "simix/datatypes.h" + +/* the implementation would be cleaner (and faster) with ELF symbol aliasing */ + +typedef struct s_xbt_thread_ { + /* KEEP IT IN SYNC WITH s_smx_process_ from src/include/simix/datatypes.h */ + char *name; /**< @brief process name if any */ + smx_simdata_process_t simdata; /**< @brief simulator data */ + s_xbt_swag_hookup_t process_hookup; + s_xbt_swag_hookup_t synchro_hookup; + s_xbt_swag_hookup_t host_proc_hookup; + void *data; /**< @brief user data */ + /* KEEP IT IN SYNC WITH s_smx_process_ from src/include/simix/datatypes.h */ +} s_xbt_thread_t; + +xbt_thread_t xbt_thread_create(pvoid_f_pvoid_t start_routine, void* param) { + THROW_UNIMPLEMENTED; /* FIXME */ +} + +void +xbt_thread_join(xbt_thread_t thread,void ** thread_return) { + THROW_UNIMPLEMENTED; /* FIXME */ +} + +void xbt_thread_exit(int *retval) { + THROW_UNIMPLEMENTED; /* FIXME */ +} + +xbt_thread_t xbt_thread_self(void) { + THROW_UNIMPLEMENTED; /* FIXME */ +} + +void xbt_thread_yield(void) { + THROW_UNIMPLEMENTED; /* FIXME */ +} +/****** mutex related functions ******/ +struct s_xbt_mutex_ { + + /* KEEP IT IN SYNC WITH src/simix/private.h::struct s_smx_mutex */ + xbt_swag_t sleeping; /* list of sleeping process */ + int using; + /* KEEP IT IN SYNC WITH src/simix/private.h::struct s_smx_mutex */ + +}; + +xbt_mutex_t xbt_mutex_init(void) { + return (xbt_mutex_t)SIMIX_mutex_init(); +} + +void xbt_mutex_lock(xbt_mutex_t mutex) { + SIMIX_mutex_lock( (smx_mutex_t)mutex) ; +} + +void xbt_mutex_unlock(xbt_mutex_t mutex) { + SIMIX_mutex_unlock( (smx_mutex_t)mutex ); +} + +void xbt_mutex_destroy(xbt_mutex_t mutex) { + SIMIX_mutex_destroy( (smx_mutex_t)mutex ); +} + +/***** condition related functions *****/ +struct s_xbt_cond_ { + + /* KEEP IT IN SYNC WITH src/simix/private.h::struct s_smx_cond */ + xbt_swag_t sleeping; /* list of sleeping process */ + smx_mutex_t mutex; + xbt_fifo_t actions; /* list of actions */ + /* KEEP IT IN SYNC WITH src/simix/private.h::struct s_smx_cond */ + +}; + +xbt_cond_t xbt_cond_init(void) { + return (xbt_cond_t)SIMIX_cond_init(); +} + +void xbt_cond_wait(xbt_cond_t cond, xbt_mutex_t mutex) { + SIMIX_cond_wait( (smx_cond_t)cond , (smx_mutex_t)mutex ); +} + +void xbt_cond_signal(xbt_cond_t cond) { + SIMIX_cond_signal( (smx_cond_t)cond ); +} + +void xbt_cond_broadcast(xbt_cond_t cond){ + SIMIX_cond_broadcast( (smx_cond_t)cond ); +} +void xbt_cond_destroy(xbt_cond_t cond){ + SIMIX_cond_destroy( (smx_cond_t)cond ); +}