Change Cynara class model from singleton to common object
authorLukasz Wojciechowski <l.wojciechow@partner.samsung.com>
Thu, 26 Jun 2014 12:13:37 +0000 (14:13 +0200)
committerRafal Krypa <r.krypa@samsung.com>
Thu, 3 Jul 2014 12:19:10 +0000 (14:19 +0200)
Use shared pointers for layers managers (Logic, SocketManager,
Storage). Add bind...() and unbindAll() methods in layers managers.

Change-Id: If7fe5f36933e244c48c3ab2b6699a0d9b8e4f4a7

12 files changed:
src/common/request/CheckRequest.cpp
src/common/request/CheckRequest.h
src/common/request/Request.h
src/common/request/pointers.h
src/service/logic/Logic.cpp
src/service/logic/Logic.h
src/service/main/Cynara.cpp
src/service/main/Cynara.h
src/service/main/main.cpp
src/service/main/pointers.h [new file with mode: 0644]
src/service/sockets/SocketManager.cpp
src/service/sockets/SocketManager.h

index 5473a79..0648055 100644 (file)
@@ -26,9 +26,9 @@
 
 namespace Cynara {
 
-void CheckRequest::execute(RequestPtr self, RequestTaker &taker,
+void CheckRequest::execute(RequestPtr self, RequestTakerPtr taker,
                            RequestContextPtr context) const {
-    taker.execute(context, std::dynamic_pointer_cast<CheckRequest>(self));
+    taker->execute(context, std::dynamic_pointer_cast<CheckRequest>(self));
 }
 
 } // namespace Cynara
index 7e547fb..cc4e4f2 100644 (file)
@@ -45,7 +45,7 @@ public:
         return m_key;
     }
 
-    virtual void execute(RequestPtr self, RequestTaker &taker, RequestContextPtr context) const;
+    virtual void execute(RequestPtr self, RequestTakerPtr taker, RequestContextPtr context) const;
 };
 
 } // namespace Cynara
index aadbd4c..6e7d6fa 100644 (file)
@@ -33,7 +33,7 @@ public:
     Request() = default;
     virtual ~Request() = default;
 
-    virtual void execute(RequestPtr self, RequestTaker &taker, RequestContextPtr context) const = 0;
+    virtual void execute(RequestPtr self, RequestTakerPtr taker, RequestContextPtr context) const = 0;
 };
 
 } // namespace Cynara
index cc306f3..1def987 100644 (file)
@@ -36,6 +36,9 @@ typedef std::shared_ptr<Request> RequestPtr;
 class RequestContext;
 typedef std::shared_ptr<RequestContext> RequestContextPtr;
 
+class RequestTaker;
+typedef std::shared_ptr<RequestTaker> RequestTakerPtr;
+
 } // namespace Cynara
 
 #endif /* SRC_COMMON_REQUEST_POINTERS_H_ */
