From b386f0c5d35994a54e95d5fe1c4bcbfd1cdea59c Mon Sep 17 00:00:00 2001 From: Fu Juntang <StrongTiger_001@163.com> Date: 星期五, 03 九月 2021 17:43:11 +0800 Subject: [PATCH] Supplementary for the fix of the lock removal. --- src/bh_api.cpp | 148 +++++++++++++++++++++++-------------------------- 1 files changed, 70 insertions(+), 78 deletions(-) diff --git a/src/bh_api.cpp b/src/bh_api.cpp index 5310992..e36daee 100644 --- a/src/bh_api.cpp +++ b/src/bh_api.cpp @@ -1400,7 +1400,7 @@ if (val > 0) { memset(&node, 0x00, sizeof(node)); - + len = strlen(buf_temp) + 1; #if defined(PRO_DE_SERIALIZE) len += strlen(_input1.data); @@ -1467,11 +1467,11 @@ rv = EBUS_TIMEOUT; } - free(topics_buf); - } else { rv = EBUS_RES_UNSUPPORT; } + + free(topics_buf); } memset(errString, 0x00, sizeof(errString)); @@ -1547,95 +1547,87 @@ return false; } + if (timeout_ms > 0) { + + sec = timeout_ms / 1000; + nsec = (timeout_ms - sec * 1000) * 1000 * 1000; + + rv = net_mod_socket_recvfrom_timeout(gNetmod_socket, &buf, &size, &key, sec, nsec); + + } else if (timeout_ms == 0) { + + rv = net_mod_socket_recvfrom_nowait(gNetmod_socket, &buf, &size, &key); + + } else { + + rv = net_mod_socket_recvfrom(gNetmod_socket, &buf, &size, &key); + } + if (rv == 0) { - if (timeout_ms > 0) { + struct _ReadRequestReply + { + std::string proc_id; + std::string topic; + std::string data; + void *src; + } rrr; - sec = timeout_ms / 1000; - nsec = (timeout_ms - sec * 1000) * 1000 * 1000; + sprintf(buf_temp, "%d", key); + rrr.proc_id = buf_temp; - rv = net_mod_socket_recvfrom_timeout(gNetmod_socket, &buf, &size, &key, sec, nsec); + *proc_id_len = rrr.proc_id.size(); + *proc_id = malloc(*proc_id_len); + memcpy(*proc_id, rrr.proc_id.data(), *proc_id_len); - } else if (timeout_ms == 0) { - - rv = net_mod_socket_recvfrom_nowait(gNetmod_socket, &buf, &size, &key); + topics_buf = (char *)malloc(size + MIN_STR_LEN); + if (topics_buf == NULL) { + + rv = EBUS_NO_MEM; + memset(errString, 0x00, sizeof(errString)); + strncpy(errString, bus_strerror(rv), sizeof(errString)); + + logger->error("in BHReadRequest: Out of memory!\n"); + + return false; + } + memset(topics_buf, 0x00, size + MIN_STR_LEN); - } else { - - rv = net_mod_socket_recvfrom(gNetmod_socket, &buf, &size, &key); + len = strlen((char *)buf); + if (len > size) { + len = size; + } + strncpy(topics_buf, (char *)buf, len); + rrr.topic = topics_buf; + + if (len < size) { + strncpy(topics_buf + len + 1, (char *)buf + len + 1, size - len - 1); } - if (rv == 0) { - struct _ReadRequestReply - { - std::string proc_id; - std::string topic; - std::string data; - void *src; - } rrr; - - sprintf(buf_temp, "%d", key); - rrr.proc_id = buf_temp; - - *proc_id_len = rrr.proc_id.size(); - *proc_id = malloc(*proc_id_len); - memcpy(*proc_id, rrr.proc_id.data(), *proc_id_len); - - topics_buf = (char *)malloc(size + MIN_STR_LEN); - if (topics_buf == NULL) { - - rv = EBUS_NO_MEM; - memset(errString, 0x00, sizeof(errString)); - strncpy(errString, bus_strerror(rv), sizeof(errString)); - - logger->error("in BHReadRequest: Out of memory!\n"); - - return false; - } - memset(topics_buf, 0x00, size + MIN_STR_LEN); - - len = strlen((char *)buf); - if (len > size) { - len = size; - } - strncpy(topics_buf, (char *)buf, len); - rrr.topic = topics_buf; - - if (len < size) { - strncpy(topics_buf + len + 1, (char *)buf + len + 1, size - len - 1); - } - - rrr.data = topics_buf + len + 1; - - free(topics_buf); + rrr.data = topics_buf + len + 1; + + free(topics_buf); #if defined(PRO_DE_SERIALIZE) - ::bhome_msg::MsgRequestTopic mrt; - mrt.set_topic(rrr.topic); - mrt.set_data(rrr.data.data()); - *request_len = mrt.ByteSizeLong(); - *request = malloc(*request_len); - mrt.SerializePartialToArray(*request,*request_len); + ::bhome_msg::MsgRequestTopic mrt; + mrt.set_topic(rrr.topic); + mrt.set_data(rrr.data.data()); + *request_len = mrt.ByteSizeLong(); + *request = malloc(*request_len); + mrt.SerializePartialToArray(*request,*request_len); #else - *request = buf; - *request_len = size; + *request = buf; + *request_len = size; #endif - free(buf); + free(buf); - buf = malloc(sizeof(int)); - *(int *)buf = key; - *src = buf; - } - - memset(errString, 0x00, sizeof(errString)); - strncpy(errString, bus_strerror(rv), sizeof(errString)); - - } else { - - rv = EBUS_RES_BUSY; - memset(errString, 0x00, sizeof(errString)); - strncpy(errString, bus_strerror(rv), sizeof(errString)); + buf = malloc(sizeof(int)); + *(int *)buf = key; + *src = buf; } + + memset(errString, 0x00, sizeof(errString)); + strncpy(errString, bus_strerror(rv), sizeof(errString)); if (rv == 0) return true; -- Gitblit v1.8.0