]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Dropping the POSIX thread-local variables in favor of much easier-to-use C11 thread...
authorMaria Matejka <mq@ucw.cz>
Fri, 18 Jun 2021 16:10:42 +0000 (18:10 +0200)
committerMaria Matejka <mq@ucw.cz>
Mon, 22 Nov 2021 18:05:43 +0000 (19:05 +0100)
lib/timer.c
lib/timer.h
proto/bfd/io.c

index f978a0f32c6dd39621a4903cda06da435830dd3c..6efcadb4b480dbb46e23d8e003e108b65b4edefe 100644 (file)
@@ -43,38 +43,23 @@ struct timeloop main_timeloop;
 #include <pthread.h>
 
 /* Data accessed and modified from proto/bfd/io.c */
-pthread_key_t current_time_key;
-
-static inline struct timeloop *
-timeloop_current(void)
-{
-  return pthread_getspecific(current_time_key);
-}
-
-static inline void
-timeloop_init_current(void)
-{
-  pthread_key_create(&current_time_key, NULL);
-  pthread_setspecific(current_time_key, &main_timeloop);
-}
+_Thread_local struct timeloop *local_timeloop;
 
 void wakeup_kick_current(void);
 
 btime
 current_time(void)
 {
-  return timeloop_current()->last_time;
+  return local_timeloop->last_time;
 }
 
 btime
 current_real_time(void)
 {
-  struct timeloop *loop = timeloop_current();
-
-  if (!loop->real_time)
-    times_update_real_time(loop);
+  if (!local_timeloop->real_time)
+    times_update_real_time(local_timeloop);
 
-  return loop->real_time;
+  return local_timeloop->real_time;
 }
 
 
@@ -128,30 +113,29 @@ tm_new(pool *p)
 void
 tm_set(timer *t, btime when)
 {
-  struct timeloop *loop = timeloop_current();
-  uint tc = timers_count(loop);
+  uint tc = timers_count(local_timeloop);
 
   if (!t->expires)
   {
     t->index = ++tc;
     t->expires = when;
-    BUFFER_PUSH(loop->timers) = t;
-    HEAP_INSERT(loop->timers.data, tc, timer *, TIMER_LESS, TIMER_SWAP);
+    BUFFER_PUSH(local_timeloop->timers) = t;
+    HEAP_INSERT(local_timeloop->timers.data, tc, timer *, TIMER_LESS, TIMER_SWAP);
   }
   else if (t->expires < when)
   {
     t->expires = when;
-    HEAP_INCREASE(loop->timers.data, tc, timer *, TIMER_LESS, TIMER_SWAP, t->index);
+    HEAP_INCREASE(local_timeloop->timers.data, tc, timer *, TIMER_LESS, TIMER_SWAP, t->index);
   }
   else if (t->expires > when)
   {
     t->expires = when;
-    HEAP_DECREASE(loop->timers.data, tc, timer *, TIMER_LESS, TIMER_SWAP, t->index);
+    HEAP_DECREASE(local_timeloop->timers.data, tc, timer *, TIMER_LESS, TIMER_SWAP, t->index);
   }
 
 #ifdef CONFIG_BFD
   /* Hack to notify BFD loops */
-  if ((loop != &main_timeloop) && (t->index == 1))
+  if ((local_timeloop != &main_timeloop) && (t->index == 1))
     wakeup_kick_current();
 #endif
 }
@@ -168,11 +152,10 @@ tm_stop(timer *t)
   if (!t->expires)
     return;
 
-  struct timeloop *loop = timeloop_current();
-  uint tc = timers_count(loop);
+  uint tc = timers_count(local_timeloop);
 
-  HEAP_DELETE(loop->timers.data, tc, timer *, TIMER_LESS, TIMER_SWAP, t->index);
-  BUFFER_POP(loop->timers);
+  HEAP_DELETE(local_timeloop->timers.data, tc, timer *, TIMER_LESS, TIMER_SWAP, t->index);
+  BUFFER_POP(local_timeloop->timers);
 
   t->index = -1;
   t->expires = 0;
