- /* 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);
- } else {
-#ifdef CONTEXT_THREADS
- /* context switch based os thread */
- SIMIX_ctx_thread_factory_init(&simix_global->context_factory);
-#elif defined(CONTEXT_UCONTEXT)
- /* context switch based ucontext */
- SIMIX_ctx_sysv_factory_init(&simix_global->context_factory);
-#elif defined(_XBT_WIN32)
- /* context switch based windows */
-#else
- /* context switch is not allowed on Windows */
-#error ERROR [__FILE__, line __LINE__]: no context based implementation specified.
-#endif
+ /* select the context factory to use to create the contexts */
+ if (smx_factory_initializer_to_use) {
+ (*smx_factory_initializer_to_use)(&(simix_global->context_factory));
+ }
+ else { /* use the factory specified by --cfg=contexts/factory:value */
+ if (smx_context_factory_name == NULL || !strcmp(smx_context_factory_name, "ucontext")) {
+ /* use ucontext */
+ SIMIX_ctx_sysv_factory_init(&simix_global->context_factory);
+ }
+ else if (!strcmp(smx_context_factory_name, "thread")) {
+ /* use os threads (either pthreads or windows ones) */
+ SIMIX_ctx_thread_factory_init(&simix_global->context_factory);
+ }
+ else if (!strcmp(smx_context_factory_name, "raw")) {
+ /* use raw contexts */
+ SIMIX_ctx_raw_factory_init(&simix_global->context_factory);
+ }
+ else {
+ xbt_die("Invalid context factory specified");
+ }