From f1ae0552e2d50ce6f87a0bad2f31b8e2ec617bb7 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期三, 03 二月 2021 09:39:54 +0800
Subject: [PATCH] update

---
 src/socket/shm_socket.cpp |   50 +++++++++++++++++++++++++++++++-------------------
 1 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp
index 9544827..133190a 100644
--- a/src/socket/shm_socket.cpp
+++ b/src/socket/shm_socket.cpp
@@ -148,27 +148,31 @@
 
   hashtable_t *hashtable = mm_get_hashtable();
 
+  if( sockt->queue != NULL) 
+    goto LABEL_PUSH;
  
-  if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0)
+  {
+    if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0)
     err_exit(rv, "shm_sendto : pthread_mutex_lock");
 
-  if (sockt->queue == NULL) {
-    if (sockt->key == 0) {
-      sockt->key = hashtable_alloc_key(hashtable);
+    if (sockt->queue == NULL) {
+      if (sockt->key == 0) {
+        sockt->key = hashtable_alloc_key(hashtable);
+      }
+      sockt->queue = shm_socket_bind_queue( sockt->key, sockt->force_bind);
+      if(sockt->queue  == NULL ) {
+        logger->error("%s. key = %d", bus_strerror(EBUS_KEY_INUSED), sockt->key);
+        return EBUS_KEY_INUSED;
+      }
     }
-    sockt->queue = shm_socket_bind_queue( sockt->key, sockt->force_bind);
-    if(sockt->queue  == NULL ) {
-      logger->error("%s. key = %d", bus_strerror(EBUS_KEY_INUSED), sockt->key);
-      return EBUS_KEY_INUSED;
-    }
-  }
 
-  if ((rv = pthread_mutex_unlock(&(sockt->mutex))) != 0)
-    err_exit(rv, "shm_sendto : pthread_mutex_unlock");
+    if ((rv = pthread_mutex_unlock(&(sockt->mutex))) != 0)
+      err_exit(rv, "shm_sendto : pthread_mutex_unlock");
   
-  // There is some case where a sockt need to send to himeself, for example when bus server need to stop, he need to send himself 
-  // a top message.
+  }
   
+ 
+ LABEL_PUSH: 
   if (key == sockt->key) {
     logger->error( "can not send to your self!");
     return EBUS_SENDTO_SELF;
@@ -210,10 +214,14 @@
   
   hashtable_t *hashtable = mm_get_hashtable();
 
-  if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0)
-    err_exit(rv, "shm_recvfrom : pthread_mutex_lock");
+  if( sockt->queue != NULL) 
+    goto LABEL_POP;
+
+  {
+    if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0)
+      err_exit(rv, "shm_recvfrom : pthread_mutex_lock");
  
-  if (sockt->queue == NULL) {
+   
     if (sockt->key == 0) {
       sockt->key = hashtable_alloc_key(hashtable);
     }  
@@ -222,10 +230,14 @@
       logger->error("%s. key = %d", bus_strerror(EBUS_KEY_INUSED), sockt->key);
       return EBUS_KEY_INUSED;
     }
+    
+    
+    if ((rv = pthread_mutex_unlock(&(sockt->mutex))) != 0)
+      err_exit(rv, "shm_recvfrom : pthread_mutex_unlock");
+
   }
   
-  if ((rv = pthread_mutex_unlock(&(sockt->mutex))) != 0)
-    err_exit(rv, "shm_recvfrom : pthread_mutex_unlock");
+LABEL_POP:
 
   shm_packet_t src;
  

--
Gitblit v1.8.0