+typedef enum {
+ XBT_PARMAP_WORK = 0,
+ XBT_PARMAP_DESTROY
+} e_xbt_parmap_flag_t;
+
+static void xbt_parmap_set_mode(xbt_parmap_t parmap, e_xbt_parmap_mode_t mode);
+static void *xbt_parmap_worker_main(void *parmap);
+
+static void xbt_parmap_posix_start(xbt_parmap_t parmap);
+static void xbt_parmap_posix_end(xbt_parmap_t parmap);
+static void xbt_parmap_posix_signal(xbt_parmap_t parmap);
+static void xbt_parmap_posix_wait(xbt_parmap_t parmap);
+
+#ifdef HAVE_FUTEX_H
+static void xbt_parmap_futex_start(xbt_parmap_t parmap);
+static void xbt_parmap_futex_end(xbt_parmap_t parmap);
+static void xbt_parmap_futex_signal(xbt_parmap_t parmap);
+static void xbt_parmap_futex_wait(xbt_parmap_t parmap);
+static void futex_wait(int *uaddr, int val);
+static void futex_wake(int *uaddr, int val);
+#endif
+
+static void xbt_parmap_busy_start(xbt_parmap_t parmap);
+static void xbt_parmap_busy_end(xbt_parmap_t parmap);
+static void xbt_parmap_busy_signal(xbt_parmap_t parmap);
+static void xbt_parmap_busy_wait(xbt_parmap_t parmap);
+
+
+/**
+ * \brief Parallel map structure
+ */
+typedef struct s_xbt_parmap {
+ e_xbt_parmap_flag_t status; /**< is the parmap active or being destroyed? */
+ int work; /**< index of the current round (1 is the first) */
+ int done; /**< number of rounds already done (futexes only) */
+ unsigned int thread_counter; /**< number of threads currently working */
+ unsigned int num_workers; /**< total number of worker threads including the controller */
+ void_f_pvoid_t fun; /**< function to run in parallel on each element of data */
+ xbt_dynar_t data; /**< parameters to pass to fun in parallel */
+ unsigned int index; /**< index of the next element of data to pick */
+
+ /* fields that depend on the synchronization mode */
+ e_xbt_parmap_mode_t mode; /**< synchronization mode */
+ void (*start_f)(xbt_parmap_t); /**< initializes the worker threads */
+ void (*end_f)(xbt_parmap_t); /**< finalizes the worker threads */
+ void (*signal_f)(xbt_parmap_t); /**< wakes the workers threads to process tasks */
+ void (*wait_f)(xbt_parmap_t); /**< waits for more work */
+} s_xbt_parmap_t;
+
+/**
+ * \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_new(unsigned int num_workers, e_xbt_parmap_mode_t mode)