From 803d392aeb11665a3e34f7be83f972a1fc7d39c0 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 04 二月 2021 15:47:39 +0800
Subject: [PATCH] update

---
 src/socket/shm_socket.cpp |   85 ++++++++++++++++++++++--------------------
 1 files changed, 45 insertions(+), 40 deletions(-)

diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp
index bee4622..8fef2f7 100644
--- a/src/socket/shm_socket.cpp
+++ b/src/socket/shm_socket.cpp
@@ -153,11 +153,14 @@
 
   int rv;
  
-  shm_packet_t sendpak;
+  shm_packet_t sendpak = {0};
   sendpak.key = sockt->key;
   sendpak.size = size;
-  sendpak.buf = mm_malloc(size);
-  memcpy(sendpak.buf, buf, size);
+  if(buf != NULL) {
+    sendpak.buf = mm_malloc(size);
+    memcpy(sendpak.buf, buf, size);
+  }
+ 
   rv = shm_sendpakto(sockt, &sendpak, key, timeout, flag);
   return rv;
 }
@@ -176,8 +179,10 @@
   
   sendpak.key = sockt->key;
   sendpak.size = send_size;
-  sendpak.buf = mm_malloc(send_size);
-  memcpy(sendpak.buf, send_buf, send_size);
+  if(send_buf != NULL) {
+    sendpak.buf = mm_malloc(send_size);
+    memcpy(sendpak.buf, send_buf, send_size);
+  }
   memcpy(sendpak.uuid, uuid.c_str(), uuid.length() + 1);
   // uuid.copy(sendpak.uuid, sizeof sendpak.uuid);
   rv = shm_sendpakto(sockt, &sendpak, key, timeout, flags);
@@ -186,7 +191,7 @@
     return rv;
   }
 
-  while(true) {
+  while(tryn > 0) {
     tryn--;
     recvbufIter = sockt->recvbuf.find(uuid);
     if(recvbufIter != sockt->recvbuf.end()) {
@@ -194,36 +199,37 @@
 logger->debug("get from recvbuf: %s", uuid.c_str());
       recvpak = recvbufIter->second;
       sockt->recvbuf.erase(recvbufIter);
-      break;
+      goto LABLE_SUC;
     }
 
     rv = shm_recvpakfrom(sockt, &recvpak, timeout, flags);
 
     if (rv != 0) {
 
-      if(rv == ETIMEDOUT)
+      if(rv == ETIMEDOUT) {
         return EBUS_TIMEOUT;
+      }
 
       logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv));
       return rv;
     } 
 
 logger->debug("send uuid:%s, recv uuid: %s", uuid.c_str(), recvpak.uuid);
-    if (strncmp(uuid.c_str(), recvpak.uuid, sizeof recvpak.uuid) == 0) {
+    if(strlen(recvpak.uuid) == 0) {
+      continue;
+    } else if (strncmp(uuid.c_str(), recvpak.uuid, sizeof recvpak.uuid) == 0) {
       // 鍙戦�佷笌鎺ュ彈鐨刄UID鍖归厤鎴愬姛
-      break;
+      goto LABLE_SUC;
     } else {
       // 绛旈潪鎵�闂紝鏀惧埌缂撳瓨閲�
       sockt->recvbuf.insert({recvpak.uuid, recvpak});
       continue;
     }
-
-    if(tryn == 0) {
-      // 灏濊瘯浜唗ryn娆¢兘娌℃湁鎴愬姛
-      return EBUS_RECVFROM_WRONG_END;
-    }
-
   }
+
+LABLE_FAIL:
+  return EBUS_RECVFROM_WRONG_END;
+  // return rv;
  
 LABLE_SUC:
  if(recv_buf != NULL) {
@@ -239,57 +245,55 @@
 
   return 0;
 
+
+
 }
 
 /**
- * @callback  void (*recv_callback_fn)(void **sendbuf, int *sendsize) 
+ * @callback  void (*recvandsend_callback_fn)(void *recvbuf, int recvsize, int key, void **sendbuf, int *sendsize) 
  *            sendbuf 鍜� sendsize鏄痗allbak_fn鍥炶皟鍑芥暟鐨勮繑鍥炲��, 鍒嗗埆琛ㄧず鍙戦�佹暟鎹紝鍜屽彂閫佹暟鎹殑澶у皬銆�
  * 
  */
-int shm_recvandsend(shm_socket_t *sockt, void **recvbuf, int *recvsize, int *key, recv_callback_fn callback, 
-  const struct timespec *timeout, int flag) {
+int shm_recvandsend(shm_socket_t *sockt,  recvandsend_callback_fn callback, 
+  const struct timespec *timeout, int flag, void *user_data) {
   
   int rv;
  
-  void *sendbuf = NULL;
+  void *sendbuf, *recvbuf = NULL;
   int sendsize = 0;
-  shm_packet_t recvpak;
+  shm_packet_t recvpak = {0};
 
   rv = shm_recvpakfrom(sockt , &recvpak, timeout, flag);
 
- 
-
   if (rv != 0) {
-    if(rv == ETIMEDOUT)
+    if(rv == ETIMEDOUT){
+      logger->debug("%d shm_recvandsend failed %s", shm_socket_get_key(sockt), bus_strerror(EBUS_TIMEOUT));
       return EBUS_TIMEOUT;
+    }
     
-    logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv));
+    logger->error("%d shm_recvandsend failed %s", shm_socket_get_key(sockt), bus_strerror(rv));
     return rv;
   }
    
-  if(recvbuf != NULL) {
-    void *_buf = malloc(recvpak.size);
-    memcpy(_buf, recvpak.buf, recvpak.size);
-    *recvbuf = _buf; 
+  if(recvpak.buf != NULL) {
+    recvbuf = malloc(recvpak.size);
+    memcpy(recvbuf, recvpak.buf, recvpak.size);
+    mm_free(recvpak.buf);
   }
  
-  if(recvsize != NULL)
-    *recvsize = recvpak.size;
+  callback(recvbuf, recvpak.size, recvpak.key, &sendbuf, &sendsize, user_data);
 
-  if(key != NULL)
-    *key = recvpak.key;
-
-  mm_free(recvpak.buf);
-
-  callback(&sendbuf, &sendsize);
-
-  shm_packet_t sendpak;
+  shm_packet_t sendpak = {0};
   sendpak.key = sockt->key;
   sendpak.size = sendsize;
   memcpy(sendpak.uuid, recvpak.uuid, sizeof sendpak.uuid);
   if(sendbuf !=NULL && sendsize > 0) {
     sendpak.buf = mm_malloc(sendsize);
     memcpy(sendpak.buf, sendbuf, sendsize);
+  } else {
+
+    logger->warn("%d shm_recvandsend : sendbuf is null", shm_socket_get_key(sockt));
+    // return -1;
   }
  
   rv = shm_sendpakto(sockt, &sendpak, recvpak.key, timeout, flag);
@@ -317,7 +321,7 @@
   } 
 
 
- if(buf != NULL) {
+ if(buf != NULL && recvpak.buf != NULL) {
     void *_buf = malloc(recvpak.size);
     memcpy(_buf, recvpak.buf, recvpak.size);
     *buf = _buf; 
@@ -554,6 +558,7 @@
 LABEL_POP:
 
  
+  printf("%p start recv.....\n", sockt);
  
   rv = sockt->queue->pop(*recvpak, timeout, flag);
 

--
Gitblit v1.8.0