threading-windows.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Copyright (c) 2015 Hugh Bailey <[email protected]>
  3. *
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #pragma once
  17. #include <intrin.h>
  18. static inline long os_atomic_inc_long(volatile long *val)
  19. {
  20. return _InterlockedIncrement(val);
  21. }
  22. static inline long os_atomic_dec_long(volatile long *val)
  23. {
  24. return _InterlockedDecrement(val);
  25. }
  26. static inline long os_atomic_set_long(volatile long *ptr, long val)
  27. {
  28. return (long)_InterlockedExchange((volatile long *)ptr, (long)val);
  29. }
  30. static inline long os_atomic_load_long(const volatile long *ptr)
  31. {
  32. return (long)_InterlockedOr((volatile long *)ptr, 0);
  33. }
  34. static inline bool os_atomic_compare_swap_long(volatile long *val, long old_val,
  35. long new_val)
  36. {
  37. return _InterlockedCompareExchange(val, new_val, old_val) == old_val;
  38. }
  39. static inline bool os_atomic_set_bool(volatile bool *ptr, bool val)
  40. {
  41. return !!_InterlockedExchange8((volatile char *)ptr, (char)val);
  42. }
  43. static inline bool os_atomic_load_bool(const volatile bool *ptr)
  44. {
  45. return !!_InterlockedOr8((volatile char *)ptr, 0);
  46. }