path: root/CommonLibs/Threads.cpp
diff options
authorPau Espin Pedrol <pespin@sysmocom.de>2019-09-13 18:56:08 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2019-09-20 19:17:22 +0200
commite503c988d825e0eaf5f56ed8dd68b318b3e43c04 (patch)
tree85527c3ea1f78c35eaf02df1c0584f16a88d9511 /CommonLibs/Threads.cpp
parentee2ba19cec96347d11e3661077ef3c4c0eb068c2 (diff)
radioInterface: Atomically fetch and change underrun variable
Otherwise, it could happen that underrun events are lost: TxLower (isUnderrun): RxLower (pullBuffer): read(underrun) read(underrun) write(underrun, |val) [maybe underrun becomes TRUE] write(underrun, false) Similary, it could happen the other direction if atomic was only applied to isUnderrun: TxLower (isUnderrun): RxLower (pullBuffer): read(underrun) -> true read(underrun)-> true write(underrun, false) write(underrun, true|val) where val=false So in here isUnderrun would return true twice while it should only return one. Change-Id: I684e0a5d2a9583a161d5a6593559b3a9e7cd57e3
Diffstat (limited to 'CommonLibs/Threads.cpp')
1 files changed, 3 insertions, 1 deletions
diff --git a/CommonLibs/Threads.cpp b/CommonLibs/Threads.cpp
index dd57d40..020d94e 100644
--- a/CommonLibs/Threads.cpp
+++ b/CommonLibs/Threads.cpp
@@ -40,7 +40,9 @@
using namespace std;
+ pthread_mutex_t atomic_ops_mutex = PTHREAD_MUTEX_INITIALIZER;
Mutex gStreamLock; ///< Global lock to control access to cout and cerr.