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.
This commit is contained in:
Olivier Houchard 2018-07-27 17:06:59 +02:00 committed by Willy Tarreau
parent 85d9b84eb1
commit 3e12304ae0
2 changed files with 7 additions and 5 deletions

View File

@ -252,7 +252,7 @@ static inline void __ha_barrier_full(void)
#define THREAD_NO_SYNC() thread_no_sync() #define THREAD_NO_SYNC() thread_no_sync()
#define THREAD_NEED_SYNC() thread_need_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_sync_enable(void);
void thread_want_sync(void); void thread_want_sync(void);
void thread_enter_sync(void); void thread_enter_sync(void);

View File

@ -37,11 +37,11 @@ volatile unsigned long all_threads_mask = 0;
struct lock_stat lock_stats[LOCK_LABELS]; struct lock_stat lock_stats[LOCK_LABELS];
#endif #endif
/* Initializes the sync point. It creates a pipe used by threads to wakup all /* Initializes the sync point. It creates a pipe used by threads to wake up all
* others when a sync is requested. It also initialize the mask of all create * 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. * 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; int rfd;
@ -52,7 +52,9 @@ int thread_sync_init(unsigned long mask)
fcntl(rfd, F_SETFL, O_NONBLOCK); fcntl(rfd, F_SETFL, O_NONBLOCK);
fd_insert(rfd, thread_sync_io_handler, thread_sync_io_handler, MAX_THREADS_MASK); 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; return 0;
} }