Jelajahi Sumber

#1 vendor修改

Signed-off-by: wlxuz <myxuan475@126.com>
Change-Id: I5d53b287644cfcc6cc3c0b0fa869ecf7269312f6
wlxuz 9 bulan lalu
induk
melakukan
7effd35ac2
11 mengubah file dengan 245 tambahan dan 79 penghapusan
  1. 16 4
      C10/CMakeLists.txt
  2. 6 10
      C10/vendor.json
  3. 21 0
      C10/vendor_global.h
  4. 18 8
      C4/CMakeLists.txt
  5. 41 0
      C4/vendor.json
  6. 18 0
      C4/vendor_global.h
  7. 18 6
      Linux/CMakeLists.txt
  8. 3 4
      Linux/vendor.json
  9. 1 1
      Linux/vendor_global.h
  10. 88 45
      vendor_base.cpp
  11. 15 1
      vendor_base.h

+ 16 - 4
C10/CMakeLists.txt

@@ -29,12 +29,13 @@ add_definitions(-DUSE_HTNICE)
 add_definitions(-DHTNICE_K4)
 # add_definitions(-DLINUX)
 
-set(BUILD_SHARED_LIBS ON)
+set(BUILD_SHARED_LIBS OFF)
 set(EVENT_LIBRARY_TYPE STATIC)
 
 include_directories(${PRODUCT_ROOT_DIR})
 include_directories(${PRODUCT_ROOT_DIR}/thirdparty)
 include_directories(${PRODUCT_BUILD_DIR}/thirdparty)
+include_directories(${PRODUCT_ROOT_DIR}/vendor/${PRODUCT_NAME})
 
 # set(OPENSSL_ROOT_DIR "${PRODUCT_BUILD_DIR}/thirdparty/openssl")
 # set(OPENSSL_CRYPTO_LIBRARY ${PRODUCT_BUILD_DIR}/thirdparty/openssl/crypto/libcrypto.so)
@@ -51,10 +52,21 @@ set(LIBXML2_WITH_PYTHON OFF)
 
 build_subdirectory(thirdparty/SQLiteCpp INCLUDE thirdparty/SQLiteCpp/sqlite3)
 
-# build_subdirectory(utils)
+build_subdirectory(utils)
 
-# build_subdirectory(foundation/gw_leo)
+build_subdirectory(foundation/gw_leo)
 
 # build_subdirectory(foundation/webconfig)
 
-# build_subdirectory(Lora/sx1302_hal)
+# build_subdirectory(Lora/sx1302_hal)
+
+# {
+#     "name": "xfrpc",
+#     "options":["-DTHIRDPARTY_STATIC_BUILD=arm"],
+#     "include":["$PRODUCT_ROOT_DIR/thirdparty/zlib", "$PRODUCT_BUILD_DIR/thirdparty/zlib"],
+#     "deps":["zlib"]
+# },
+# {
+#     "name": "libevent",
+#     "options":["-DEVENT__DISABLE_TESTS=ON", "-DEVENT__HAVE_EPOLL_PWAIT2=0"]
+# }

+ 6 - 10
C10/vendor.json

@@ -1,12 +1,12 @@
 {
-    "product-name": "C10",
+    "product-name": "C4",
     "version": "1.0.0",
     "toolchain":"$PRODUCT_ROOT_DIR/buildtools/cmake/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.cmake",
     "build-mode": "Debug",
     "modules":[
         {
             "name": "jsoncpp",
-            "options": [],
+            "options": ["-DJSONCPP_WITH_TESTS=OFF"],
             "include":"$PRODUCT_ROOT_DIR/thirdparty/jsoncpp/include"
         },
         {
@@ -25,6 +25,10 @@
         {
             "name": "tinyxml2"
         },
+        {
+            "name": "libxml2",
+            "options":["-DLIBXML2_WITH_PYTHON=OFF"]
+        },
         {
             "name" : "goahead",
             "include":"$PRODUCT_BUILD_DIR/thirdparty/goahead/build/linux-x64-default/inc",
@@ -37,14 +41,6 @@
             ],
             "exports":[
             ]
-        },
-        {
-            "name": "libevent",
-            "options":["-DEVENT__DISABLE_TESTS=ON", "-DEVENT__HAVE_EPOLL_PWAIT2=0"]
-        },
-        {
-            "name": "xfrpc",
-            "options":["-DTHIRDPARTY_STATIC_BUILD=ON"]
         }
     ]
 }

