Impl: made 'returned' boolean atomic
authorMarcus Fritzsch <marcus_fritzsch@mentor.com>
Mon, 4 Sep 2017 11:41:35 +0000 (13:41 +0200)
committerMarcus Fritzsch <marcus_fritzsch@mentor.com>
Thu, 14 Sep 2017 12:04:51 +0000 (14:04 +0200)
Signed-off-by: Marcus Fritzsch <marcus_fritzsch@mentor.com>
AFBClient.cpp

index 3a8549d..26efab6 100644 (file)
@@ -7,6 +7,7 @@
 #include <cstdlib>
 #include <cstring>
 
+#include <atomic>
 #include <mutex>
 
 #include <unistd.h>
@@ -110,7 +111,8 @@ int api_call(struct sd_event *loop, struct afb_wsj1 *wsj1, const char *verb,
     // Alternatively we could setup a local struct and use it as
     // closure, but I think it is cleaner this way.
     int call_rc = 0;
-    bool returned = false;
+    std::atomic<bool> returned;
+    returned.store(false, std::memory_order_relaxed);
     std::function<void(bool, json_object *)> wrappedOnReply =
         [&returned, &call_rc, &onReply](bool ok, json_object *j) {
             TRACEN(wrappedOnReply);
@@ -121,7 +123,7 @@ int api_call(struct sd_event *loop, struct afb_wsj1 *wsj1, const char *verb,
                 TRACEN(onReply);
                 onReply(ok, j);
             }
-            returned = true;
+            returned.store(true, std::memory_order_release);
         };
 
     // make the actual call, use wrappedOnReply as closure
@@ -147,7 +149,7 @@ int api_call(struct sd_event *loop, struct afb_wsj1 *wsj1, const char *verb,
         // We need to dispatch until "returned" got set, this is necessary
         // if events get triggered by the call (and would be dispatched before
         // the actual call-reply).
-        while (!returned) {
+        while (!returned.load(std::memory_order_consume)) {
             dispatch_internal(loop);
         }