CallOnce.h 877 B

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