@@ -230,7 +213,7 @@ void
 timer_init(void)
 {
   timers_init(&main_timeloop, &root_pool);
-  timeloop_init_current();
+  local_timeloop = &main_timeloop;
 }
 
 
index c5ea430cdb81fe858c819eab697ff753a3674d78..bc568ee67dc9aff13e9a33823a36e89150d0d142 100644 (file)
@@ -42,6 +42,7 @@ static inline timer *timers_first(struct timeloop *loop)
 { return (loop->timers.used > 1) ? loop->timers.data[1] : NULL; }
 
 extern struct timeloop main_timeloop;
+extern _Thread_local struct timeloop *local_timeloop;
 
 btime current_time(void);
 btime current_real_time(void);
index 1cd9365adb4df763c6665aae9134cbc19c24bc98..8fdc84fb0851ec4426b231513c18e925858992b0 100644 (file)
@@ -52,29 +52,15 @@ struct birdloop
  *     Current thread context
  */
 
-static pthread_key_t current_loop_key;
-extern pthread_key_t current_time_key;
-
-static inline struct birdloop *
-birdloop_current(void)
-{
-  return pthread_getspecific(current_loop_key);
-}
+static _Thread_local struct birdloop *birdloop_current;
 
 static inline void
 birdloop_set_current(struct birdloop *loop)
 {
-  pthread_setspecific(current_loop_key, loop);
-  pthread_setspecific(current_time_key, loop ? &loop->time : &main_timeloop);
+  birdloop_current = loop;
+  local_timeloop = loop ? &loop->time : &main_timeloop;
 }
 
-static inline void
-birdloop_init_current(void)
-{
-  pthread_key_create(&current_loop_key, NULL);
-}
-
-
 /*
  *     Wakeup code for birdloop
  */
@@ -162,10 +148,8 @@ wakeup_kick(struct birdloop *loop)
 void
 wakeup_kick_current(void)
 {
-  struct birdloop *loop = birdloop_current();
-
-  if (loop && loop->poll_active)
-    wakeup_kick(loop);
+  if (birdloop_current && birdloop_current->poll_active)
+    wakeup_kick(birdloop_current);
 }
 
 
@@ -195,15 +179,13 @@ events_fire(struct birdloop *loop)
 void
 ev2_schedule(event *e)
 {
-  struct birdloop *loop = birdloop_current();
-
-  if (loop->poll_active && EMPTY_LIST(loop->event_list))
-    wakeup_kick(loop);
+  if (birdloop_current->poll_active && EMPTY_LIST(birdloop_current->event_list))
+    wakeup_kick(birdloop_current);
 
   if (e->n.next)
     rem_node(&e->n);
 
-  add_tail(&loop->event_list, &e->n);
+  add_tail(&birdloop_current->event_list, &e->n);
 }
 
 
@@ -238,9 +220,7 @@ sockets_add(struct birdloop *loop, sock *s)
 void
 sk_start(sock *s)
 {
-  struct birdloop *loop = birdloop_current();
-
-  sockets_add(loop, s);
+  sockets_add(birdloop_current, s);
 }
 
 static void
@@ -261,14 +241,12 @@ sockets_remove(struct birdloop *loop, sock *s)
 void
 sk_stop(sock *s)
 {
-  struct birdloop *loop = birdloop_current();
+  sockets_remove(birdloop_current, s);
 
-  sockets_remove(loop, s);
-
-  if (loop->poll_active)
+  if (birdloop_current->poll_active)
   {
-    loop->close_scheduled = 1;
-    wakeup_kick(loop);
+    birdloop_current->close_scheduled = 1;
+    wakeup_kick(birdloop_current);
   }
   else
     close(s->fd);
@@ -392,11 +370,6 @@ static void * birdloop_main(void *arg);
 struct birdloop *
 birdloop_new(void)
 {
-  /* FIXME: this init should be elsewhere and thread-safe */
-  static int init = 0;
-  if (!init)
-    { birdloop_init_current(); init = 1; }
-
   pool *p = rp_new(NULL, "Birdloop root");
   struct birdloop *loop = mb_allocz(p, sizeof(struct birdloop));
   loop->pool = p;