25 lines
487 B
C++
25 lines
487 B
C++
#include <windows.h>
|
|
|
|
#ifdef MemoryFence
|
|
// WinNT.h seems to define a MemoryFence macro.
|
|
#undef MemoryFence
|
|
#endif
|
|
|
|
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();
|
|
}
|