MINOR: threads: Use __decl_hathreads to declare locks
This macro should be used to declare variables or struct members depending on
the USE_THREAD compile option. It avoids the encapsulation of such declarations
between #ifdef/#endif. It is used to declare all lock variables.
diff --git a/include/common/buffer.h b/include/common/buffer.h
index acaa79a..4216d93 100644
--- a/include/common/buffer.h
+++ b/include/common/buffer.h
@@ -52,9 +52,7 @@
extern struct buffer buf_empty;
extern struct buffer buf_wanted;
extern struct list buffer_wq;
-#ifdef USE_THREAD
-extern HA_SPINLOCK_T buffer_wq_lock;
-#endif
+__decl_hathreads(HA_SPINLOCK_T buffer_wq_lock);
int init_buffer();
void deinit_buffer();
diff --git a/include/common/hathreads.h b/include/common/hathreads.h
index 3b8fb0b..31d0f53 100644
--- a/include/common/hathreads.h
+++ b/include/common/hathreads.h
@@ -30,6 +30,8 @@
#ifndef USE_THREAD
+#define __decl_hathreads(decl)
+
#define HA_ATOMIC_CAS(val, old, new) ({((*val) == (*old)) ? (*(val) = (new) , 1) : (*(old) = *(val), 0);})
#define HA_ATOMIC_ADD(val, i) ({*(val) += (i);})
#define HA_ATOMIC_SUB(val, i) ({*(val) -= (i);})
@@ -93,6 +95,8 @@
#include <pthread.h>
#include <import/plock.h>
+#define __decl_hathreads(decl) decl
+
/* TODO: thread: For now, we rely on GCC builtins but it could be a good idea to
* have a header file regrouping all functions dealing with threads. */
#define HA_ATOMIC_CAS(val, old, new) __atomic_compare_exchange_n(val, old, new, 0, 0, 0)
diff --git a/include/common/memory.h b/include/common/memory.h
index ee394f8..a5c0ec4 100644
--- a/include/common/memory.h
+++ b/include/common/memory.h
@@ -47,9 +47,7 @@
struct pool_head {
void **free_list;
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock; /* the spin lock */
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock); /* the spin lock */
struct list list; /* list of all known pools */
unsigned int used; /* how many chunks are currently in use */
unsigned int allocated; /* how many chunks have been allocated */
diff --git a/include/proto/applet.h b/include/proto/applet.h
index 1a621a1..914b496 100644
--- a/include/proto/applet.h
+++ b/include/proto/applet.h
@@ -31,9 +31,7 @@
extern unsigned int nb_applets;
extern unsigned int applets_active_queue;
-#ifdef USE_THREAD
-extern HA_SPINLOCK_T applet_active_lock;
-#endif
+__decl_hathreads(extern HA_SPINLOCK_T applet_active_lock);
extern struct list applet_active_queue;
void applet_run_active();
diff --git a/include/proto/fd.h b/include/proto/fd.h
index 813e4f3..f81c646 100644
--- a/include/proto/fd.h
+++ b/include/proto/fd.h
@@ -39,11 +39,9 @@
extern THREAD_LOCAL int *fd_updt; // FD updates list
extern THREAD_LOCAL int fd_nbupdt; // number of updates in the list
-#ifdef USE_THREAD
-HA_SPINLOCK_T fdtab_lock; /* global lock to protect fdtab array */
-HA_RWLOCK_T fdcache_lock; /* global lock to protect fd_cache array */
-HA_SPINLOCK_T poll_lock; /* global lock to protect poll info */
-#endif
+__decl_hathreads(HA_SPINLOCK_T fdtab_lock); /* global lock to protect fdtab array */
+__decl_hathreads(HA_RWLOCK_T fdcache_lock); /* global lock to protect fd_cache array */
+__decl_hathreads(HA_SPINLOCK_T poll_lock); /* global lock to protect poll info */
/* Deletes an FD from the fdsets, and recomputes the maxfd limit.
* The file descriptor is also closed.
diff --git a/include/proto/signal.h b/include/proto/signal.h
index 084fa7d..32f6ce6 100644
--- a/include/proto/signal.h
+++ b/include/proto/signal.h
@@ -22,9 +22,7 @@
extern struct signal_descriptor signal_state[];
extern struct pool_head *pool2_sig_handlers;
-#ifdef USE_THREAD
-extern HA_SPINLOCK_T signals_lock;
-#endif
+__decl_hathreads(extern HA_SPINLOCK_T signals_lock);
void signal_handler(int sig);
void __signal_process_queue();
diff --git a/include/proto/task.h b/include/proto/task.h
index e6ba461..9461b59 100644
--- a/include/proto/task.h
+++ b/include/proto/task.h
@@ -89,10 +89,9 @@
extern unsigned int niced_tasks; /* number of niced tasks in the run queue */
extern struct pool_head *pool2_task;
extern struct pool_head *pool2_notification;
-#ifdef USE_THREAD
-extern HA_SPINLOCK_T rq_lock; /* spin lock related to run queue */
-extern HA_SPINLOCK_T wq_lock; /* spin lock related to wait queue */
-#endif
+
+__decl_hathreads(extern HA_SPINLOCK_T rq_lock); /* spin lock related to run queue */
+__decl_hathreads(extern HA_SPINLOCK_T wq_lock); /* spin lock related to wait queue */
/* return 0 if task is in run queue, otherwise non-zero */
static inline int task_in_rq(struct task *t)
diff --git a/include/types/backend.h b/include/types/backend.h
index 68d3125..c7f9fa3 100644
--- a/include/types/backend.h
+++ b/include/types/backend.h
@@ -147,9 +147,8 @@
struct lb_fwlc fwlc;
struct lb_chash chash;
struct lb_fas fas;
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
+
/* Call backs for some actions. Any of them may be NULL (thus should be ignored). */
void (*update_server_eweight)(struct server *); /* to be called after eweight change */
void (*set_server_status_up)(struct server *); /* to be called after status changes to UP */
diff --git a/include/types/dns.h b/include/types/dns.h
index bdc8cfc..b1f068a 100644
--- a/include/types/dns.h
+++ b/include/types/dns.h
@@ -193,9 +193,7 @@
struct eb_root query_ids; /* tree to quickly lookup/retrieve query ids currently in use
* used by each nameserver, but stored in resolvers since there must
* be a unique relation between an eb_root and an eb_node (resolution) */
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
struct list list; /* resolvers list */
};
diff --git a/include/types/fd.h b/include/types/fd.h
index 2da6599..2d8237b 100644
--- a/include/types/fd.h
+++ b/include/types/fd.h
@@ -95,9 +95,7 @@
void (*iocb)(int fd); /* I/O handler */
void *owner; /* the connection or listener associated with this fd, NULL if closed */
unsigned long thread_mask; /* mask of thread IDs authorized to process the task */
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
unsigned int cache; /* position+1 in the FD cache. 0=not in cache. */
unsigned char state; /* FD state for read and write directions (2*3 bits) */
unsigned char ev; /* event seen in return of poll() : FD_POLL_* */
diff --git a/include/types/global.h b/include/types/global.h
index 48b6f9d..6793c83 100644
--- a/include/types/global.h
+++ b/include/types/global.h
@@ -163,11 +163,7 @@
} unix_bind;
#ifdef USE_CPU_AFFINITY
unsigned long cpu_map[LONGBITS]; /* list of CPU masks for the 32/64 first processes */
-
-#ifdef USE_THREAD
- unsigned long thread_map[LONGBITS][LONGBITS]; /* list of CPU masks for the 32/64 first threads per process */
-#endif
-
+ __decl_hathreads(unsigned long thread_map[LONGBITS][LONGBITS]); /* list of CPU masks for the 32/64 first threads per process */
#endif
struct proxy *stats_fe; /* the frontend holding the stats settings */
struct vars vars; /* list of variables for the process scope. */
diff --git a/include/types/listener.h b/include/types/listener.h
index ac39758..545f88c 100644
--- a/include/types/listener.h
+++ b/include/types/listener.h
@@ -200,9 +200,7 @@
int tcp_ut; /* for TCP, user timeout */
char *interface; /* interface name or NULL */
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
const struct netns_entry *netns; /* network namespace of the listener*/
diff --git a/include/types/pattern.h b/include/types/pattern.h
index d5c340a..a0bb08e 100644
--- a/include/types/pattern.h
+++ b/include/types/pattern.h
@@ -107,9 +107,7 @@
char *display; /* String displayed to identify the pattern origin. */
struct list head; /* The head of the list of struct pat_ref_elt. */
struct list pat; /* The head of the list of struct pattern_expr. */
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock; /* Lock used to protect pat ref elements */
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock); /* Lock used to protect pat ref elements */
};
/* This is a part of struct pat_ref. Each entry contain one
@@ -202,9 +200,7 @@
struct eb_root pattern_tree; /* may be used for lookup in large datasets */
struct eb_root pattern_tree_2; /* may be used for different types */
int mflags; /* flags relative to the parsing or matching method. */
-#ifdef USE_THREAD
- HA_RWLOCK_T lock; /* lock used to protect patterns */
-#endif
+ __decl_hathreads(HA_RWLOCK_T lock); /* lock used to protect patterns */
};
/* This is a list of expression. A struct pattern_expr can be used by
diff --git a/include/types/peers.h b/include/types/peers.h
index 2fc7435..58c8c4e 100644
--- a/include/types/peers.h
+++ b/include/types/peers.h
@@ -67,9 +67,7 @@
struct shared_table *remote_table;
struct shared_table *last_local_table;
struct shared_table *tables;
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock; /* lock used to handle this peer section */
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock); /* lock used to handle this peer section */
struct peer *next; /* next peer in the list */
};
diff --git a/include/types/proxy.h b/include/types/proxy.h
index 719c8dd..3b7d9a3 100644
--- a/include/types/proxy.h
+++ b/include/types/proxy.h
@@ -239,9 +239,7 @@
* code even though they are not checks. This structure
* is as a parameter to the check code.
* Each check corresponds to a mailer */
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
};
struct proxy {
@@ -444,10 +442,7 @@
* name is used
*/
struct list filter_configs; /* list of the filters that are declared on this proxy */
-
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
};
struct switching_rule {
diff --git a/include/types/server.h b/include/types/server.h
index 76225f7..adedca4 100644
--- a/include/types/server.h
+++ b/include/types/server.h
@@ -286,10 +286,7 @@
struct sample_expr *sni; /* sample expression for SNI */
} ssl_ctx;
#endif
-
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
struct {
const char *file; /* file where the section appears */
int line; /* line where the section appears */
diff --git a/include/types/spoe.h b/include/types/spoe.h
index aead2ba..53e7200 100644
--- a/include/types/spoe.h
+++ b/include/types/spoe.h
@@ -264,10 +264,7 @@
struct list applets; /* List of available SPOE applets */
struct list sending_queue; /* Queue of streams waiting to send data */
struct list waiting_queue; /* Queue of streams waiting for a ack, in async mode */
-
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
} *rt;
};
diff --git a/include/types/stick_table.h b/include/types/stick_table.h
index 4f5de99..4a8d8c7 100644
--- a/include/types/stick_table.h
+++ b/include/types/stick_table.h
@@ -129,9 +129,7 @@
struct stksess {
unsigned int expire; /* session expiration date */
unsigned int ref_cnt; /* reference count, can only purge when zero */
-#ifdef USE_THREAD
- HA_RWLOCK_T lock; /* lock related to the table entry */
-#endif
+ __decl_hathreads(HA_RWLOCK_T lock); /* lock related to the table entry */
struct eb32_node exp; /* ebtree node used to hold the session in expiration tree */
struct eb32_node upd; /* ebtree node used to hold the update sequence tree */
struct ebmb_node key; /* ebtree node used to hold the session in table */
@@ -146,9 +144,7 @@
struct eb_root exps; /* head of sticky session expiration tree */
struct eb_root updates; /* head of sticky updates sequence tree */
struct pool_head *pool; /* pool used to allocate sticky sessions */
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock; /* spin lock related to the table */
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock); /* spin lock related to the table */
struct task *exp_task; /* expiration task */
struct task *sync_task; /* sync task */
unsigned int update;
diff --git a/include/types/task.h b/include/types/task.h
index 70fc681..991e3a4 100644
--- a/include/types/task.h
+++ b/include/types/task.h
@@ -57,9 +57,7 @@
struct list wake_me; /* Part of list of signals to be targeted if an
event occurs. */
struct task *task; /* The task to be wake if an event occurs. */
-#ifdef USE_THREAD
- HA_SPINLOCK_T lock;
-#endif
+ __decl_hathreads(HA_SPINLOCK_T lock);
};
/* The base for all tasks */
diff --git a/include/types/vars.h b/include/types/vars.h
index 8a4f7aa..9b166e9 100644
--- a/include/types/vars.h
+++ b/include/types/vars.h
@@ -18,9 +18,7 @@
struct list head;
enum vars_scope scope;
unsigned int size;
-#ifdef USE_THREAD
- HA_RWLOCK_T rwlock;
-#endif
+ __decl_hathreads(HA_RWLOCK_T rwlock);
};
/* This struct describes a variable. */