summaryrefslogtreecommitdiff
path: root/sysdep/unix/log.c
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2023-05-05 09:39:13 +0200
committerMaria Matejka <mq@ucw.cz>2023-05-06 10:50:32 +0200
commita95141111c89803347c36501185a76fc73a9764a (patch)
treea96a54914cf2498d02546ed49f8e2b852680229b /sysdep/unix/log.c
parent00f30ac40bda76b289b1dc5c5aa8a5d2e4941985 (diff)
Fixed a bug in hot page global storage
The original algorithm was suffering from an ABA race condition: A: fp = page_stack B: completely allocates the same page and writes into it some data A: unsuspecting, loads (invalid) next = fp->next B: finishes working with the page and returns it back to page_stack A: compare-exchange page_stack: fp => next succeeds and writes garbage to page_stack Fixed this by using an implicit spinlock in hot page allocator.
Diffstat (limited to 'sysdep/unix/log.c')
-rw-r--r--sysdep/unix/log.c4
1 files changed, 1 insertions, 3 deletions
diff --git a/sysdep/unix/log.c b/sysdep/unix/log.c
index c200db38..d929e80e 100644
--- a/sysdep/unix/log.c
+++ b/sysdep/unix/log.c
@@ -37,11 +37,9 @@ static FILE *dbgf;
static list *current_log_list;
static char *current_syslog_name; /* NULL -> syslog closed */
-static _Atomic uint max_thread_id = ATOMIC_VAR_INIT(1);
+_Atomic uint max_thread_id = ATOMIC_VAR_INIT(1);
_Thread_local uint this_thread_id;
-#define THIS_THREAD_ID (this_thread_id ?: (this_thread_id = atomic_fetch_add_explicit(&max_thread_id, 1, memory_order_acq_rel)))
-
#include <pthread.h>
static pthread_mutex_t log_mutex;