From b90ba316b54db321d3e8aaac7df93b46d80b9d9c Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期二, 22 十二月 2020 15:47:41 +0800
Subject: [PATCH] 三个没有回收的信号

---
 src/queue/mm.c                        |   16 +++++--
 test/Makefile                         |    2 
 test_net_socket/test_net_mod_socket.c |   24 ++++++++++++
 test/test.c                           |   35 +----------------
 4 files changed, 39 insertions(+), 38 deletions(-)

diff --git a/src/queue/mm.c b/src/queue/mm.c
index 979cced..dc6f5be 100644
--- a/src/queue/mm.c
+++ b/src/queue/mm.c
@@ -310,7 +310,14 @@
   if(shmctl(shmid, IPC_STAT, &shmid_ds) == 0) {
     //LoggerFactory::getLogger()->debug("shm_nattch=%d\n", shmid_ds.shm_nattch);
     // 鍙湁褰撳墠涓�涓繘绋媋ttach鍒板叡浜唴瀛樹笂
-    if(shmid_ds.shm_nattch == 1) {
+    if (shmid_ds.shm_nattch > 1) {
+      //detache
+      if (shmdt(shmp) == -1) {
+        LoggerFactory::getLogger()->error(errno, "mm_destroy shmdt");
+      }
+      SemUtil::inc(mutex);
+      return false;
+    } else  {
       
       hashtable_destroy(hashtable);
       //detache
@@ -326,14 +333,13 @@
       else 
          LoggerFactory::getLogger()->debug("shared memory destroy\n");
 
+      LoggerFactory::getLogger()->debug(errno, "mm_destroy: real destroy.");
+
       SemUtil::inc(mutex);
       SemUtil::remove(mutex);
       return true;
 
-    } else {
-      SemUtil::inc(mutex);
-      return false;
-    }
+    } 
     
   } else {
     err_msg(errno, "mm_destroy shmctl IPC_STAT");
diff --git a/test/Makefile b/test/Makefile
index 7046699..f719401 100755
--- a/test/Makefile
+++ b/test/Makefile
@@ -13,7 +13,7 @@
 INCLUDES += -I${DEST}/include/shmqueue -I$(ROOT)/include/usgcommon
 
 
-PROGS = ${DEST}/test test2
+PROGS = ${DEST}/test
 
 DEPENDENCES = $(patsubst %, %.d, $(PROGS)) 
 
diff --git a/test/test.c b/test/test.c
index ab21287..40f5af7 100644
--- a/test/test.c
+++ b/test/test.c
@@ -1,39 +1,10 @@
 #include "usg_common.h"
 static void sig_quit(int);
+#define SIGCLOSE1   (SIGRTMIN +1)
 int
 main(void)
 {
-  sigset_t
-  newmask, oldmask, pendmask;
-  if (signal(SIGQUIT, sig_quit) == SIG_ERR)
-    err_exit(errno, "can鈥檛 catch SIGQUIT");
-  /*
-  * Block SIGQUIT and save current signal mask.
-  */
-  sigemptyset(&newmask);
-  sigaddset(&newmask, SIGQUIT);
-  if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
-    err_exit(errno, "SIG_BLOCK error");
-  sleep(5);
-  /* SIGQUIT here will remain pending */
-  if (sigpending(&pendmask) < 0)
-    err_exit(errno, "sigpending error");
-  if (sigismember(&pendmask, SIGQUIT))
-    printf("\nSIGQUIT pending\n");
-  /*
-  * Restore signal mask which unblocks SIGQUIT.
-  */
-  if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
-    err_exit(errno, "SIG_SETMASK error");
-  printf("SIGQUIT unblocked\n");
-  sleep(5);
-  exit(0);
+ printf("%d, %d , %d\n", SIGRTMIN, SIGRTMAX, SIGCLOSE1);
   /* SIGQUIT here will terminate with core file */
 }
-
-static void sig_quit(int signo)
-{
-  printf("caught SIGQUIT\n");
-  if (signal(SIGQUIT, SIG_DFL) == SIG_ERR)
-    err_exit(errno, "can鈥檛 reset SIGQUIT");
-}
+ 
\ No newline at end of file
diff --git a/test_net_socket/test_net_mod_socket.c b/test_net_socket/test_net_mod_socket.c
index fecf754..f777773 100644
--- a/test_net_socket/test_net_mod_socket.c
+++ b/test_net_socket/test_net_mod_socket.c
@@ -33,9 +33,33 @@
 
 void * client;
 
+void *proxy_server_handler(void *sockt) {
+  pthread_detach(pthread_self());
+  
+  char action[512];
+  while ( true) {
+    printf("Input action: Close?\n");
+    if(scanf("%s",action) < 1) {
+      printf("Invalide action\n");
+      continue;
+    }
+
+    if(strcmp(action, "close") == 0) {
+      net_mod_server_socket_close(sockt);
+      break;
+    } else {
+      printf("Invalide action\n");
+    }
+  }  
+}
+
 void start_net_proxy(int port) {
+  pthread_t tid;
   printf("Start net proxy\n");
 	void *serverSocket  = net_mod_server_socket_open(port);
+
+   // 鍒涘缓涓�涓嚎绋�,鍙互鍏抽棴server
+  pthread_create(&tid, NULL, proxy_server_handler, serverSocket);
 	if(net_mod_server_socket_start(serverSocket) != 0) {
 		err_exit(errno, "net_mod_server_socket_start");
 	}

--
Gitblit v1.8.0