diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-09-13 18:56:08 +0200 |
---|---|---|
committer | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-09-20 19:17:22 +0200 |
commit | e503c988d825e0eaf5f56ed8dd68b318b3e43c04 (patch) | |
tree | 85527c3ea1f78c35eaf02df1c0584f16a88d9511 /Transceiver52M/radioInterface.cpp | |
parent | ee2ba19cec96347d11e3661077ef3c4c0eb068c2 (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 'Transceiver52M/radioInterface.cpp')
-rw-r--r-- | Transceiver52M/radioInterface.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/Transceiver52M/radioInterface.cpp b/Transceiver52M/radioInterface.cpp index 6e49a75..fbcacf1 100644 --- a/Transceiver52M/radioInterface.cpp +++ b/Transceiver52M/radioInterface.cpp @@ -24,6 +24,7 @@ #include "radioInterface.h" #include "Resampler.h" #include <Logger.h> +#include <Threads.h> extern "C" { #include "convert.h" @@ -288,9 +289,9 @@ int RadioInterface::driveReceiveRadio() bool RadioInterface::isUnderrun() { - bool retVal = underrun; - underrun = false; - + bool retVal; + /* atomically get previous value of "underrun" and set the var to false */ + retVal = osmo_trx_sync_fetch_and_and(&underrun, false); return retVal; } @@ -340,7 +341,7 @@ int RadioInterface::pullBuffer() segmentLen * 2); } - underrun |= local_underrun; + osmo_trx_sync_or_and_fetch(&underrun, local_underrun); readTimestamp += numRecv; return 0; } @@ -366,7 +367,7 @@ bool RadioInterface::pushBuffer() segmentLen, &local_underrun, writeTimestamp); - underrun |= local_underrun; + osmo_trx_sync_or_and_fetch(&underrun, local_underrun); writeTimestamp += numSent; return true; |