From aa4388c7780ebcbc130f17b5e473f4d356ec567f Mon Sep 17 00:00:00 2001 From: mquinson Date: Fri, 26 Nov 2010 21:43:29 +0000 Subject: [PATCH] Reduce the coupling between main library and ruby bindings Instead of using a char*xbt_ctx_factory_to_use and then having SIMIX_context_select_factory() finding the right function from that name (which induces having SIMIX_context_select_factory hardcoding a call to the factory initializer), use a direct pointer to that initializer From RUBY: -extern const char *xbt_ctx_factory_to_use; +typedef void (*SIMIX_ctx_factory_initializer_t)(smx_context_factory_t*); +extern SIMIX_ctx_factory_initializer_t factory_initializer_to_use; - xbt_ctx_factory_to_use = "ruby"; + factory_initializer_to_use = SIMIX_ctx_ruby_factory_init; From main lib: - if (xbt_ctx_factory_to_use) { - SIMIX_context_select_factory(xbt_ctx_factory_to_use); + if (factory_initializer_to_use) { + (*factory_initializer_to_use)(&(simix_global->context_factory)); (and kill any occurence of SIMIX_ctx_ruby_factory_init() in main lib Also inlined the SIMIX_context_init_factory_by_name() function which was called from only one location. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@8688 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/bindings/ruby/simgrid_ruby.c | 7 +++-- src/simix/private.h | 6 ----- src/simix/smx_context.c | 45 ++++++++++---------------------- 3 files changed, 19 insertions(+), 39 deletions(-) diff --git a/src/bindings/ruby/simgrid_ruby.c b/src/bindings/ruby/simgrid_ruby.c index 5ac81ec155..f77f534bc9 100644 --- a/src/bindings/ruby/simgrid_ruby.c +++ b/src/bindings/ruby/simgrid_ruby.c @@ -148,12 +148,15 @@ static VALUE msg_get_clock(VALUE class) } -extern const char *xbt_ctx_factory_to_use; /*Hack: let msg load directly the right factory */ +/*Hack: let msg load directly the right factory */ +typedef void (*SIMIX_ctx_factory_initializer_t)(smx_context_factory_t *); +extern SIMIX_ctx_factory_initializer_t factory_initializer_to_use; + typedef VALUE(*rb_meth) (ANYARGS); void Init_libsimgrid() { - xbt_ctx_factory_to_use = "ruby"; + factory_initializer_to_use = SIMIX_ctx_ruby_factory_init; // Modules rb_msg = rb_define_module("MSG"); diff --git a/src/simix/private.h b/src/simix/private.h index 5915f97a3d..9fb1e627ea 100644 --- a/src/simix/private.h +++ b/src/simix/private.h @@ -220,12 +220,6 @@ void SIMIX_context_mod_exit(void); */ int SIMIX_context_select_factory(const char *name); -/* Initializes a context factory from the name specified by the parameter name. - * If the factory cannot be found, an exception is raised. - */ -void SIMIX_context_init_factory_by_name(smx_context_factory_t * factory, - const char *name); - /* All factories init */ void SIMIX_ctx_thread_factory_init(smx_context_factory_t * factory); diff --git a/src/simix/smx_context.c b/src/simix/smx_context.c index 560a909668..3b42c8203f 100644 --- a/src/simix/smx_context.c +++ b/src/simix/smx_context.c @@ -15,25 +15,22 @@ #include #endif -#ifdef HAVE_RUBY -void SIMIX_ctx_ruby_factory_init(smx_context_factory_t * factory); -#endif - XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_context, simix, "Context switching mecanism"); const char *xbt_ctx_factory_to_use = NULL; +typedef void (*SIMIX_ctx_factory_initializer_t)(smx_context_factory_t *); +SIMIX_ctx_factory_initializer_t factory_initializer_to_use = NULL; /** - * This function is call by SIMIX_global_init() to initialize the context module. + * This function is called by SIMIX_global_init() to initialize the context module. */ - void SIMIX_context_mod_init(void) { if (!simix_global->context_factory) { /* select context factory to use to create the context(depends of the macro definitions) */ - if (xbt_ctx_factory_to_use) { - SIMIX_context_select_factory(xbt_ctx_factory_to_use); + if (factory_initializer_to_use) { + (*factory_initializer_to_use)(&(simix_global->context_factory)); } else { #ifdef CONTEXT_THREADS /* context switch based os thread */ @@ -95,22 +92,7 @@ int SIMIX_context_select_factory(const char *name) } /* init the desired factory */ - SIMIX_context_init_factory_by_name(&simix_global->context_factory, name); - - SIMIX_create_maestro_process(); - - - - return 0; -} - -/** - * Initializes a context factory given by its name - */ -void SIMIX_context_init_factory_by_name(smx_context_factory_t * factory, - const char *name) -{ - + smx_context_factory_t * factory = &simix_global->context_factory; if (!strcmp(name, "java")) #ifdef HAVE_JAVA SIMIX_ctx_java_factory_init(factory); @@ -143,13 +125,14 @@ void SIMIX_context_init_factory_by_name(smx_context_factory_t * factory, "Factory 'lua' does not exist: Lua support was not compiled in the SimGrid library"); #endif /* HAVE_LUA */ - else if (!strcmp(name, "ruby")) -#ifdef HAVE_RUBY - SIMIX_ctx_ruby_factory_init(factory); -#else - THROW0(not_found_error, 0, - "Factory 'ruby' does not exist: Ruby support was not compiled in the SimGrid library"); -#endif else THROW1(not_found_error, 0, "Factory '%s' does not exist", name); + + + + + SIMIX_create_maestro_process(); + + return 0; } + -- 2.20.1