1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #pragma once
- #include "NonCopyable.h"
- #include "../os/Atomic.h"
- #include "../os/Mutex.h"
- namespace il2cpp
- {
- namespace utils
- {
- typedef void (*CallOnceFunc) (void* arg);
- struct OnceFlag : NonCopyable
- {
- OnceFlag() : m_Flag(NULL)
- {
- }
- friend void CallOnce(OnceFlag& flag, CallOnceFunc func, void* arg);
- bool IsSet()
- {
- return il2cpp::os::Atomic::ReadPointer(&m_Flag) ? true : false;
- }
- private:
- void* m_Flag;
- il2cpp::os::FastMutex m_Mutex;
- };
- inline void CallOnce(OnceFlag& flag, CallOnceFunc func, void* arg)
- {
- if (!il2cpp::os::Atomic::ReadPointer(&flag.m_Flag))
- {
- os::FastAutoLock lock(&flag.m_Mutex);
- if (!il2cpp::os::Atomic::ReadPointer(&flag.m_Flag))
- {
- func(arg);
- il2cpp::os::Atomic::ExchangePointer(&flag.m_Flag, (void*)1);
- }
- }
- }
- }
- }
|