CallOnce.h 960 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #pragma once
  2. #include "NonCopyable.h"
  3. #include "../os/Atomic.h"
  4. #include "../os/Mutex.h"
  5. namespace il2cpp
  6. {
  7. namespace utils
  8. {
  9. typedef void (*CallOnceFunc) (void* arg);
  10. struct OnceFlag : NonCopyable
  11. {
  12. OnceFlag() : m_Flag(NULL)
  13. {
  14. }
  15. friend void CallOnce(OnceFlag& flag, CallOnceFunc func, void* arg);
  16. bool IsSet()
  17. {
  18. return il2cpp::os::Atomic::ReadPointer(&m_Flag) ? true : false;
  19. }
  20. private:
  21. void* m_Flag;
  22. il2cpp::os::FastMutex m_Mutex;
  23. };
  24. inline void CallOnce(OnceFlag& flag, CallOnceFunc func, void* arg)
  25. {
  26. if (!il2cpp::os::Atomic::ReadPointer(&flag.m_Flag))
  27. {
  28. os::FastAutoLock lock(&flag.m_Mutex);
  29. if (!il2cpp::os::Atomic::ReadPointer(&flag.m_Flag))
  30. {
  31. func(arg);
  32. il2cpp::os::Atomic::ExchangePointer(&flag.m_Flag, (void*)1);
  33. }
  34. }
  35. }
  36. }
  37. }