thread: add support for one-time global initialization
authorZaheer Chothia <zchothia@inf.ethz.ch>
Sun, 14 Dec 2014 19:11:26 +0000 (20:11 +0100)
committerZaheer Chothia <zchothia@inf.ethz.ch>
Mon, 20 Apr 2015 21:09:19 +0000 (23:09 +0200)
commitf8cc9635d0d8c6c802b0c37d11007b3f4e960ee6
treebcb9d04fa97ef6d340e4b7edfde5f8820e243f10
parentecedc6b6c451c10e71c25f126be9400b8fd12eb1
thread: add support for one-time global initialization

Summary:
This is an action that needs to be coordinated globally but the implementation
doesn't have to be as pessimistic.  The initialization function is only run
once and the common case is checking whether it has already been run.  The idea
here is to have a fast and slow path and let each thread use a locally cached
value.

Test Plan:
Tested with the small code snippet below. Initialization function ran
correctly (and only once).  For correctness of the locking scheme I
defer to the proposal document referred to in the header comment of
`lib/barrelfish/thread_once.c`.

  lang=c
  #include <barrelfish/threads.h>

  static thread_once_t init = THREAD_ONCE_INIT;

  static void init_func(void) {
    printf("init\n");
  }

  int main() {
    thread_once(&init, init_func);
    printf("Hello World\n");
    thread_once(&init, init_func);
    return 0;
  }

Differential Revision: https://code.systems.ethz.ch/D9

Signed-off-by: Zaheer Chothia <zchothia@inf.ethz.ch>
include/barrelfish/threads.h
lib/barrelfish/Hakefile
lib/barrelfish/thread_once.c [new file with mode: 0644]