Add context invalidation mechanism 26/30326/3
authorZofia Abramowska <z.abramowska@samsung.com>
Fri, 14 Nov 2014 13:29:31 +0000 (14:29 +0100)
committerLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Fri, 14 Nov 2014 16:24:55 +0000 (08:24 -0800)
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
src/common/request/RequestTaker.h
src/service/logic/Logic.cpp
src/service/logic/Logic.h
src/service/sockets/SocketManager.cpp

index c87a9a4..a4d7c2d 100644 (file)
@@ -59,4 +59,8 @@ void RequestTaker::execute(RequestContextPtr context UNUSED, SignalRequestPtr re
     throw NotImplementedException();
 }
 
+void RequestTaker::contextClosed(RequestContextPtr context UNUSED) {
+    throw NotImplementedException();
+}
+
 } // namespace Cynara
index b1d3466..522d8bb 100644 (file)
@@ -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
index f76ce98..ca56d64 100644 (file)
@@ -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();
index 3c434a5..e74cffe 100644 (file)
@@ -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;
index cb3c9b4..c9e1692 100644 (file)
@@ -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<RequestContext>(nullptr,
+                                                                   desc.writeQueue()));
     removeReadSocket(fd);
     removeWriteSocket(fd);
-    m_fds[fd].clear();
+    desc.clear();
     close(fd);
     LOGD("SocketManger closeSocket fd [%d] done", fd);
 }