Hi, Recent versions of live555 use std::atomic_flag array to work with event triggers. Consider the following code fragment:
#ifndef NO_STD_LIB if (fTriggersAwaitingHandling[i].test()) { fTriggersAwaitingHandling[i].clear(); #else It is problematic in two ways: 1) it's not atomic: the value can be changed elsewhere between test() and clear() and 2) it requires C++>=20. This can be easily fixed by replacing std::atomic_flag with std::atomic_bool, that needs just C++11. The patch is attached, maybe you find it useful. - Dmitry Bely
--- a/BasicUsageEnvironment/BasicTaskScheduler.cpp +++ b/BasicUsageEnvironment/BasicTaskScheduler.cpp @@ -188,8 +188,8 @@ if (mask == 0) mask = EVENT_TRIGGER_ID_HIGH_BIT; #ifndef NO_STD_LIB - if (fTriggersAwaitingHandling[i].test()) { - fTriggersAwaitingHandling[i].clear(); + bool state = true; + if (fTriggersAwaitingHandling[i].compare_exchange_strong(state, false)) { #else if (fTriggersAwaitingHandling[i]) { fTriggersAwaitingHandling[i] = False; --- a/BasicUsageEnvironment/BasicTaskScheduler0.cpp +++ b/BasicUsageEnvironment/BasicTaskScheduler0.cpp @@ -50,7 +50,7 @@ fHandlers = new HandlerSet; for (unsigned i = 0; i < MAX_NUM_EVENT_TRIGGERS; ++i) { #ifndef NO_STD_LIB - fTriggersAwaitingHandling[i].clear(); + fTriggersAwaitingHandling[i].store(false); #else fTriggersAwaitingHandling[i] = False; #endif @@ -123,7 +123,7 @@ for (unsigned i = 0; i < MAX_NUM_EVENT_TRIGGERS; ++i) { if ((eventTriggerId&mask) != 0) { #ifndef NO_STD_LIB - fTriggersAwaitingHandling[i].clear(); + fTriggersAwaitingHandling[i].store(false); #else fTriggersAwaitingHandling[i] = False; #endif @@ -145,7 +145,7 @@ if ((eventTriggerId&mask) != 0) { fTriggeredEventClientDatas[i] = clientData; #ifndef NO_STD_LIB - (void)fTriggersAwaitingHandling[i].test_and_set(); + fTriggersAwaitingHandling[i].store(true); #else fTriggersAwaitingHandling[i] = True; #endif --- a/BasicUsageEnvironment/include/BasicUsageEnvironment0.hh +++ b/BasicUsageEnvironment/include/BasicUsageEnvironment0.hh @@ -117,7 +117,7 @@ // To implement event triggers: #ifndef NO_STD_LIB - std::atomic_flag fTriggersAwaitingHandling[MAX_NUM_EVENT_TRIGGERS]; + std::atomic_bool fTriggersAwaitingHandling[MAX_NUM_EVENT_TRIGGERS]; #else Boolean volatile fTriggersAwaitingHandling[MAX_NUM_EVENT_TRIGGERS]; #endif
_______________________________________________ live-devel mailing list live-devel@lists.live555.com http://lists.live555.com/mailman/listinfo/live-devel