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

Reply via email to