From 6013044e77d40a59b49043e82e47332cd69b6d3d Mon Sep 17 00:00:00 2001 From: Zofia Abramowska Date: Fri, 14 Nov 2014 14:29:31 +0100 Subject: [PATCH] Add context invalidation mechanism RequestTaker gets RequestContext, which might be processed in another event loop. During this loop socket associated with this context might get closed, so class holding this context needs notification. Change-Id: I77dee05b84a987e444f4ec71e87bcb867682768b --- src/common/request/RequestTaker.cpp | 4 ++++ src/common/request/RequestTaker.h | 2 ++ src/service/logic/Logic.cpp | 4 ++++ src/service/logic/Logic.h | 2 ++ src/service/sockets/SocketManager.cpp | 5 ++++- 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/common/request/RequestTaker.cpp b/src/common/request/RequestTaker.cpp index c87a9a4..a4d7c2d 100644 --- a/src/common/request/RequestTaker.cpp +++ b/src/common/request/RequestTaker.cpp @@ -59,4 +59,8 @@ void RequestTaker::execute(RequestContextPtr context UNUSED, SignalRequestPtr re throw NotImplementedException(); } +void RequestTaker::contextClosed(RequestContextPtr context UNUSED) { + throw NotImplementedException(); +} + } // namespace Cynara diff --git a/src/common/request/RequestTaker.h b/src/common/request/RequestTaker.h index b1d3466..522d8bb 100644 --- a/src/common/request/RequestTaker.h +++ b/src/common/request/RequestTaker.h @@ -39,6 +39,8 @@ public: virtual void execute(RequestContextPtr context, RemoveBucketRequestPtr request); virtual void execute(RequestContextPtr context, SetPoliciesRequestPtr request); virtual void execute(RequestContextPtr context, SignalRequestPtr request); + + virtual void contextClosed(RequestContextPtr context); }; } // namespace Cynara diff --git a/src/service/logic/Logic.cpp b/src/service/logic/Logic.cpp index f76ce98..ca56d64 100644 --- a/src/service/logic/Logic.cpp +++ b/src/service/logic/Logic.cpp @@ -174,6 +174,10 @@ void Logic::execute(RequestContextPtr context, SetPoliciesRequestPtr request) { request->sequenceNumber())); } +void Logic::contextClosed(RequestContextPtr context UNUSED) { + //We don't care now, but we will +} + void Logic::onPoliciesChanged(void) { m_storage->save(); m_socketManager->disconnectAllClients(); diff --git a/src/service/logic/Logic.h b/src/service/logic/Logic.h index 3c434a5..e74cffe 100644 --- a/src/service/logic/Logic.h +++ b/src/service/logic/Logic.h @@ -64,6 +64,8 @@ public: virtual void execute(RequestContextPtr context, SetPoliciesRequestPtr request); virtual void execute(RequestContextPtr context, SignalRequestPtr request); + virtual void contextClosed(RequestContextPtr context); + private: PluginManagerPtr m_pluginManager; StoragePtr m_storage; diff --git a/src/service/sockets/SocketManager.cpp b/src/service/sockets/SocketManager.cpp index cb3c9b4..c9e1692 100644 --- a/src/service/sockets/SocketManager.cpp +++ b/src/service/sockets/SocketManager.cpp @@ -210,9 +210,12 @@ void SocketManager::readyForAccept(int fd) { void SocketManager::closeSocket(int fd) { LOGD("SocketManger closeSocket fd [%d] start", fd); + Descriptor &desc = m_fds[fd]; + requestTaker()->contextClosed(std::make_shared(nullptr, + desc.writeQueue())); removeReadSocket(fd); removeWriteSocket(fd); - m_fds[fd].clear(); + desc.clear(); close(fd); LOGD("SocketManger closeSocket fd [%d] done", fd); } -- 2.7.4