#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)
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;
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);
#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)
{