allowed some clients to Event handler to register with type NONE, which means that all event types will be sent to the client

This commit is contained in:
csoler 2020-01-11 19:01:43 +01:00
parent f76b81ba49
commit 6a4c98b2ed
No known key found for this signature in database
GPG key ID: 7BCA522266C0804C
2 changed files with 20 additions and 25 deletions

View file

@ -331,13 +331,13 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
rsEvents, "rsEvents", cAns, session ) ) rsEvents, "rsEvents", cAns, session ) )
return; return;
uint32_t event_type; RsEventType eventType = RsEventType::NONE;
// deserialize input parameters from JSON // deserialize input parameters from JSON
{ {
RsGenericSerializer::SerializeContext& ctx(cReq); RsGenericSerializer::SerializeContext& ctx(cReq);
RsGenericSerializer::SerializeJob j(RsGenericSerializer::FROM_JSON); RsGenericSerializer::SerializeJob j(RsGenericSerializer::FROM_JSON);
RS_SERIAL_PROCESS(event_type); RS_SERIAL_PROCESS(eventType);
} }
const std::weak_ptr<rb::Session> weakSession(session); const std::weak_ptr<rb::Session> weakSession(session);
@ -374,7 +374,7 @@ JsonApiServer::JsonApiServer(): configMutex("JsonApiServer config"),
} ); } );
}; };
bool retval = rsEvents->registerEventsHandler(static_cast<RsEventType>(event_type),multiCallback, hId); bool retval = rsEvents->registerEventsHandler(eventType,multiCallback, hId);
{ {
RsGenericSerializer::SerializeContext& ctx(cAns); RsGenericSerializer::SerializeContext& ctx(cAns);

View file

@ -176,30 +176,25 @@ void RsEventsService::handleEvent(std::shared_ptr<const RsEvent> event)
{ {
std::function<void(std::shared_ptr<const RsEvent>)> mCallback; std::function<void(std::shared_ptr<const RsEvent>)> mCallback;
uint32_t event_type_index = (uint32_t)event->mType; uint32_t event_type_index = static_cast<uint32_t>(event->mType);
{
RS_STACK_MUTEX(mHandlerMapMtx); /* LOCKED AREA */
mHandlerMapMtx.lock();
if(event_type_index >= mHandlerMaps.size() || event_type_index < 1) if(event_type_index >= mHandlerMaps.size() || event_type_index < 1)
{ {
RsErr() << "Cannot handle an event of type " << event_type_index << ": out of scope!" << std::endl; RsErr() << "Cannot handle an event of type " << event_type_index << ": out of scope!" << std::endl;
return; return;
} }
auto cbpt = mHandlerMaps[event_type_index].begin();
mHandlerMapMtx.unlock();
getHandlerFromMapLock: // Call all clients that registered a callback for this event type
mHandlerMapMtx.lock();
if(cbpt != mHandlerMaps[event_type_index].end())
{
mCallback = cbpt->second;
++cbpt;
}
mHandlerMapMtx.unlock();
if(mCallback) for(auto cbit: mHandlerMaps[event_type_index])
{ cbit.second(event);
mCallback(event); // It is relevant that this happens outside mutex
mCallback = std::function<void(std::shared_ptr<const RsEvent>)>(nullptr); // Also call all clients that registered with NONE, meaning that they expect all events
goto getHandlerFromMapLock;
for(auto cbit: mHandlerMaps[static_cast<uint32_t>(RsEventType::NONE)])
cbit.second(event);
} }
} }