+ 21 - 0
C10/vendor_global.h

@@ -0,0 +1,21 @@
+#ifndef __VENDOR_GLOBAL_H__
+#define __VENDOR_GLOBAL_H__
+#include <utils/logger.h>
+#include <utils/macro.h>
+
+#define VENDOR_MAX_PATH_SIZE 256
+#define VENDOR_RUN_PATH_ENV  "DAS_CONFIG_DIR"
+
+static inline std::string vendor_env_dir()
+{
+    ASSERT(getenv(VENDOR_RUN_PATH_ENV) != nullptr);
+    return std::string(getenv(VENDOR_RUN_PATH_ENV));
+}
+
+const std::string VENDOR_CONFIG_PATH = vendor_env_dir() + "/config";
+const std::string VENDOR_LOG_PATH = vendor_env_dir() + "/log";
+const std::string VENDOR_BIN_PATH = vendor_env_dir() + "/bin";
+const std::string VENDOR_DB_PATH = vendor_env_dir() + "/data";
+const std::string VENDOR_WWW_PATH = vendor_env_dir() + "/WWW";
+
+#endif // __VENDOR_GLOBAL_H__

+ 18 - 8
C4/CMakeLists.txt

@@ -1,6 +1,6 @@
 
 #rights reserved
-cmake_minimum_required(VERSION 2.8)
+cmake_minimum_required(VERSION 3.6)
 
 include(${ROOT_DIR}/buildtools/cmake/gcc-gt675x-10.4.0-2023.06.27-x86_64_aarch64-htnice-linux-gnu.cmake)
 #project name
@@ -8,7 +8,8 @@ set(PROJECT_NAME "leo-das")
 
 message(INFO " SYSTEM_ARCH:${SYSTEM_ARCH}\n")
 set(CMAKE_BUILD_TYPE RELEASE)
-set(CMAKE_CXX_FLAGS "-fPIC -std=gnu++0x")
+set(CMAKE_CXX_FLAGS "-fPIC -std=gnu++11 -Wno-error=implicit-function-declaration -Wno-error=int-conversion")
+set(CMAKE_C_FLAGS "-O3 -fPIC -Wunused-result -Wno-error=implicit-function-declaration -Wno-error=int-conversion")
 
 # 获取当前的分支
 set(GIT_BRANCH "")
@@ -38,15 +39,24 @@ set(BUILD_SHARED_LIBS OFF)
 set(EVENT_LIBRARY_TYPE STATIC)
 
 include_directories(${PRODUCT_ROOT_DIR})
-
-build_subdirectory(thirdparty/openssl link thirdparty/openssl/ssl)
-build_subdirectory(thirdparty/mbedtls)
-build_subdirectory(thirdparty/zlib)
+include_directories(${PRODUCT_ROOT_DIR}/thirdparty)
+include_directories(${PRODUCT_BUILD_DIR}/thirdparty)
+include_directories(${PRODUCT_ROOT_DIR}/vendor/${PRODUCT_NAME})
+
+# set(OPENSSL_ROOT_DIR "${PRODUCT_BUILD_DIR}/thirdparty/openssl")
+# set(OPENSSL_CRYPTO_LIBRARY ${PRODUCT_BUILD_DIR}/thirdparty/openssl/crypto/libcrypto.so)
+# set(OPENSSL_SSL_LIBRARY ${PRODUCT_BUILD_DIR}/thirdparty/openssl/ssl/libssl.so)
+# set(OPENSSL_INCLUDE_DIR "${PRODUCT_BUILD_DIR}/thirdparty/openssl/include")
+# # set(CMAKE_EXE_LINKER_FLAGS "-L${PRODUCT_BUILD_DIR}/thirdparty/openssl/crypto -lcrypto -L${PRODUCT_BUILD_DIR}/thirdparty/openssl/ssl -lssl")
+# # INCLUDE thirdparty/openssl/include LINK thirdparty/openssl/ssl thirdparty/openssl/crypto
+# build_project(thirdparty/openssl)
+# build_subdirectory(thirdparty/mbedtls)
+# build_subdirectory(thirdparty/zlib)
 
 set(LIBXML2_WITH_PYTHON OFF)
