From 87761ebf290dfa853b2a3fb6b99f8c0da7fe998f Mon Sep 17 00:00:00 2001 From: Martin Konrad Date: Mon, 3 Dec 2018 12:01:47 -0500 Subject: [PATCH] Prevent data race between resetHighWaterMark() and put() --- src/libCom/ring/epicsRingBytes.c | 6 +++--- src/libCom/ring/epicsRingPointer.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libCom/ring/epicsRingBytes.c b/src/libCom/ring/epicsRingBytes.c index a9b13b990..ec9e5094d 100644 --- a/src/libCom/ring/epicsRingBytes.c +++ b/src/libCom/ring/epicsRingBytes.c @@ -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); diff --git a/src/libCom/ring/epicsRingPointer.h b/src/libCom/ring/epicsRingPointer.h index b62923883..2b4f1b172 100644 --- a/src/libCom/ring/epicsRingPointer.h +++ b/src/libCom/ring/epicsRingPointer.h @@ -131,8 +131,8 @@ inline bool epicsRingPointer::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);