summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/timer.c47
-rw-r--r--lib/timer.h1
-rw-r--r--proto/bfd/io.c53
3 files changed, 29 insertions, 72 deletions
diff --git a/lib/timer.c b/lib/timer.c
index f978a0f3..6efcadb4 100644
--- a/lib/timer.c
+++ b/lib/timer.c
@@ -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;
}
diff --git a/lib/timer.h b/lib/timer.h
index c5ea430c..bc568ee6 100644
--- a/lib/timer.h
+++ b/lib/timer.h
@@ -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);
diff --git a/proto/bfd/io.c b/proto/bfd/io.c
index 1cd9365a..8fdc84fb 100644
--- a/proto/bfd/io.c
+++ b/proto/bfd/io.c
@@ -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;