diff --git a/include/common/hathreads.h b/include/common/hathreads.h index 4aa6543fa..35b6e6eac 100644 --- a/include/common/hathreads.h +++ b/include/common/hathreads.h @@ -252,7 +252,7 @@ static inline void __ha_barrier_full(void) #define THREAD_NO_SYNC() thread_no_sync() #define THREAD_NEED_SYNC() thread_need_sync() -int thread_sync_init(unsigned long mask); +int thread_sync_init(int nbthread); void thread_sync_enable(void); void thread_want_sync(void); void thread_enter_sync(void); diff --git a/src/hathreads.c b/src/hathreads.c index fa9993bd0..c0c5956f5 100644 --- a/src/hathreads.c +++ b/src/hathreads.c @@ -37,11 +37,11 @@ volatile unsigned long all_threads_mask = 0; struct lock_stat lock_stats[LOCK_LABELS]; #endif -/* Initializes the sync point. It creates a pipe used by threads to wakup all - * others when a sync is requested. It also initialize the mask of all create +/* Initializes the sync point. It creates a pipe used by threads to wake up all + * others when a sync is requested. It also initializes the mask of all created * threads. It returns 0 on success and -1 if an error occurred. */ -int thread_sync_init(unsigned long mask) +int thread_sync_init(int nbthread) { int rfd; @@ -52,7 +52,9 @@ int thread_sync_init(unsigned long mask) fcntl(rfd, F_SETFL, O_NONBLOCK); fd_insert(rfd, thread_sync_io_handler, thread_sync_io_handler, MAX_THREADS_MASK); - all_threads_mask = mask; + /* we proceed like this to be sure never to overflow the left shift */ + all_threads_mask = 1UL << (nbthread - 1); + all_threads_mask |= all_threads_mask - 1; return 0; }