blob: 196be890dbfddbafd1b2eeca76f796e27634bb0b [file] [log] [blame]
#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();
}