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