Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Make factory_initializer a static member of ContextFactory.
authorArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Thu, 24 Mar 2022 21:28:48 +0000 (22:28 +0100)
committerArnaud Giersch <arnaud.giersch@univ-fcomte.fr>
Tue, 29 Mar 2022 21:13:09 +0000 (23:13 +0200)
src/bindings/java/JavaContext.cpp
src/bindings/java/jmsg.cpp
src/kernel/EngineImpl.cpp
src/kernel/context/Context.cpp
src/kernel/context/Context.hpp

index d112228..8013b2c 100644 (file)
@@ -21,12 +21,6 @@ namespace simgrid {
 namespace kernel {
 namespace context {
 
-ContextFactory* java_factory()
-{
-  XBT_INFO("Using regular java threads.");
-  return new JavaContextFactory();
-}
-
 JavaContextFactory::JavaContextFactory() : ContextFactory()
 {
   xbt_assert(xbt::binary_name == "java");
index a18f55d..29de926 100644 (file)
@@ -84,7 +84,10 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_init(JNIEnv* env, jclass, jobjec
 {
   env->GetJavaVM(&__java_vm);
 
-  simgrid::kernel::context::factory_initializer = &simgrid::kernel::context::java_factory;
+  simgrid::kernel::context::ContextFactory::initializer = []() {
+    XBT_INFO("Using regular java threads.");
+    return new simgrid::kernel::context::JavaContextFactory();
+  };
   const _jthrowable* exc                        = env->ExceptionOccurred();
   if (exc) {
     env->ExceptionClear();
index 9a0f4ab..04f762e 100644 (file)
@@ -41,7 +41,7 @@ config::Flag<double> cfg_breakpoint{"debug/breakpoint",
                                     "When non-negative, raise a SIGTRAP after given (simulated) time", -1.0};
 config::Flag<bool> cfg_verbose_exit{"debug/verbose-exit", "Display the actor status at exit", true};
 
-constexpr std::initializer_list<std::pair<const char*, context::ContextFactoryInitializer>> context_factories = {
+constexpr std::initializer_list<std::pair<const char*, context::ContextFactory* (*)()>> context_factories = {
 #if HAVE_RAW_CONTEXTS
     {"raw", &context::raw_factory},
 #endif
@@ -255,8 +255,8 @@ void EngineImpl::context_mod_init() const
 #endif
 
   /* select the context factory to use to create the contexts */
-  if (context::factory_initializer != nullptr) { // Give Java a chance to hijack the factory mechanism
-    instance_->set_context_factory(context::factory_initializer());
+  if (context::ContextFactory::initializer) { // Give Java a chance to hijack the factory mechanism
+    instance_->set_context_factory(context::ContextFactory::initializer());
     return;
   }
   /* use the factory specified by --cfg=contexts/factory:value */
index c6728df..875f78d 100644 (file)
@@ -19,7 +19,8 @@ namespace simgrid {
 namespace kernel {
 namespace context {
 
-ContextFactoryInitializer factory_initializer = nullptr;
+std::function<ContextFactory*(void)> ContextFactory::initializer;
+
 static e_xbt_parmap_mode_t parallel_synchronization_mode = XBT_PARMAP_DEFAULT;
 static int parallel_contexts                             = 1;
 unsigned stack_size;
index b0c22c2..d710750 100644 (file)
@@ -35,6 +35,9 @@ public:
 
   virtual void run_all(std::vector<actor::ActorImpl*> const& actors_list) = 0;
 
+  /* This allows Java to hijack the context factory (Java induces factories of factory :) */
+  static std::function<ContextFactory*(void)> initializer;
+
 protected:
   template <class T, class... Args> T* new_context(Args&&... args)
   {
@@ -97,11 +100,6 @@ public:
   virtual void attach_stop() = 0;
 };
 
-
-/* This allows Java to hijack the context factory (Java induces factories of factory :) */
-using ContextFactoryInitializer = ContextFactory* (*)();
-XBT_PUBLIC_DATA ContextFactoryInitializer factory_initializer;
-
 XBT_PRIVATE ContextFactory* thread_factory();
 XBT_PRIVATE ContextFactory* sysv_factory();
 XBT_PRIVATE ContextFactory* raw_factory();