#define ha_sigmask(how, set, oldset) sigprocmask(how, set, oldset)
-static inline void ha_set_tid(unsigned int tid)
+/* Sets the current thread to a valid one described by <thr>, or to any thread
+ * and any group if NULL (e.g. for use during boot where they're not totally
+ * initialized).
+ */
+static inline void ha_set_thread(const struct thread_info *thr)
{
- ti = &ha_thread_info[tid];
- tg = ti->tg ? ti->tg : &ha_tgroup_info[0];
- th_ctx = &ha_thread_ctx[tid];
+ if (thr) {
+ ti = thr;
+ tg = ti->tg;
+ th_ctx = &ha_thread_ctx[ti->tid];
+ } else {
+ ti = &ha_thread_info[0];
+ tg = &ha_tgroup_info[0];
+ th_ctx = &ha_thread_ctx[0];
+ }
}
static inline void thread_idle_now()
#define ha_sigmask(how, set, oldset) pthread_sigmask(how, set, oldset)
-/* sets the thread ID, TID bit and thread cfg/ctx pointers for the current
- * thread. Since it may be called during early boot even before threads are
- * initialized, we have to be extra careful about some fields which may still
- * be null. For example tg may be null during a part of the boot.
+/* Sets the current thread to a valid one described by <thr>, or to any thread
+ * and any group if NULL (e.g. for use during boot where they're not totally
+ * initialized).
*/
-static inline void ha_set_tid(unsigned int data)
+static inline void ha_set_thread(const struct thread_info *thr)
{
- tid = data;
- tid_bit = (1UL << tid);
- ti = &ha_thread_info[tid];
- tg = ti->tg ? ti->tg : &ha_tgroup_info[0];
- th_ctx = &ha_thread_ctx[tid];
+ if (thr) {
+ BUG_ON(!thr->tid_bit);
+ BUG_ON(!thr->tg);
+
+ ti = thr;
+ tg = thr->tg;
+ tid = thr->tid;
+ tid_bit = thr->tid_bit;
+ th_ctx = &ha_thread_ctx[tid];
+ } else {
+ tid = 0;
+ tid_bit = 1;
+ ti = &ha_thread_info[0];
+ tg = &ha_tgroup_info[0];
+ th_ctx = &ha_thread_ctx[0];
+ }
}
/* Marks the thread as idle, which means that not only it's not doing anything
/* per-boot randomness */
unsigned char boot_seed[20]; /* per-boot random seed (160 bits initially) */
+/* takes the thread config in argument or NULL for any thread */
static void *run_thread_poll_loop(void *data);
/* bitfield of a few warnings to emit just once (WARN_*) */
leave */
fork_poller();
- run_thread_poll_loop(0);
+ run_thread_poll_loop(NULL);
}
/*
__decl_thread(static pthread_mutex_t init_mutex = PTHREAD_MUTEX_INITIALIZER);
__decl_thread(static pthread_cond_t init_cond = PTHREAD_COND_INITIALIZER);
- ha_set_tid((unsigned long)data);
+ ha_set_thread(data);
set_thread_cpu_affinity();
clock_set_local_source();
haproxy_unblock_signals();
/* Finally, start the poll loop for the first thread */
- run_thread_poll_loop(0);
+ run_thread_poll_loop(&ha_thread_info[0]);
/* wait for all threads to terminate */
wait_for_threads_completion();
/* loading for global state */
hlua_state_id = 0;
- ha_set_tid(0);
+ ha_set_thread(NULL);
return hlua_load_state(args[1], hlua_states[0], err);
}
/* loading for thread 1 only */
hlua_state_id = 1;
- ha_set_tid(0);
+ ha_set_thread(NULL);
return hlua_load_state(args[1], hlua_states[1], err);
}
/* Perform post init of common thread */
hlua_state_id = 0;
- ha_set_tid(0);
+ ha_set_thread(&ha_thread_info[0]);
ret = hlua_post_init_state(hlua_states[hlua_state_id]);
if (ret == 0)
return 0;
for (hlua_state_id = 2; hlua_state_id < global.nbthread + 1; hlua_state_id++) {
/* set thread context */
- ha_set_tid(hlua_state_id - 1);
+ ha_set_thread(&ha_thread_info[hlua_state_id - 1]);
/* Init lua state */
hlua_states[hlua_state_id] = hlua_init_state(hlua_state_id);
}
/* Reset thread context */
- ha_set_tid(0);
+ ha_set_thread(NULL);
/* Execute post init for all states */
for (hlua_state_id = 1; hlua_state_id < global.nbthread + 1; hlua_state_id++) {
/* set thread context */
- ha_set_tid(hlua_state_id - 1);
+ ha_set_thread(&ha_thread_info[hlua_state_id - 1]);
/* run post init */
ret = hlua_post_init_state(hlua_states[hlua_state_id]);
}
/* Reset thread context */
- ha_set_tid(0);
+ ha_set_thread(NULL);
/* control functions registering. Each function must have:
* - only the function_ref[0] set positive and all other to -1
/* Init state for common/shared lua parts */
hlua_state_id = 0;
- ha_set_tid(0);
+ ha_set_thread(NULL);
hlua_states[0] = hlua_init_state(0);
/* Init state 1 for thread 0. We have at least one thread. */
hlua_state_id = 1;
- ha_set_tid(0);
+ ha_set_thread(NULL);
hlua_states[1] = hlua_init_state(1);
/* Proxy and server configuration initialisation. */
/* Create nbthread-1 thread. The first thread is the current process */
ha_pthread[0] = pthread_self();
for (i = 1; i < global.nbthread; i++)
- pthread_create(&ha_pthread[i], NULL, handler, (void *)(long)i);
+ pthread_create(&ha_pthread[i], NULL, handler, &ha_thread_info[i]);
}
/* waits for all threads to terminate. Does nothing when threads are