mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-15 09:33:39 +00:00
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220936 91177308-0d34-0410-b5e6-96231b3b80d8
25 lines
486 B
C++
25 lines
486 B
C++
#include <winbase.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();
|
|
}
|