From 607ac3ae8bfc017e10a7907e69dcbc3ab2a0fb63 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期五, 05 二月 2021 13:54:56 +0800
Subject: [PATCH] add stop method

---
 src/socket/shm_socket.cpp |   37 +++++++++++++++++++++++++++----------
 1 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp
index 8fef2f7..fc410bf 100644
--- a/src/socket/shm_socket.cpp
+++ b/src/socket/shm_socket.cpp
@@ -112,23 +112,31 @@
 
 int shm_close_socket(shm_socket_t *sockt) {
   
-  int s;
-  
+  int rv;
   logger->debug("shm_close_socket\n");
   if(sockt->queue != NULL) {
     delete sockt->queue;
     sockt->queue = NULL;
   }
 
-  s =  pthread_mutex_destroy(&(sockt->mutex) );
-  if(s != 0) {
-    err_exit(s, "shm_close_socket");
+  rv =  pthread_mutex_destroy(&(sockt->mutex) );
+  if(rv != 0) {
+    err_exit(rv, "shm_close_socket");
   }
 
   free(sockt);
   return 0;
 }
 
+
+int shm_socket_stop(shm_socket_t *sockt) {
+  struct timespec timeout = {5, 0};
+  shm_packet_t sendpak = {0};
+  sendpak.key = sockt->key;
+  sendpak.action = BUS_ACTION_STOP;
+  sendpak.size = 0;
+  return shm_sendpakto(sockt, &sendpak, sockt->key, &timeout, BUS_TIMEOUT_FLAG);
+}
 
 int shm_socket_bind(shm_socket_t *sockt, int key) {
   sockt->key = key;
@@ -175,6 +183,7 @@
   shm_packet_t sendpak;
   shm_packet_t recvpak;
   std::map<std::string, shm_packet_t>::iterator recvbufIter;
+
   std::string uuid = sole::uuid4().str();
   
   sendpak.key = sockt->key;
@@ -507,7 +516,7 @@
   
  
  LABEL_PUSH: 
-  if (key == sockt->key) {
+  if (sendpak->action != BUS_ACTION_STOP && key == sockt->key) {
     logger->error( "can not send to your self!");
     return EBUS_SENDTO_SELF;
   }
@@ -527,10 +536,11 @@
 }
 
 // 鐭繛鎺ユ柟寮忔帴鍙�
-static int shm_recvpakfrom(shm_socket_t *sockt, shm_packet_t *recvpak ,  const struct timespec *timeout,  int flag) {
+static int shm_recvpakfrom(shm_socket_t *sockt, shm_packet_t *_recvpak ,  const struct timespec *timeout,  int flag) {
   int rv;
   
   hashtable_t *hashtable = mm_get_hashtable();
+  shm_packet_t recvpak;
 
   if( sockt->queue != NULL) 
     goto LABEL_POP;
@@ -557,11 +567,18 @@
   
 LABEL_POP:
 
+ // 
+  // printf("%p start recv.....\n", sockt);
  
-  printf("%p start recv.....\n", sockt);
- 
-  rv = sockt->queue->pop(*recvpak, timeout, flag);
+  rv = sockt->queue->pop(recvpak, timeout, flag);
+  if(rv != 0) 
+    return rv;
 
+  
+  if(recvpak.action == BUS_ACTION_STOP) {
+    return EBUS_STOPED;
+  }
+  *_recvpak = recvpak;
   return rv;
 }
 // int shm_sendandrecv(shm_socket_t *sockt, const void *send_buf,

--
Gitblit v1.8.0