+ xbt_parmap_thread_data_t data;
+ parmap->workers[0] = NULL;
+#ifdef CORE_BINDING
+ unsigned int core_bind = 0;
+#endif
+ for (i = 1; i < num_workers; i++) {
+ data = xbt_new0(s_xbt_parmap_thread_data_t, 1);
+ data->parmap = parmap;
+ data->worker_id = i;
+ parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_worker_main,
+ data, NULL);
+#ifdef CORE_BINDING
+ xbt_os_thread_bind(parmap->workers[i], core_bind);
+ if(core_bind!=xbt_os_get_numcores()){
+ core_bind++;
+ } else {
+ core_bind = 0;
+ }
+#endif
+ }
+ return parmap;
+}
+
+#ifdef HAVE_MC
+/**
+ * \brief Creates a parallel map object
+ * \param num_workers number of worker threads to create
+ * \param mode how to synchronize the worker threads
+ * \return the parmap created
+ */
+xbt_parmap_t xbt_parmap_mc_new(unsigned int num_workers, e_xbt_parmap_mode_t mode)
+{
+ unsigned int i;
+
+ XBT_DEBUG("Create new parmap (%u workers)", num_workers);
+
+ /* Initialize the thread pool data structure */
+ xbt_parmap_t parmap = xbt_new0(s_xbt_parmap_t, 1);
+ parmap->workers = xbt_new(xbt_os_thread_t, num_workers);
+
+ parmap->num_workers = num_workers;
+ parmap->status = XBT_PARMAP_WORK;
+ xbt_parmap_set_mode(parmap, mode);
+
+ /* Create the pool of worker threads */
+ xbt_parmap_thread_data_t data;
+ parmap->workers[0] = NULL;
+ for (i = 1; i < num_workers; i++) {
+ data = xbt_new0(s_xbt_parmap_thread_data_t, 1);
+ data->parmap = parmap;
+ data->worker_id = i;
+ parmap->workers[i] = xbt_os_thread_create(NULL, xbt_parmap_mc_worker_main,
+ data, NULL);