int _mpi_init (char *mpi_type) { int retval = SLURM_SUCCESS; char *plugin_type = "mpi"; char *type = NULL; int got_default = 0; if (init_run && g_context) return retval; slurm_mutex_lock( &context_lock ); if ( g_context ) goto done; if (mpi_type == NULL) { mpi_type = slurm_get_mpi_default(); got_default = 1; } if (mpi_type == NULL) { error("No MPI default set."); retval = SLURM_ERROR; goto done; } if (!strcmp(mpi_type, "list")) { char *plugin_dir; plugrack_t mpi_rack; mpi_rack = plugrack_create(); if (!mpi_rack) { error("Unable to create a plugin manager"); exit(0); } plugrack_set_major_type(mpi_rack, "mpi"); plugin_dir = slurm_get_plugin_dir(); plugrack_read_dir(mpi_rack, plugin_dir); plugrack_print_all_plugin(mpi_rack); exit(0); } setenvf(NULL, "SLURM_MPI_TYPE", "%s", mpi_type); type = xstrdup_printf("mpi/%s", mpi_type); g_context = plugin_context_create( plugin_type, type, (void **)&ops, syms, sizeof(syms)); if (!g_context) { error("cannot create %s context for %s", plugin_type, type); retval = SLURM_ERROR; goto done; } init_run = true; done: xfree(type); if (got_default) xfree(mpi_type); slurm_mutex_unlock( &context_lock ); return retval; }
/* * Resolve the operations from the plugin. */ static slurm_mpi_ops_t * _slurm_mpi_get_ops( slurm_mpi_context_t c ) { /* * These strings must be kept in the same order as the fields * declared for slurm_mpi_ops_t. */ static const char *syms[] = { "p_mpi_hook_slurmstepd_task", "p_mpi_hook_client_prelaunch", "p_mpi_hook_client_single_task_per_node", "p_mpi_hook_client_fini" }; int n_syms = sizeof( syms ) / sizeof( char * ); char *plugin_dir = NULL; /* Find the correct plugin. */ c->cur_plugin = plugin_load_and_link(c->mpi_type, n_syms, syms, (void **) &c->ops); if ( c->cur_plugin != PLUGIN_INVALID_HANDLE ) return &c->ops; error("Couldn't find the specified plugin name for %s " "looking at all files", c->mpi_type); /* Get the plugin list, if needed. */ if ( c->plugin_list == NULL ) { c->plugin_list = plugrack_create(); if ( c->plugin_list == NULL ) { error("Unable to create a plugin manager"); return NULL; } plugrack_set_major_type(c->plugin_list, "mpi"); plugrack_set_paranoia(c->plugin_list, PLUGRACK_PARANOIA_NONE, 0); plugin_dir = slurm_get_plugin_dir(); plugrack_read_dir(c->plugin_list, plugin_dir); xfree(plugin_dir); } if (strcasecmp (c->mpi_type, "mpi/list") == 0) { plugrack_print_all_plugin(c->plugin_list); exit(0); } else { /* Find the correct plugin. */ c->cur_plugin = plugrack_use_by_type(c->plugin_list, c->mpi_type); if ( c->cur_plugin == PLUGIN_INVALID_HANDLE ) { error("can't find a valid plugin for type %s", c->mpi_type); return NULL; } } /* Dereference the API. */ if ( plugin_get_syms( c->cur_plugin, n_syms, syms, (void **) &c->ops ) < n_syms ) { error( "incomplete mpi plugin detected" ); return NULL; } return &c->ops; }