-build_subdirectory(thirdparty/libxml2)
+# build_subdirectory(thirdparty/libxml2 INCLUDE thirdparty/libxml2)
 
-build_subdirectory(thirdparty/SQLiteCpp include thirdparty/SQLiteCpp/sqlite3)
+build_subdirectory(thirdparty/SQLiteCpp INCLUDE thirdparty/SQLiteCpp/sqlite3)
 
 build_subdirectory(utils)
 

+ 41 - 0
C4/vendor.json

@@ -0,0 +1,41 @@
+{
+    "product-name": "C4",
+    "version": "1.0.0",
+    "toolchain":"$PRODUCT_ROOT_DIR/buildtools/cmake/gcc-gt675x-10.4.0-2023.06.27-x86_64_aarch64-htnice-linux-gnu.cmake",
+    "build-mode": "Debug",
+    "modules":[
+        {
+            "name": "openssl",
+            "exports" : ["OPENSSL_ROOT_DIR=$PRODUCT_BUILD_DIR/thirdparty/openssl"]
+        },
+        {
+            "name": "mbedtls"
+        },
+        {
+            "name": "zlib"
+        },
+        {
+            "name": "SQLiteCpp"
+        },
+        {
+            "name": "tinyxml2"
+        },
+        {
+            "name": "libxml2",
+            "options":["-DLIBXML2_WITH_PYTHON=OFF"]
+        },
+        {
+            "name" : "goahead",
+            "include":"$PRODUCT_BUILD_DIR/thirdparty/goahead/build/linux-x64-default/inc",
+            "link": "$PRODUCT_BUILD_DIR/thirdparty/goahead/build/linux-x64-default/bin",
+            "install":[
+                {
+                    "files" : ["$PRODUCT_BUILD_DIR/thirdparty/goahead/build/linux-x64-default/*"],
+                    "dstdir": "linux-x64-default"
+                }
+            ],
+            "exports":[
+            ]
+        }
+    ]
+}

+ 18 - 0
C4/vendor_global.h

@@ -1,6 +1,24 @@
 #ifndef __VENDOR_GLOBAL_H__
 #define __VENDOR_GLOBAL_H__
 
+#include <utils/logger.h>
+#include <utils/macro.h>
+
 #define VENDOR_MAX_PATH_SIZE 256
 #define VENDOR_RUN_PATH_ENV  "DAS_CONFIG_DIR"
+
+static inline std::string vendor_env_dir()
+{
+    // ASSERT(getenv(VENDOR_RUN_PATH_ENV) != nullptr);
+    // return std::string(getenv(VENDOR_RUN_PATH_ENV));
+    return "/opt/scada";
+}
+
+const std::string VENDOR_CONFIG_PATH = vendor_env_dir() + "/config";
+const std::string VENDOR_LOG_PATH = vendor_env_dir() + "/log";
+const std::string VENDOR_BIN_PATH = vendor_env_dir() + "/bin";
+const std::string VENDOR_DB_PATH = vendor_env_dir() + "/data";
+const std::string VENDOR_WWW_PATH = vendor_env_dir() + "/WWW";
+
+// #include "vendor/vendor_base.h"
 #endif // __VENDOR_GLOBAL_H__

+ 18 - 6
Linux/CMakeLists.txt

@@ -17,18 +17,16 @@ get_git_branch(GIT_BRANCH)
 string(REGEX REPLACE ".*/(.*)" "\\1" _git_branch "${GIT_BRANCH}")
 message(STATUS "Git branch is ${_git_branch}")                     # 宏的结束
 