index 3944a8f..9432231 100644 (file)
@@ -48,7 +48,7 @@ void Logic::execute(RequestContextPtr context, CheckRequestPtr request) {
 
 bool Logic::check(RequestContextPtr context UNUSED, const PolicyKey &key,
                   PolicyResult& result) {
-    result = Cynara::getStorage()->checkPolicy(key);
+    result = m_storage->checkPolicy(key);
 
     switch (result.policyType()) {
         case PredefinedPolicyType::ALLOW :
index 9ef96f4..da4654c 100644 (file)
@@ -26,6 +26,7 @@
 #include <types/PolicyKey.h>
 #include <types/PolicyResult.h>
 
+#include <main/pointers.h>
 #include <request/pointers.h>
 #include <request/RequestTaker.h>
 
@@ -36,9 +37,25 @@ public:
     Logic();
     virtual ~Logic();
 
+    void bindStorage(StoragePtr storage) {
+        m_storage = storage;
+    }
+
+    void bindSocketManager(SocketManagerPtr socketManager) {
+        m_socketManager = socketManager;
+    }
+
+    void unbindAll(void) {
+        m_storage.reset();
+        m_socketManager.reset();
+    }
+
     virtual void execute(RequestContextPtr context, CheckRequestPtr request);
 
 private:
+    StoragePtr m_storage;
+    SocketManagerPtr m_socketManager;
+
     bool check(RequestContextPtr context, const PolicyKey &key, PolicyResult& result);
 
 };
index ff03530..57a15d5 100644 (file)
  * @brief       This file implements main class of cynara service
  */
 
+#include <memory>
 #include <stddef.h>
 
+#include <exceptions/InitException.h>
+
+#include <logic/Logic.h>
+#include <sockets/SocketManager.h>
 #include <storage/InMemoryStorageBackend.h>
+#include <storage/Storage.h>
+#include <storage/StorageBackend.h>
 
 #include "Cynara.h"
 
@@ -32,42 +39,34 @@ Cynara::Cynara()
     : m_logic(nullptr), m_socketManager(nullptr), m_storage(nullptr), m_storageBackend(nullptr) {
 }
 
-Cynara* Cynara::getInstance(void) {
-    static Cynara instance;
-    return &instance;
-}
-
 Cynara::~Cynara() {
+    finalize();
 }
 
 void Cynara::init(void) {
-    getInstance()->m_logic = new Logic();
-    getInstance()->m_socketManager = new SocketManager();
-    getInstance()->m_storageBackend = new InMemoryStorageBackend();
-    getInstance()->m_storage = new Storage(*getInstance()->m_storageBackend);
-}
+    m_logic = std::make_shared<Logic>();
+    m_socketManager = std::make_shared<SocketManager>();
+    m_storageBackend = std::make_shared<InMemoryStorageBackend>();
+    m_storage = std::make_shared<Storage>(*m_storageBackend);
 
-void Cynara::run(void) {
-    getInstance()->m_socketManager->run();
-}
+    m_logic->bindStorage(m_storage);
+    m_logic->bindSocketManager(m_socketManager);
 
-void Cynara::finalize(void) {
-    delete getInstance()->m_logic;
-    delete getInstance()->m_socketManager;
-    delete getInstance()->m_storageBackend;
-    delete getInstance()->m_storage;
+    m_socketManager->bindLogic(m_logic);
 }
 
-Logic *Cynara::getLogic(void) {
-    return getInstance()->m_logic;
+void Cynara::run(void) {
+    m_socketManager->run();
 }
 
-SocketManager *Cynara::getSocketManager(void) {
-    return getInstance()->m_socketManager;
-}
+void Cynara::finalize(void) {
+    m_logic->unbindAll();
+    m_socketManager->unbindAll();
 
-Storage *Cynara::getStorage(void) {
-    return getInstance()->m_storage;
+    m_logic.reset();
+    m_socketManager.reset();
+    m_storageBackend.reset();
+    m_storage.reset();
 }
 
 } // namespace Cynara
index 5a024fb..207e1b0 100644 (file)
 #ifndef SRC_SERVICE_MAIN_CYNARA_H_
 #define SRC_SERVICE_MAIN_CYNARA_H_
 
-#include <logic/Logic.h>
-#include <sockets/SocketManager.h>
-#include <storage/Storage.h>
-#include <storage/StorageBackend.h>
+#include <main/pointers.h>
 
 namespace Cynara {
 
 class Cynara {
 private:
-    Logic *m_logic;
-    SocketManager *m_socketManager;
-    Storage *m_storage;
-    StorageBackend *m_storageBackend;
-
-    Cynara();
-
-    static Cynara *getInstance(void);
+    LogicPtr m_logic;
+    SocketManagerPtr m_socketManager;
+    StoragePtr m_storage;
+    StorageBackendPtr m_storageBackend;
 
 public:
+    Cynara();
     ~Cynara();
 
-    static void init(void);
-    static void run(void);
-    static void finalize(void);
-
-    static Logic *getLogic(void);
-    static SocketManager *getSocketManager(void);
-    static Storage *getStorage(void);
-
+    void init(void);
+    void run(void);
+    void finalize(void);
 };
 
 } // namespace Cynara
index cfe17e7..766a422 100644 (file)
 #include <log/log.h>
 #include "Cynara.h"
 
-using namespace Cynara;
-
 int main(int argc UNUSED, char **argv UNUSED) {
     int ret;
 
     init_log();
 
     try {
+        Cynara::Cynara cynara;
         LOGI("Cynara service is starting ...");
-        Cynara::Cynara::init();
+        cynara.init();
         LOGI("Cynara service is started");
 
         ret = sd_notify(0, "READY=1");
@@ -62,10 +61,10 @@ int main(int argc UNUSED, char **argv UNUSED) {
         }
 
         LOGD("Starting the real job");
-        Cynara::Cynara::run();
+        cynara.run();
 
         LOGD("Time to clean up.");
-        Cynara::Cynara::finalize();
+        cynara.finalize();
         LOGD("Cynara service is stopped");
     } catch (std::exception &e) {
         LOGC("Cynara stoped because of unhandled exception: %s", e.what());
diff --git a/src/service/main/pointers.h b/src/service/main/pointers.h
new file mode 100644 (file)
index 0000000..640f52c
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/*
+ * @file        pointers.h
+ * @author      Lukasz Wojciechowski <l.wojciechow@partner.samsung.com>
+ * @version     1.0
+ * @brief       This file defines request base class
+ */
+
+#ifndef SRC_SERVICE_MAIN_POINTERS_H_
+#define SRC_SERVICE_MAIN_POINTERS_H_
+
+#include <memory>
+
+namespace Cynara {
+
+class Logic;
+typedef std::shared_ptr<Logic> LogicPtr;
+
+class SocketManager;
+typedef std::shared_ptr<SocketManager> SocketManagerPtr;
+
+class Storage;
+typedef std::shared_ptr<Storage> StoragePtr;
+
+class StorageBackend;
+typedef std::shared_ptr<StorageBackend> StorageBackendPtr;
+
+} // namespace Cynara
+
+#endif /* SRC_SERVICE_MAIN_POINTERS_H_ */
index fae4984..4c8442e 100644 (file)
@@ -354,9 +354,8 @@ void SocketManager::removeWriteSocket(int fd) {
     FD_CLR(fd, &m_writeSet);
 }
 
-RequestTaker &SocketManager::requestTaker(void) {
-    //todo change
-    return *Cynara::getLogic();
+RequestTakerPtr SocketManager::requestTaker(void) {
+    return std::static_pointer_cast<RequestTaker>(m_logic);
 }
 
 } // namespace Cynara
index 03e7ca9..6112963 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <common.h>
 
+#include <main/pointers.h>
 #include <protocol/Protocol.h>
 #include <request/RequestTaker.h>
 #include "Descriptor.h"
@@ -45,7 +46,17 @@ public:
     void run(void);
     void mainLoopStop(void);
 
+    void bindLogic(LogicPtr logic) {
+        m_logic = logic;
+    }
+
+    void unbindAll(void) {
+        m_logic.reset();
+    }
+
 private:
+    LogicPtr m_logic;
+
     typedef std::vector<Descriptor> FDVector;
     FDVector m_fds;
 
@@ -75,7 +86,7 @@ private:
     void addWriteSocket(int fd);
     void removeWriteSocket(int fd);
 
-    RequestTaker &requestTaker(void);
+    RequestTakerPtr requestTaker(void);
 };
 
 } // namespace Cynara