From 0422f87bcc20ad1e5e1e3a9d4926da7a9da06706 Mon Sep 17 00:00:00 2001 From: Augustin Degomme Date: Tue, 6 May 2014 18:09:39 +0200 Subject: [PATCH] have barrier_wait return XBT/MSG_BARRIER_SERIAL_PROCESS for one process Also have it reset the counter when barrier is completed, to allow reuse --- include/msg/msg.h | 4 +++- include/xbt/synchro_core.h | 3 ++- src/msg/msg_synchro.c | 7 +++++-- src/xbt/xbt_sg_synchro.c | 7 ++++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/msg/msg.h b/include/msg/msg.h index 3ff9838add..341afa20d8 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -421,10 +421,12 @@ XBT_PUBLIC(int) MSG_sem_would_block(msg_sem_t sem); * @ingroup msg_synchro * @hideinitializer */ + +#define MSG_BARRIER_SERIAL_PROCESS -1 typedef struct s_xbt_bar *msg_bar_t; XBT_PUBLIC(msg_bar_t) MSG_barrier_init( unsigned int count); XBT_PUBLIC(void) MSG_barrier_destroy(msg_bar_t bar); -XBT_PUBLIC(void) MSG_barrier_wait(msg_bar_t bar); +XBT_PUBLIC(int) MSG_barrier_wait(msg_bar_t bar); /** @brief Opaque type describing a Virtual Machine. * @ingroup msg_VMs diff --git a/include/xbt/synchro_core.h b/include/xbt/synchro_core.h index 5313a9c448..d4274884c7 100644 --- a/include/xbt/synchro_core.h +++ b/include/xbt/synchro_core.h @@ -107,10 +107,11 @@ XBT_PUBLIC(void) xbt_cond_broadcast(xbt_cond_t cond); XBT_PUBLIC(void) xbt_cond_destroy(xbt_cond_t cond); +#define XBT_BARRIER_SERIAL_PROCESS -1 typedef struct s_xbt_bar_ *xbt_bar_t; XBT_PUBLIC(xbt_bar_t) xbt_barrier_init( unsigned int count); XBT_PUBLIC(void) xbt_barrier_destroy(xbt_bar_t bar); -XBT_PUBLIC(void) xbt_barrier_wait(xbt_bar_t bar); +XBT_PUBLIC(int) xbt_barrier_wait(xbt_bar_t bar); /** @} */ diff --git a/src/msg/msg_synchro.c b/src/msg/msg_synchro.c index 186fcefccf..70f13837fc 100644 --- a/src/msg/msg_synchro.c +++ b/src/msg/msg_synchro.c @@ -76,8 +76,11 @@ void MSG_barrier_destroy(msg_bar_t bar) { } /** @brief Performs a barrier already initialized */ -void MSG_barrier_wait(msg_bar_t bar) { - xbt_barrier_wait((xbt_bar_t)bar); +int MSG_barrier_wait(msg_bar_t bar) { + if(xbt_barrier_wait((xbt_bar_t)bar) == XBT_BARRIER_SERIAL_PROCESS) + return MSG_BARRIER_SERIAL_PROCESS; + else + return 0; } /**@}*/ diff --git a/src/xbt/xbt_sg_synchro.c b/src/xbt/xbt_sg_synchro.c index e04f5a14f3..724755b2ae 100644 --- a/src/xbt/xbt_sg_synchro.c +++ b/src/xbt/xbt_sg_synchro.c @@ -204,16 +204,21 @@ xbt_bar_t xbt_barrier_init(unsigned int count) } -void xbt_barrier_wait(xbt_bar_t bar) +int xbt_barrier_wait(xbt_bar_t bar) { + int ret=0; xbt_mutex_acquire(bar->mutex); if (++bar->arrived_processes == bar->expected_processes) { xbt_cond_broadcast(bar->cond); xbt_mutex_release(bar->mutex); + ret=XBT_BARRIER_SERIAL_PROCESS; + bar->arrived_processes = 0; } else { xbt_cond_wait(bar->cond, bar->mutex); xbt_mutex_release(bar->mutex); } + + return ret; } void xbt_barrier_destroy(xbt_bar_t bar) -- 2.20.1