X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/a889c5815b75beb11f858bab68b2314c8dc724c2..0630e3ce62f6740b2717aa082806a9874bc7593f:/include/xbt/parmap.h diff --git a/include/xbt/parmap.h b/include/xbt/parmap.h index e941c9e2b8..b2e66dc7a4 100644 --- a/include/xbt/parmap.h +++ b/include/xbt/parmap.h @@ -6,41 +6,52 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#ifndef _XBT_THREADPOOL_H -#define _XBT_THREADPOOL_H +#ifndef _XBT_PARMAP_H +#define _XBT_PARMAP_H #include "xbt/misc.h" /* SG_BEGIN_DECL */ #include "xbt/function_types.h" +#include "xbt/dynar.h" SG_BEGIN_DECL() -/** @addtogroup XBT_threadpool - * @brief Pool of threads. +/** \addtogroup XBT_parmap + * \brief Parallel map. * - * Jobs can be queued and the dispacher process can wait for the completion - * of all jobs. - * The call to "queue job" is non-blocking except the maximum amount of - * queued jobs is reached. In that case, it will block until a job is taken - * by a worker - * @{ + * A function is applied to all elements of a dynar in parallel with n worker + * threads. + * The worker threads are persistent until the destruction of the parmap. + * + * If there are more than n elements in the dynar, the worker threads are + * allowed to fetch themselves remaining work with xbt_parmap_next() and + * execute it. + * + * \{ */ - /** \brief Queue data type (opaque type) */ - -typedef struct s_xbt_tpool *xbt_tpool_t; -XBT_PUBLIC(xbt_tpool_t) xbt_tpool_new(unsigned int num_workers, - unsigned int max_jobs); +/** \brief Parallel map data type (opaque type) */ +typedef struct s_xbt_parmap *xbt_parmap_t; -XBT_PUBLIC(void) xbt_tpool_queue_job(xbt_tpool_t tpool, - void_f_pvoid_t fun, - void* fun_arg); +/** + * \brief Synchronization mode of the worker threads of a parmap. + */ +typedef enum { + XBT_PARMAP_POSIX, /**< use POSIX synchronization primitives */ + XBT_PARMAP_FUTEX, /**< use Linux futex system call */ + XBT_PARMAP_BUSY_WAIT /**< busy waits (no system calls, maximum CPU usage) */ +} e_xbt_parmap_mode_t; -XBT_PUBLIC(void) xbt_tpool_wait_all(xbt_tpool_t tpool); +XBT_PUBLIC(xbt_parmap_t) xbt_parmap_new(unsigned int num_workers, + e_xbt_parmap_mode_t mode); +XBT_PUBLIC(void) xbt_parmap_destroy(xbt_parmap_t parmap); -XBT_PUBLIC(void) xbt_tpool_destroy(xbt_tpool_t tpool); +XBT_PUBLIC(void) xbt_parmap_apply(xbt_parmap_t parmap, + void_f_pvoid_t fun, + xbt_dynar_t data); +XBT_PUBLIC(void*) xbt_parmap_next(xbt_parmap_t parmap); -/** @} */ +/** \} */ SG_END_DECL() -#endif \ No newline at end of file +#endif