Hi

I think I have to re-work this.

23.3.3.4 of the C++11 standard says:

Effects: An erase operation that erases the last element of a deque invalidates only the past-the-end iterator and all iterators and references to the erased elements.

So I've probably done the wrong thing here.

On 19/6/19 1:24 pm, Gary Lee wrote:
In handle_event_in_failover_state(), we iterate through
queue_evt in a while loop, but process_event() can insert
items into the queue inside the loop, and we may end
up never exiting the while loop.
---
  src/amf/amfd/cb.h      |  3 ++-
  src/amf/amfd/main.cc   | 13 +++++++++----
  src/amf/amfd/ndfsm.cc  |  4 ++--
  src/amf/amfd/ndproc.cc |  4 ++--
  4 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/amf/amfd/cb.h b/src/amf/amfd/cb.h
index 89cf15d..4418db6 100644
--- a/src/amf/amfd/cb.h
+++ b/src/amf/amfd/cb.h
@@ -38,6 +38,7 @@
  #include <saClm.h>
#include <atomic>
+#include <deque>
  #include <list>
  #include <map>
  #include <memory>
@@ -166,7 +167,7 @@ typedef struct cl_cb_tag {
    std::queue<AVSV_ND_MSG_QUEUE *> nd_msg_queue_list{};
/* Event Queue to hold the events during fail-over */
-  std::queue<AVD_EVT_QUEUE *> evt_queue{};
+  std::deque<AVD_EVT_QUEUE *> evt_queue{};
    /*
     * MBCSv related variables.
     */
diff --git a/src/amf/amfd/main.cc b/src/amf/amfd/main.cc
index 50daa59..d22bcb6 100644
--- a/src/amf/amfd/main.cc
+++ b/src/amf/amfd/main.cc
@@ -395,7 +395,7 @@ static void handle_event_in_failover_state(AVD_EVT *evt) {
      /* Enqueue this event */
      queue_evt = new AVD_EVT_QUEUE();
      queue_evt->evt = evt;
-    cb->evt_queue.push(queue_evt);
+    cb->evt_queue.push_back(queue_evt);
    }
std::map<uint32_t, AVD_FAIL_OVER_NODE *>::const_iterator it =
@@ -407,9 +407,14 @@ static void handle_event_in_failover_state(AVD_EVT *evt) {
      /* Dequeue, all the messages from the queue
         and process them now */
- while (!cb->evt_queue.empty()) {
-      AVD_EVT_QUEUE *queue_evt = cb->evt_queue.front();
-      cb->evt_queue.pop();
+    // get ref to end of queue, to make sure we don't get stuck
+    // iterating through the deque, as events may be added into
+    // evt_queue inside the loop (to be refactored?)
+    auto end_iter = cb->evt_queue.end();
+    auto iter = cb->evt_queue.begin();
+    while (iter != end_iter) {
+      AVD_EVT_QUEUE *queue_evt = *iter++;
+      cb->evt_queue.pop_front();
        process_event(cb, queue_evt->evt);
        delete queue_evt;
      }
diff --git a/src/amf/amfd/ndfsm.cc b/src/amf/amfd/ndfsm.cc
index 8c8f3c5..b763c79 100644
--- a/src/amf/amfd/ndfsm.cc
+++ b/src/amf/amfd/ndfsm.cc
@@ -69,7 +69,7 @@ void avd_process_state_info_queue(AVD_CL_CB *cb) {
    for (i = 0; i < queue_size; i++) {
      queue_evt = cb->evt_queue.front();
      osafassert(queue_evt->evt);
-    cb->evt_queue.pop();
+    cb->evt_queue.pop_front();
TRACE("rcv_evt: %u", queue_evt->evt->rcv_evt); @@ -95,7 +95,7 @@ void avd_process_state_info_queue(AVD_CL_CB *cb) {
        delete queue_evt->evt;
        delete queue_evt;
      } else {
-      cb->evt_queue.push(queue_evt);
+      cb->evt_queue.push_back(queue_evt);
      }
    }
diff --git a/src/amf/amfd/ndproc.cc b/src/amf/amfd/ndproc.cc
index 5f5cbcd..433b00a 100644
--- a/src/amf/amfd/ndproc.cc
+++ b/src/amf/amfd/ndproc.cc
@@ -350,7 +350,7 @@ void avd_nd_sisu_state_info_evh(AVD_CL_CB *cb, AVD_EVT 
*evt) {
      state_info_evt->evt = new AVD_EVT{};
      state_info_evt->evt->rcv_evt = evt->rcv_evt;
      state_info_evt->evt->info.avnd_msg = n2d_msg;
-    cb->evt_queue.push(state_info_evt);
+    cb->evt_queue.push_back(state_info_evt);
    } else {
      LOG_WA(
          "Ignore this sisu_state_info message since node sync window has 
closed");
@@ -392,7 +392,7 @@ void avd_nd_compcsi_state_info_evh(AVD_CL_CB *cb, AVD_EVT 
*evt) {
      state_info_evt->evt = new AVD_EVT{};
      state_info_evt->evt->rcv_evt = evt->rcv_evt;
      state_info_evt->evt->info.avnd_msg = n2d_msg;
-    cb->evt_queue.push(state_info_evt);
+    cb->evt_queue.push_back(state_info_evt);
    } else {
      LOG_WA(
          "Ignore this compcsi_state_info message since node sync window has 
closed");


_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to