hewei.it преди 5 години
родител
ревизия
ca982ca961
променени са 4 файла, в които са добавени 34 реда и са изтрити 16 реда
  1. 1 1
      event/hloop.h
  2. 4 8
      event/nio.c
  3. 17 5
      event/nlog.h
  4. 12 2
      utils/singleton.h

+ 1 - 1
event/hloop.h

@@ -103,7 +103,7 @@ BEGIN_EXTERN_C
 #define HLOOP_FLAG_QUIT_WHEN_NO_ACTIVE_EVENTS   0x00000004
 HV_EXPORT hloop_t* hloop_new(int flags DEFAULT(HLOOP_FLAG_AUTO_FREE));
 
-// WARN: Forbid to call hloop_free if HLOOP_INIT_FLAG_AUTO_FREE set.
+// WARN: Forbid to call hloop_free if HLOOP_FLAG_AUTO_FREE set.
 HV_EXPORT void hloop_free(hloop_t** pp);
 
 // NOTE: when no active events, loop will quit if HLOOP_FLAG_QUIT_WHEN_NO_ACTIVE_EVENTS set.

+ 4 - 8
event/nio.c

@@ -551,18 +551,14 @@ int hio_close (hio_t* io) {
 
     io->closed = 1;
     hio_del(io, HV_RDWR);
-    if (io->io_type & HIO_TYPE_SOCKET) {
-#ifdef OS_UNIX
-        close(io->fd);
-#else
-        closesocket(io->fd);
-#endif
-    }
+    __close_cb(io);
     if (io->ssl) {
         hssl_free(io->ssl);
         io->ssl = NULL;
     }
-    __close_cb(io);
+    if (io->io_type & HIO_TYPE_SOCKET) {
+        closesocket(io->fd);
+    }
     return 0;
 }
 #endif

+ 17 - 5
event/nlog.h

@@ -9,14 +9,26 @@
  */
 
 /*
- * @code
-    hloop_t loop;
-    hloop_init(&loop);
+ * @see examples/hloop_test.c
+#include "hlog.h"
+#include "nlog.h"
+
+void timer_write_log(htimer_t* timer) {
+    static int cnt = 0;
+    hlogi("[%d] Do you recv me?", ++cnt);
+}
+
+int main() {
+    hloop_t* loop = hloop_new(0);
     hlog_set_logger(network_logger);
-    nlog_listen(&loop, DEFAULT_LOG_PORT);
-    hloop_run(&loop);
+    nlog_listen(loop, DEFAULT_LOG_PORT);
+    htimer_add(loop, timer_write_log, 1000, INFINITE);
+    hloop_run(loop);
+    hloop_free(&loop);
+}
  */
 
+
 #include "hexport.h"
 #include "hloop.h"
 

+ 12 - 2
utils/singleton.h

@@ -1,6 +1,8 @@
 #ifndef HV_SINGLETON_H_
 #define HV_SINGLETON_H_
 
+#include <mutex>
+
 #define DISABLE_COPY(Class) \
     Class(const Class&) = delete; \
     Class& operator=(const Class&) = delete;
@@ -11,21 +13,29 @@
         static void exitInstance(); \
     private: \
         DISABLE_COPY(Class) \
-        static Class* s_pInstance;
+        static Class* s_pInstance; \
+        static std::mutex s_mutex;
 
 #define SINGLETON_IMPL(Class) \
     Class* Class::s_pInstance = NULL; \
+    std::mutex Class::s_mutex; \
     Class* Class::instance() { \
         if (s_pInstance == NULL) { \
-            s_pInstance = new Class; \
+            s_mutex.lock(); \
+            if (s_pInstance == NULL) { \
+                s_pInstance = new Class; \
+            } \
+            s_mutex.unlock(); \
         } \
         return s_pInstance; \
     } \
     void Class::exitInstance() { \
+        s_mutex.lock(); \
         if (s_pInstance) {  \
             delete s_pInstance; \
             s_pInstance = NULL; \
         }   \
+        s_mutex.unlock(); \
     }
 
 #endif // HV_SINGLETON_H_