-add_definitions(-DDAS_VERSION=\"${_git_branch}\")
-
 project(${PROJECT_NAME})
 
 message("PRODUCT_NAME: ${PRODUCT_NAME}")
 message(STATUS "PROJECT_SOURCE_DIR: ${PRODUCT_ROOT_DIR}, PROJECT_BINARY_DIR: ${PRODUCT_BUILD_DIR}")
-
+add_definitions(-DDAS_VERSION=\"${PRODUCT_VERSION}\")
 add_definitions(-DPRODUCT_NAME=\"${PRODUCT_NAME}\")
 add_definitions(-DUSE_HTNICE)
 add_definitions(-DHTNICE_K4)
 
-set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libs?" FORCE)
+set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libs?" FORCE)
 
 include_directories(${PRODUCT_ROOT_DIR})
 include_directories(${PRODUCT_ROOT_DIR}/thirdparty)
@@ -47,8 +45,22 @@ set(LIBXML2_WITH_PYTHON OFF)
 # build_subdirectory(thirdparty/SQLiteCpp INCLUDE thirdparty/SQLiteCpp/sqlite3)
 include_directories(${PRODUCT_ROOT_DIR}/thirdparty/SQLiteCpp/sqlite3)
 
+find_path(LIBUV_INCLUDE_DIRECTORY uv.h ${PRODUCT_ROOT_DIR}/thirdparty/libuv/include NO_DEFAULT_PATH)
+# find_library(LIBUV_LIBRARY uv ${LIBUV_LIBS_DIR} NO_DEFAULT_PATH)
+list(APPEND LIBUV_INCLUDE_DIRECTORY ${LIBUV_INCLUDE_DIR})
+
+include_directories(./ ${PRODUCT_ROOT_DIR}/foundation/
+        ${LIBUV_INCLUDE_DIRECTORY})
+# OBJECT EXCLUDE_FROM_ALL
+add_library(vendor STATIC ${PRODUCT_ROOT_DIR}/vendor/vendor_base.cpp)
+target_include_directories(vendor PUBLIC ${PRODUCT_ROOT_DIR}/vendor)
+target_link_directories(vendor PUBLIC ${LIBUV_LIBS_DIR})
+target_link_libraries(vendor uv)
+
 build_subdirectory(utils)
 
 # build_subdirectory(foundation/gw_leo)
-
-build_subdirectory(foundation/webconfig)
+build_subdirectory(foundation/communications)
+build_subdirectory(foundation/leoyun)
+build_subdirectory(foundation/webconfig)
+build_subdirectory(foundation/iot-acq)

+ 3 - 4
Linux/vendor.json

@@ -1,13 +1,13 @@
 {
     "product-name": "Linux",
-    "version": "1.0.0",
+    "version": "2.0.0",
     "toolchain":"",
     "build-mode": "Debug",
     "modules":[
         {
             "name": "jsoncpp",
             "options": [],
-            "include":"$PRODUCT_ROOT_DIR/thirdparty/jsoncpp/include"
+            "exports": ["JSONCPP_INCLUDE_DIR=$PRODUCT_ROOT_DIR/thirdparty/jsoncpp/include"]
         },
         {
             "name": "openssl",
@@ -39,8 +39,7 @@
             ]
         },
         {
-            "name": "libevent",
-            "options":["-DEVENT__DISABLE_TESTS=ON", "-DEVENT__HAVE_EPOLL_PWAIT2=0"]
+            "name": "libuv"
         },
         {
             "name": "xfrpc",

+ 1 - 1
Linux/vendor_global.h

@@ -16,7 +16,7 @@ const std::string VENDOR_CONFIG_PATH = vendor_env_dir() + "/config";
 const std::string VENDOR_LOG_PATH = vendor_env_dir() + "/log";
 const std::string VENDOR_BIN_PATH = vendor_env_dir() + "/bin";
 const std::string VENDOR_DB_PATH = vendor_env_dir() + "/data";
-const std::string VENDOR_WWW_PATH = vendor_env_dir() + "/WWW";
+const std::string VENDOR_WWW_PATH = vendor_env_dir() + "/www";
 
 #include "vendor/vendor_base.h"
 #endif // __VENDOR_GLOBAL_H__

+ 88 - 45
vendor_base.cpp

@@ -1,12 +1,13 @@
 #include "vendor_base.h"
 #include "vendor_global.h"
-#include <event.h>
+#include <errno.h>
+#include <pthread.h>
 #include <signal.h>
+#include <string.h>
+#include <utils/logger.h>
 
 namespace vendor {
 
-struct event_base *eventBase_ = nullptr;
-
 LongOpts::LongOpts(const MyOpt opts[], const int size)
 {
     myOpt = opts;
@@ -52,90 +53,132 @@ MyOpt LongOpts::GetOption(char ch, int index)
 VendorBase::VendorBase()
 {
     HTELINK_LOG_ENABLE(true);
-    eventBase_ = event_base_new();
-    if (eventBase_ == nullptr) {
+    uvLoop_ = uv_default_loop();
+    if (uvLoop_ == nullptr) {
         HTELINK_LOG_ERR("event new failed, %s", strerror(errno));
     }
 }
 
 VendorBase::~VendorBase()
 {
-    if (eventBase_ == nullptr) {
+    if (uvLoop_ == nullptr) {
         return;
     }
     Exit(SIGINT);
-    event_base_free(eventBase_);
+    for (auto sig : uvSignals_) {
+        uv_close(reinterpret_cast<uv_handle_t *>(sig), nullptr);
+        delete sig;
+    }
+    uvSignals_.clear();
+    uv_loop_close(uvLoop_);
+}
+
+void VendorBase::ListenSignal(int signal)
+{
+    uv_signal_t *uvSigal = new uv_signal_t;
+    uv_signal_init(uvLoop_, uvSigal);
+    uvSigal->data = this;
+    uv_signal_start(uvSigal, VendorBase::SignalHandler, signal);
+    uvSignals_.push_back(uvSigal);
 }
 
 int VendorBase::Exec()
 {
     HTELINK_LOG_INFO("register event...");
     // 注册信号事件
-    event_add(evsignal_new(eventBase_, SIGSEGV, VendorBase::SignalHandler, this), NULL);
-    event_add(evsignal_new(eventBase_, SIGFPE, VendorBase::SignalHandler, this), NULL);
-    event_add(evsignal_new(eventBase_, SIGINT, VendorBase::SignalHandler, this), NULL);
-    event_add(evsignal_new(eventBase_, SIGTERM, VendorBase::SignalHandler, this), NULL);
-    event_add(evsignal_new(eventBase_, SIGTSTP, VendorBase::SignalHandler, this), NULL);
-
+    ListenSignal(SIGSEGV);
+    ListenSignal(SIGFPE);
+    ListenSignal(SIGINT);
+    ListenSignal(SIGTERM);
+    ListenSignal(SIGTSTP);
     signal(SIGPIPE, SIG_IGN);
 
-    HTELINK_LOG_INFO("start to Run");
-    // struct event *timer_ev = event_new(
-    //     eventBase_, -1, EV_PERSIST,
-    //     [](evutil_socket_t ev, short e, void *arg) {
-    //         VendorBase *vendorBase = static_cast<VendorBase *>(arg);
-    //         vendorBase->Run();
-    //     },
-    //     this);
-    // event_add(timer_ev, NULL);
-    std::thread fn([this] {
-        Run();
-    });
-    fn.detach();
-    // 其他业务
+    uv_work_t workReq;
+    workReq.data = this;
+    uv_queue_work(
+        uvLoop_, &workReq,
+        [](uv_work_t *req) {
+            VendorBase *vb = reinterpret_cast<VendorBase *>(req->data);
+            HTELINK_LOG_INFO("start to Run");
+            vb->Run();
+        },
+        [](uv_work_t *req, int status) {});
     HTELINK_LOG_INFO("start to deamon...");
-    return event_base_dispatch(eventBase_);
+    return uv_run(uvLoop_, UV_RUN_DEFAULT);
 }
 
 void VendorBase::Exit(int signal)
 {
     Stop(signal);
-    if (eventBase_ == nullptr) {
+    if (uvLoop_ == nullptr) {
         return;
     }
-    char dumpFile[VENDOR_MAX_PATH_SIZE];
-    sprintf(dumpFile, "%s/event_stat_%s.txt", VENDOR_LOG_PATH.c_str(), utils::nowtostr().c_str());
-    FILE *fp = fopen(dumpFile, "a");
-    event_base_dump_events(eventBase_, fp);
-    fclose(fp);
-    event_base_loopbreak(eventBase_);
+    uv_stop(uvLoop_);
 }
 
-void VendorBase::SignalHandler(int fd, short event, void *arg)
+uv_handle_t *VendorBase::AppendEvent(int fd, int ev, VendorIf *vif)
 {
-    if (event != EV_SIGNAL) {
-        HTELINK_LOG_ERR("fd: %d, event: %d occur", fd, event);
+    uv_async_t *async = new uv_async_t;
+    uv_async_cb asyncCb = [](uv_async_t *handle) {
+        VendorIf *vif = static_cast<VendorIf *>(handle->data);
+        if (vif) {
+            vif->OnEvent(nullptr);
+        }
+    };
+    uv_async_init(uvLoop_, async, asyncCb);
+    async->data = vif;
+    uv_async_send(async);
+    return (uv_handle_t *)async;
+}
+
+uv_handle_t *VendorBase::AppendTimerEvent(int millionsecs, VendorIf *vif)
+{
+    uv_timer_t *timerReq = new uv_timer_t;
+    uv_timer_init(uvLoop_, timerReq);
+    timerReq->data = vif;
+    uv_timer_cb timerCb = [](uv_timer_t *handle) {
+        VendorIf *vif = static_cast<VendorIf *>(handle->data);
+        if (vif) {
+            vif->OnTimer(nullptr);
+        }
+    };
+    uv_timer_start(timerReq, timerCb, millionsecs, 1);
+    return (uv_handle_t *)(timerReq);
+}
+
+void VendorBase::StopEvent(uv_handle_t *handle)
+{
+    if (handle == nullptr) {
         return;
     }
+    if (handle->type == UV_TIMER) {
+        uv_timer_stop((uv_timer_t *)handle);
+    } else {
+        uv_close(handle, nullptr);
+    }
+    delete handle;
+}
 
-    void *l_buffer[512];
+void VendorBase::SignalHandler(uv_signal_t *handle, int signum)
+{
+    void *l_buffer[1024];
     char **l_ptrace;
 
-    int signal = fd;
+    int signal = signum;
 
-    VendorBase *vendorBase = static_cast<VendorBase *>(arg);
+    VendorBase *vendorBase = static_cast<VendorBase *>(handle->data);
     if (vendorBase) {
         vendorBase->Exit(signal);
     }
 
-    HTELINK_LOG_ERR("\r\n=========>>>catch signal %d <<<=========", signal);
+    HTELINK_LOG_ERR("\r\n=========>>>catch signal %d, pid: %ld <<<=========", signal, getpid());
     HTELINK_LOG_ERR("Dump stack start...");
 
-    int size = backtrace(l_buffer, 512);
+    int size = backtrace(l_buffer, 1024);
     l_ptrace = backtrace_symbols(l_buffer, size);
     if (NULL == l_ptrace) {
         HTELINK_LOG_ERR("backtrace_symbols");
-        exit(1);
+        exit(signal);
     }
 
     for (int i = 0; i < size; i++) {
@@ -143,7 +186,7 @@ void VendorBase::SignalHandler(int fd, short event, void *arg)
     }
     HTELINK_LOG_ERR("Dump stack end...");
     free(l_ptrace);
-    exit(signal);
+    abort();
 }
 
 int32_t VendorBase::ParseOptionArgs(VendorBase *vendor, int argc, char *argv[])

+ 15 - 1
vendor_base.h

@@ -18,6 +18,7 @@
 #include <thread>
 #include <unistd.h>
 #include <utils/logger.h>
+#include <uv.h>
 #include <vector>
 
 namespace vendor {
@@ -41,14 +42,25 @@ struct LongOpts {
     MyOpt GetOption(char ch, int index);
 };
 
+class VendorIf {
+public:
+    virtual void OnEvent(void *args) = 0;
+    virtual void OnTimer(void *args) = 0;
+    virtual void OnShot(void *args) = 0;
+};
+
 class VendorBase {
 public:
     VendorBase();
     virtual ~VendorBase();
     static int32_t ParseOptionArgs(VendorBase *vendor, int argc, char *argv[]);
 
+    void ListenSignal(int signal);
     int Exec();
     void Exit(int signal);
+    uv_handle_t *AppendEvent(int fd, int ev, VendorIf *vif);
+    uv_handle_t *AppendTimerEvent(int millionsecs, VendorIf *vif);
+    void StopEvent(uv_handle_t *handle);
 
 protected:
     virtual int ParseCmdline(const std::string &optname, const std::string &optarg) = 0;
@@ -61,9 +73,11 @@ public:
     virtual std::string Name() = 0;
     virtual void Stop(int signal) = 0;
 
-    static void SignalHandler(int fd, short event, void *arg);
+    static void SignalHandler(uv_signal_t *handle, int signum);
 
 private:
+    uv_loop_t *uvLoop_;
+    std::vector<uv_signal_t *> uvSignals_;
 };
 
 } // namespace vendor