- static void futex_wait(int *uaddr, int val)
- {
- DEBUG1("Waiting on futex %d", *uaddr);
- syscall(SYS_futex, uaddr, FUTEX_WAIT_PRIVATE, val, NULL, NULL, 0);
- }
-
- static void futex_wake(int *uaddr, int val)
- {
- DEBUG1("Waking futex %d", *uaddr);
- syscall(SYS_futex, uaddr, FUTEX_WAKE_PRIVATE, val, NULL, NULL, 0);
- }
+static void futex_wait(int *uaddr, int val)
+{
+ XBT_VERB("Waiting on futex %p", uaddr);
+ syscall(SYS_futex, uaddr, FUTEX_WAIT_PRIVATE, val, NULL, NULL, 0);
+}
+
+static void futex_wake(int *uaddr, int val)
+{
+ XBT_VERB("Waking futex %p", uaddr);
+ syscall(SYS_futex, uaddr, FUTEX_WAKE_PRIVATE, val, NULL, NULL, 0);
+}
+#endif
+
+/**
+ * \brief Starts the parmap: waits for all workers to be ready and returns.
+ *
+ * This function is called by the controller thread.
+ *
+ * \param parmap a parmap
+ */
+static void xbt_parmap_start(xbt_parmap_t parmap)
+{
+#ifdef HAVE_FUTEX_H
+ int myflag = parmap->done;
+ if (parmap->thread_counter < parmap->num_workers) {
+ /* wait for all workers to be ready */
+ futex_wait(&parmap->done, myflag);
+ }
+#endif
+}
+
+/**
+ * \brief Wakes all workers and waits for them to finish the tasks.
+ *
+ * This function is called by the controller thread.
+ *
+ * \param parmap a parmap
+ */
+static void xbt_parmap_signal(xbt_parmap_t parmap)
+{
+#ifdef HAVE_FUTEX_H
+ int myflag = parmap->done;
+ parmap->thread_counter = 0;
+ parmap->work++;
+
+ /* wake all workers */
+ futex_wake(&parmap->work, parmap->num_workers);
+
+ /* wait for all of them to finish */
+ futex_wait(&parmap->done, myflag);