mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-08 08:07:10 +02:00
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:
parent
85d9b84eb1
commit
3e12304ae0
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user