Commit feb17ced authored by Maria Matejka's avatar Maria Matejka
Browse files

Dropping the POSIX thread-local variables in favor of much easier-to-use C11 thread-local variables

parent b5061659
Loading
Loading
Loading
Loading
+15 −32
Original line number Diff line number Diff line
@@ -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;
}


+1 −0
Original line number Diff line number Diff line
@@ -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);
+13 −40
Original line number Diff line number Diff line
@@ -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;