From e782ad440171cc5e68c987352e3470b1a4234683 Mon Sep 17 00:00:00 2001
From: wangzhengquan <wangzhengquan85@126.com>
Date: 星期四, 04 二月 2021 18:41:52 +0800
Subject: [PATCH] update
---
src/socket/shm_socket.cpp | 83 ++++++++++++++++++++++-------------------
1 files changed, 44 insertions(+), 39 deletions(-)
diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp
index fbb849d..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,
+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, user_data);
-
- 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