Prevent data race between resetHighWaterMark() and put()

This commit is contained in:
Martin Konrad
2018-12-03 12:01:47 -05:00
parent 10d951e2d7
commit 87761ebf29
2 changed files with 5 additions and 5 deletions

View File

@@ -121,7 +121,7 @@ epicsShareFunc int epicsShareAPI epicsRingBytesPut(
{
ringPvt *pring = (ringPvt *)id;
int nextGet, nextPut, size;
int freeCount, copyCount, topCount, used;
int freeCount, copyCount, topCount, used, oldHWM;
if (pring->lock) epicsSpinLock(pring->lock);
nextGet = pring->nextGet;
@@ -162,8 +162,8 @@ epicsShareFunc int epicsShareAPI epicsRingBytesPut(
used = nextPut - nextGet;
if (used < 0) used += pring->size;
if (used > epicsAtomicGetIntT(&pring->highWaterMark)) {
epicsAtomicSetIntT(&pring->highWaterMark, used);
while(oldHWM = epicsAtomicGetIntT(&pring->highWaterMark), oldHWM < used) {
epicsAtomicCmpAndSwapIntT(&pring->highWaterMark, oldHWM, used);
}
if (pring->lock) epicsSpinUnlock(pring->lock);

View File

@@ -131,8 +131,8 @@ inline bool epicsRingPointer<T>::push(T *p)
buffer[next] = p;
nextPush = newNext;
int used = getUsedNoLock();
if (used > epicsAtomicGetIntT(&highWaterMark)) {
epicsAtomicSetIntT(&highWaterMark, used);
while(int oldHWM = epicsAtomicGetIntT(&highWaterMark), oldHWM < used) {
epicsAtomicCmpAndSwapIntT(&highWaterMark, oldHWM, used);
}
if (lock) epicsSpinUnlock(lock);
return(true);