put JSON object {"queue_close_event":true} into event queue when queue shall be closed, to let pollForEvents() wakeup before queue is gone (which would let the JSON adapter crash). Needs newer libpEpAdapter that has locked_queue::waiting() member function.

JSON-170
Roker 2020-09-25 21:41:10 +02:00
parent 752d456841
commit eed9211016
1 changed files with 13 additions and 1 deletions

View File

@ -75,6 +75,8 @@ struct EventListenerValue
static std::hash<std::thread::id> hash_tid;
const js::Object queue_close_event{ {"queue_close",true} };
} // end of anonymous namespace
@ -188,7 +190,7 @@ ServerVersion JsonAdapter::version()
PEP_STATUS JsonAdapter::messageToSend(message* msg)
{
JsonAdapter& ja = getInstance();
JsonAdapter& ja = getInstance();
js::Value v{to_json(msg)};
ja.i->makeAndDeliverRequest("messageToSend", js::Array{ std::move(v) } );
return PEP_STATUS_OK;
@ -297,6 +299,11 @@ void JsonAdapter::connection_close_cb()
Log() << "Connection Close Callback: " << (q==i->eventListener.end() ? "NO" : "1") << " entry in eventListener map";
if(q != i->eventListener.end())
{
while(q->second.Q.waiting() > 0)
{
q->second.Q.push_back(queue_close_event);
std::this_thread::sleep_for( std::chrono::milliseconds(333) );
}
i->eventListener.erase(q);
}
}
@ -309,6 +316,11 @@ void JsonAdapter::close_session(const std::string& session_id)
Log() << "Close session \"" << session_id << "\": " << (q==i->eventListener.end() ? "NO" : "1") << " entry in eventListener map";
if(q != i->eventListener.end())
{
while(q->second.Q.waiting() > 0)
{
q->second.Q.push_back(queue_close_event);
std::this_thread::sleep_for( std::chrono::milliseconds(333) );
}
i->eventListener.erase(q);
}
}