Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.71 KB | None | 0 0
  1. #ifndef _ATOMIC_H_
  2. #define _ATOMIC_H_
  3.  
  4. #include "machine.h"
  5.  
  6. template <typename T>
  7. class AtomicPtr {
  8. volatile T *ptr;
  9. public:
  10. AtomicPtr() : ptr(nullptr) {}
  11. AtomicPtr(T *x) : ptr(x) {}
  12. AtomicPtr<T>& operator= (T v) {
  13. __atomic_store_n(ptr,v,__ATOMIC_SEQ_CST);
  14. return *this;
  15. }
  16. operator T () const {
  17. return __atomic_load_n(ptr,__ATOMIC_SEQ_CST);
  18. }
  19. T fetch_add(T inc) {
  20. return __atomic_fetch_add(ptr,inc,__ATOMIC_SEQ_CST);
  21. }
  22. T add_fetch(T inc) {
  23. return __atomic_add_fetch(ptr,inc,__ATOMIC_SEQ_CST);
  24. }
  25. void set(T inc) {
  26. return __atomic_store_n(ptr,inc,__ATOMIC_SEQ_CST);
  27. }
  28. T get(void) {
  29. return __atomic_load_n(ptr,__ATOMIC_SEQ_CST);
  30. }
  31. T exchange(T v) {
  32. T ret;
  33. __atomic_exchange(ptr,&v,&ret,__ATOMIC_SEQ_CST);
  34. return ret;
  35. }
  36. };
  37.  
  38. template <typename T>
  39. class Atomic {
  40. volatile T value;
  41. public:
  42. Atomic(T x) : value(x) {}
  43. Atomic<T>& operator= (T v) {
  44. __atomic_store_n(&value,v,__ATOMIC_SEQ_CST);
  45. return *this;
  46. }
  47. operator T () const {
  48. return __atomic_load_n(&value,__ATOMIC_SEQ_CST);
  49. }
  50. T fetch_add(T inc) {
  51. return __atomic_fetch_add(&value,inc,__ATOMIC_SEQ_CST);
  52. }
  53. T add_fetch(T inc) {
  54. return __atomic_add_fetch(&value,inc,__ATOMIC_SEQ_CST);
  55. }
  56. void set(T inc) {
  57. return __atomic_store_n(&value,inc,__ATOMIC_SEQ_CST);
  58. }
  59. T get(void) const {
  60. return __atomic_load_n(&value,__ATOMIC_SEQ_CST);
  61. }
  62. T exchange(T v) {
  63. T ret;
  64. __atomic_exchange(&value,&v,&ret,__ATOMIC_SEQ_CST);
  65. return ret;
  66. }
  67. };
  68.  
  69.  
  70. class SpinLock {
  71. Atomic<bool> taken;
  72. public:
  73. SpinLock() : taken(false) {}
  74. void lock(void) {
  75. while (taken.exchange(true));
  76. }
  77. void unlock(void) {
  78. taken.set(false);
  79. }
  80. };
  81.  
  82. /* Why is this a bad idea? Why am I doing it anyway? */
  83. class InterruptSafeLock {
  84. Atomic<bool> taken;
  85. public:
  86. InterruptSafeLock() : taken(false) {};
  87. bool lock();
  88. void unlock(bool was);
  89. template <typename F> void doit(F f) {
  90. auto was = disable();
  91. f();
  92. enable(was);
  93. }
  94. };
  95.  
  96. class InterruptSafeLocker {
  97. InterruptSafeLock& theLock;
  98. bool was;
  99. public:
  100. InterruptSafeLocker(InterruptSafeLock& it) : theLock(it),was(it.lock()) {}
  101. ~InterruptSafeLocker() { theLock.unlock(was); }
  102. };
  103.  
  104.  
  105. class Barrier {
  106. public:
  107. Atomic<uint32_t> expected;
  108. Barrier(uint32_t n) : expected(n) {}
  109. void sync(void) {
  110. uint32_t a = expected.add_fetch(-1);
  111. while (a != 0) {
  112. a = expected.get();
  113. }
  114. }
  115. };
  116.  
  117. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement