wut/libraries/wutstdc++/wut_gthread_once.cpp
fincs ee3bb10df4 First pass at adopting a devkitPro-style build system, see details:
- Added wut_rules and wut/rpx/rpl.specs to share/
- Replaced wut's CMake-based buildsystem with a standard Makefile
- Conflated all wut libraries into a single libwut.a library
- wut's old buildsystems (CMake & plain make) are broken as a result,
  this will be fixed in the future
- Docs, tests and samples are not buildable either at the moment
- wutcrt/wutnewlib:
  - RPX start function is __rpx_start, while RPL is __rpl_start
  - __init/fini_wut_* functions are no longer weak
  - __init_wut/__fini_wut are instead weak
  - Removed _exit implementation
  - exit syscall now points to _Exit instead of pointing to itself
- wutstdc++:
  - Renamed .cc files to .cpp
  - Temporarily disabled, due to an issue that will be addressed shortly
- wutdevoptab:
  - Fixed uninitialized variable warnings in __wut_fs_read/write
2019-02-12 12:46:28 +01:00

25 lines
704 B
C++

#include "wut_gthread.h"
int
__wut_once(__wut_once_t *once,
void (*func) (void))
{
uint32_t value = 0;
if (OSCompareAndSwapAtomicEx(once,
__WUT_ONCE_VALUE_INIT,
__WUT_ONCE_VALUE_STARTED,
&value)) {
func();
OSCompareAndSwapAtomic(once,
__WUT_ONCE_VALUE_STARTED,
__WUT_ONCE_VALUE_DONE);
} else if (value != __WUT_ONCE_VALUE_DONE) {
while (!OSCompareAndSwapAtomic(once,
__WUT_ONCE_VALUE_DONE,
__WUT_ONCE_VALUE_DONE));
}
return 0;
}