Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use real threads for xbt_dynar_dopar.
[simgrid.git] / src / xbt / xbt_synchro.c
index 5b78e0a..a2349d8 100644 (file)
 #include "xbt/sysdep.h"
 #include "xbt/dynar.h"
 #include "xbt/synchro.h"
+#include "xbt/xbt_os_thread.h"
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_sync);
 
 typedef struct {
   xbt_dynar_t data;
   int rank;
   void_f_int_pvoid_t function;
-  xbt_thread_t worker;
+  xbt_os_thread_t worker;
 } s_worker_data_t, *worker_data_t;
 
 static void worker_wait_n_free(void *w)
 {
   worker_data_t worker = *(worker_data_t *) w;
-  xbt_thread_join(worker->worker);
+  xbt_os_thread_join(worker->worker, NULL);
   xbt_free(worker);
 }
 
-static void worker_wrapper(void *w)
+static void *worker_wrapper(void *w)
 {
   worker_data_t me = (worker_data_t) w;
-  (*me->function) (me->rank, xbt_dynar_get_ptr(me->data, me->rank));
+  me->function(me->rank, xbt_dynar_get_ptr(me->data, me->rank));
+  return NULL;
 }
 
 void xbt_dynar_dopar(xbt_dynar_t datas, void_f_int_pvoid_t function)
@@ -38,15 +40,15 @@ void xbt_dynar_dopar(xbt_dynar_t datas, void_f_int_pvoid_t function)
       xbt_dynar_new(sizeof(worker_data_t), worker_wait_n_free);
   unsigned int cursor;
   void *data;
-  if (xbt_dynar_length(datas) == 0)
+  if (xbt_dynar_is_empty(datas))
     return;                     /* nothing to do */
   if (xbt_dynar_length(datas) == 1) {
     /* don't start any new thread, do it directly */
-    (*function) (0, xbt_dynar_get_ptr(datas, 0));
+    function(0, xbt_dynar_get_ptr(datas, 0));
     return;
   }
   /* Start all workers */
-  XBT_DEBUG("Dopar for %ld elements", xbt_dynar_length(datas));
+  XBT_DEBUG("Dopar for %lu elements", xbt_dynar_length(datas));
   xbt_dynar_foreach(datas, cursor, data) {
     worker_data_t w = xbt_new0(s_worker_data_t, 1);
     w->data = datas;
@@ -54,8 +56,7 @@ void xbt_dynar_dopar(xbt_dynar_t datas, void_f_int_pvoid_t function)
     w->rank = cursor;
     xbt_dynar_push(workers, &w);
     w->worker =
-        xbt_thread_create("dopar worker", worker_wrapper, w,
-                          1 /*joinable */ );
+        xbt_os_thread_create("dopar worker", worker_wrapper, w, NULL);
   }
   /* wait them all */
   xbt_dynar_free(&workers);
@@ -66,8 +67,7 @@ void xbt_dynar_dopar(xbt_dynar_t datas, void_f_int_pvoid_t function)
 #include "xbt/synchro.h"
 
 XBT_TEST_SUITE("synchro", "Advanced synchronization mecanisms");
-XBT_LOG_EXTERNAL_CATEGORY(xbt_dyn);
-XBT_LOG_DEFAULT_CATEGORY(xbt_dyn);
+XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(xbt_dyn);
 
 static void add100(int rank, void *data)
 {