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