atomic_int.cpp 827 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. /*
  2. * Copyright (c) 2012-2020 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/dbartolini/crown/blob/master/LICENSE
  4. */
  5. #include "core/platform.h"
  6. #include "core/thread/atomic_int.h"
  7. #if CROWN_PLATFORM_WINDOWS
  8. #include <windows.h>
  9. #endif
  10. namespace crown
  11. {
  12. AtomicInt::AtomicInt(s32 val)
  13. : _val(val)
  14. {
  15. }
  16. s32 AtomicInt::load()
  17. {
  18. #if CROWN_PLATFORM_POSIX && (CROWN_COMPILER_GCC || CROWN_COMPILER_CLANG)
  19. __sync_fetch_and_add(&_val, 0);
  20. return _val;
  21. #elif CROWN_PLATFORM_WINDOWS
  22. InterlockedExchangeAdd((LONG*)&_val, (s32)0);
  23. return _val;
  24. #endif
  25. }
  26. void AtomicInt::store(s32 val)
  27. {
  28. #if CROWN_PLATFORM_POSIX && (CROWN_COMPILER_GCC || CROWN_COMPILER_CLANG)
  29. __sync_lock_test_and_set(&_val, val);
  30. #elif CROWN_PLATFORM_WINDOWS
  31. InterlockedExchange((LONG*)&_val, val);
  32. #endif
  33. }
  34. } // namespace crown