summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support/Windows/Threading.inc
blob: 099c6b28bf6fc1c7309ea5a047c6f1957dcf8c90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <winbase.h>

void llvm::call_once(once_flag &flag, void (*fptr)(void)) {
  while (flag != Done) {
    if (flag == Wait) {
      ::Sleep(1);
      continue;
    }

    sys::cas_flag old_val = sys::CompareAndSwap(&flag, Wait, Uninitialized);
    if (old_val == Uninitialized) {
      fptr();
      sys::MemoryFence();
      flag = Done;
      return;
    }
  }
  sys::MemoryFence();
}
OpenPOWER on IntegriCloud