From 3e12304ae004284e3186b489f398908e59a8574d Mon Sep 17 00:00:00 2001 From: Olivier Houchard Date: Fri, 27 Jul 2018 17:06:59 +0200 Subject: [PATCH] BUG/MINOR: threads: Handle nbthread == MAX_THREADS. If nbthread is MAX_THREADS, the shift operation needed to compute all_threads_mask fails in thread_sync_init(). Instead pass a number of threads to this function and let it compute the mask without overflowing. This should be backported to 1.8. --- include/common/hathreads.h | 2 +- src/hathreads.c | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) 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; }