Don't copy socket events 92/220592/3
authorZofia Grzelewska <z.abramowska@samsung.com>
Thu, 19 Dec 2019 16:59:51 +0000 (17:59 +0100)
committerZofia Grzelewska <z.abramowska@samsung.com>
Wed, 22 Jan 2020 12:24:40 +0000 (13:24 +0100)
Change-Id: If103f7800e202bbd6e27b472668ea7feba7dbf38

src/server/main/include/generic-event.h
src/server/main/include/generic-socket-manager.h
src/server/main/include/service-thread.h
src/server/main/socket-manager.cpp
src/server/service/base-service.cpp
src/server/service/include/base-service.h

index a55956fdea732e92fc97862193ed52b4215a7e75..942d6778483f0417135fb9d0247e6463085637ed 100644 (file)
 namespace SecurityManager {
 
 struct GenericEvent {
+    GenericEvent() = default;
+    GenericEvent(const GenericEvent &) = delete;
+    GenericEvent(GenericEvent &&) = default;
+
+    GenericEvent &operator=(const GenericEvent &) = delete;
+    GenericEvent &operator=(GenericEvent &&) = default;
     virtual ~GenericEvent(){}
 };
 
index 74ba9e17c54819e11a9583daaa0519e8229575cd..bd8f266e7ea3809fd4064787c4449c5f183b28d6 100644 (file)
@@ -108,10 +108,10 @@ struct GenericSocketService {
     }
 
     virtual ServiceDescriptionVector GetServiceDescription() = 0;
-    virtual void Event(const AcceptEvent &event) = 0;
-    virtual void Event(const WriteEvent &event) = 0;
-    virtual void Event(const ReadEvent &event) = 0;
-    virtual void Event(const CloseEvent &event) = 0;
+    virtual void Event(AcceptEvent &&event) = 0;
+    virtual void Event(WriteEvent &&event) = 0;
+    virtual void Event(ReadEvent &&event) = 0;
+    virtual void Event(CloseEvent &&event) = 0;
 
     virtual void Start() {};
     virtual void Stop() {};
index 3abe21ca30c9ae2f694c942ef1036cd6f8ebd7bf..a9dc374e6d08feb1918004c543d340eaf557160e 100644 (file)
@@ -47,9 +47,9 @@
     void EventInternal##eventType(const eventType &event)
 
 #define DECLARE_THREAD_EVENT(eventType, methodName)                   \
-    void Event(const eventType &event) {                              \
+    void Event(eventType &&event) {                              \
         SecurityManager::ServiceThread<ParentClassName>::              \
-            Event(event,                                              \
+            Event(std::move(event),                                              \
                   this,                                               \
                   &ParentClassName::methodName);                      \
     }
@@ -112,16 +112,16 @@ public:
     }
 
     template <class T>
-    void Event(const T &event,
+    void Event(T &&event,
                Service *servicePtr,
-               void (Service::*serviceFunction)(const T &))
+               void (Service::*serviceFunction)(T &&))
     {
         EventDescription description;
         description.serviceFunctionPtr =
             reinterpret_cast<void (Service::*)(void*)>(serviceFunction);
         description.servicePtr = servicePtr;
         description.eventFunctionPtr = &ServiceThread::EventCall<T>;
-        description.eventPtr = new T(event);
+        description.eventPtr = new T(std::move(event));
         {
             std::lock_guard<std::mutex> lock(m_eventQueueMutex);
             m_eventQueue.push(description);
@@ -134,15 +134,15 @@ protected:
     struct EventDescription {
         void (Service::*serviceFunctionPtr)(void *);
         Service *servicePtr;
-        void (ServiceThread::*eventFunctionPtr)(const EventDescription &event);
+        void (ServiceThread::*eventFunctionPtr)(EventDescription &event);
         GenericEvent* eventPtr;
     };
 
     template <class T>
-    void EventCall(const EventDescription &desc) {
-        auto fun = reinterpret_cast<void (Service::*)(const T&)>(desc.serviceFunctionPtr);
-        const T& eventLocale = *(static_cast<T*>(desc.eventPtr));
-        (desc.servicePtr->*fun)(eventLocale);
+    void EventCall(EventDescription &desc) {
+        auto fun = reinterpret_cast<void (Service::*)(T&&)>(desc.serviceFunctionPtr);
+        T& eventLocale = *(static_cast<T*>(desc.eventPtr));
+        (desc.servicePtr->*fun)(std::move(eventLocale));
     }
 
     static void ThreadLoopStatic(ServiceThread *ptr) {
index 99befa5ef504854ff8778c66a4c827389005a0d5..851cf118ecb91aeb7fce84ef83363d6e6a4239de 100644 (file)
@@ -63,10 +63,10 @@ struct DummyService : public GenericSocketService {
     ServiceDescriptionVector GetServiceDescription() {
         return ServiceDescriptionVector();
     }
-    void Event(const AcceptEvent &event) { (void)event; }
-    void Event(const WriteEvent &event) { (void)event; }
-    void Event(const ReadEvent &event) { (void)event; }
-    void Event(const CloseEvent &event) { (void)event; }
+    void Event(AcceptEvent &&) { }
+    void Event(WriteEvent &&) { }
+    void Event(ReadEvent &&) { }
+    void Event(CloseEvent &&) { }
 };
 
 struct SignalService : public GenericSocketService {
@@ -85,11 +85,11 @@ struct SignalService : public GenericSocketService {
         return ServiceDescriptionVector();
     }
 
-    void Event(const AcceptEvent &event) { (void)event; } // not supported
-    void Event(const WriteEvent &event) { (void)event; }  // not supported
-    void Event(const CloseEvent &event) { (void)event; }  // not supported
+    void Event(AcceptEvent &&) { } // not supported
+    void Event(WriteEvent &&) { }  // not supported
+    void Event(CloseEvent &&) { }  // not supported
 
-    void Event(const ReadEvent &event) {
+    void Event(ReadEvent &&event) {
         LogDebug("Get signal information");
 
         if (sizeof(struct signalfd_siginfo) != event.rawBuffer.size()) {
@@ -226,7 +226,7 @@ void SocketManager::ReadyForAccept(int sock) {
         ConnectionID{client, desc.counter},
         desc.interfaceID,
         Credentials::getCredentialsFromSocket(client));
-    desc.service->Event(event);
+    desc.service->Event(std::move(event));
 }
 
 void SocketManager::ReadyForRead(int sock) {
@@ -250,7 +250,7 @@ void SocketManager::ReadyForRead(int sock) {
         CloseSocket(sock);
     } else if (size >= 0) {
         event.rawBuffer.resize(size);
-        desc.service->Event(event);
+        desc.service->Event(std::move(event));
     } else if (size == -1) {
         int err = errno;
         switch (err) {
@@ -304,7 +304,7 @@ void SocketManager::ReadyForSendMsg(int sock) {
     event.size = result;
     event.left = desc.sendMsgDataQueue.size();
 
-    desc.service->Event(event);
+    desc.service->Event(std::move(event));
 }
 
 void SocketManager::ReadyForWriteBuffer(int sock) {
@@ -340,7 +340,7 @@ void SocketManager::ReadyForWriteBuffer(int sock) {
     event.size = result;
     event.left = desc.rawBuffer.size();
 
-    desc.service->Event(event);
+    desc.service->Event(std::move(event));
 }
 
 void SocketManager::ReadyForWrite(int sock) {
@@ -753,7 +753,7 @@ void SocketManager::CloseSocket(int sock) {
         desc.sendMsgDataQueue.pop();
 
     if (service)
-        service->Event(event);
+        service->Event(std::move(event));
     else
         LogError("Critical! Service is NULL! This should never happend!");
 
index a650d63b743f94b999ddae834ed7fe3f013cc0ea..984ec51a297d505a62ee331303820cf09d65c069 100644 (file)
@@ -40,7 +40,7 @@ BaseService::BaseService(Offline offline)
 {
 }
 
-void BaseService::accept(const AcceptEvent &event)
+void BaseService::accept(AcceptEvent &&event)
 {
     LogDebug("Accept event. ConnectionID.sock: " << event.connectionID.sock <<
              " ConnectionID.counter: " << event.connectionID.counter <<
@@ -49,10 +49,10 @@ void BaseService::accept(const AcceptEvent &event)
     m_connectionInfoMap.emplace(
         std::make_pair(
             event.connectionID.counter,
-            ConnectionInfo(event.interfaceID, event.creds)));
+            ConnectionInfo(event.interfaceID, std::move(event.creds))));
 }
 
-void BaseService::write(const WriteEvent &event)
+void BaseService::write(WriteEvent &&event)
 {
     LogDebug("WriteEvent. ConnectionID: " << event.connectionID.sock <<
              " Size: " << event.size <<
@@ -62,7 +62,7 @@ void BaseService::write(const WriteEvent &event)
         m_serviceManager->Close(event.connectionID);
 }
 
-void BaseService::process(const ReadEvent &event)
+void BaseService::process(ReadEvent &&event)
 {
     LogDebug("Read event for counter: " << event.connectionID.counter);
     auto &info = m_connectionInfoMap.at(event.connectionID.counter);
@@ -73,7 +73,7 @@ void BaseService::process(const ReadEvent &event)
     while (processOne(event.connectionID, info.buffer, info.interfaceID));
 }
 
-void BaseService::close(const CloseEvent &event)
+void BaseService::close(CloseEvent &&event)
 {
     LogDebug("CloseEvent. ConnectionID: " << event.connectionID.sock);
     m_connectionInfoMap.erase(event.connectionID.counter);
index b8e042b86c9d0b0fb0fc3c9c4f4733b874e863fb..1997c19c65dba40ada0b6017ba2fbd9a5c60b44f 100644 (file)
@@ -53,10 +53,10 @@ public:
     DECLARE_THREAD_EVENT(ReadEvent, process)
     DECLARE_THREAD_EVENT(CloseEvent, close)
 
-    void accept(const AcceptEvent &event);
-    void write(const WriteEvent &event);
-    void process(const ReadEvent &event);
-    void close(const CloseEvent &event);
+    void accept(AcceptEvent &&event);
+    void write(WriteEvent &&event);
+    void process(ReadEvent &&event);
+    void close(CloseEvent &&event);
 
     void Start();
     void Stop();