From c479ef57baaaa28964fc3ec8d80ff99dffa7d49f Mon Sep 17 00:00:00 2001 From: fujuntang <fujuntang@smartai.com> Date: 星期三, 10 十一月 2021 09:49:29 +0800 Subject: [PATCH] Fix the system hang issue when the app is killed contantly. --- src/socket/shm_socket.cpp | 37 ++++++++++++++++++------------------- 1 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp index 709505f..ae9a98b 100644 --- a/src/socket/shm_socket.cpp +++ b/src/socket/shm_socket.cpp @@ -2,10 +2,12 @@ #include "socket_def.h" #include "hashtable.h" #include "logger_factory.h" +#include "net_mod_socket_wrapper.h" #include <map> #include <cassert> #include "bus_error.h" #include "sole.h" +#include "bh_api.h" #include "shm_mm.h" #include "key_def.h" @@ -105,9 +107,6 @@ static int _shm_socket_close_(shm_socket_t *sockt) { - - int rv, i; - hashtable_t *hashtable = mm_get_hashtable(); // if(sockt->key != 0) { // auto it = shmQueueStMap->find(sockt->key); @@ -117,18 +116,6 @@ // } // } - if(sockt->queue != NULL) { - sockt->queue->close(); - for( i = 0; i < sockt->queue->size(); i++) { - mm_free((*(sockt->queue))[i].buf); - logger->info("======= %d free queue element buf\n", sockt->key); - } - sleep(1); - - hashtable_remove(hashtable, sockt->key); - // sockt->queue = NULL; - } - pthread_mutex_destroy(&(sockt->mutex) ); free(sockt); return 0; @@ -404,13 +391,16 @@ const int send_size, const int key, void **recv_buf, int *recv_size, const struct timespec *timeout, int flags) { - + int data; + int timeout_ms; + char data_buf[MAX_STR_LEN] = { 0x00 }; int rv = 0, tryn = 16; shm_packet_t sendpak; shm_packet_t recvpak; std::map<int, shm_packet_t>::iterator recvbufIter; shm_socket_t *tmp_socket = NULL; - + hashtable_t *hashtable = mm_get_hashtable(); + rv = pthread_once(&_once_, _create_threadlocal_socket_key_); if (rv != 0) { logger->error(rv, "shm_sendandrecv pthread_once"); @@ -421,7 +411,15 @@ if (tmp_socket == NULL) { tmp_socket = shm_socket_open(SHM_SOCKET_DGRAM); - + + tmp_socket->key = hashtable_alloc_key(hashtable); + data = inter_key_get(); + timeout_ms = timeout->tv_sec * 1000 + 3000; + sprintf(data_buf, "%d, %d", data, tmp_socket->key); + if (socket_data_get() != NULL) { + net_mod_socket_reg(socket_data_get(), data_buf, strlen(data_buf), NULL, 0, timeout_ms, PROC_REG_BUF); + } + rv = pthread_setspecific(_localthread_socket_key_, tmp_socket); if ( rv != 0) { logger->error(rv, "shm_sendandrecv : pthread_setspecific"); @@ -564,6 +562,7 @@ 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); @@ -729,7 +728,7 @@ count += strlen(ptr->int_info) + 1; memcpy(dst + count, ptr->svr_info, strlen(ptr->svr_info) + 1); count += strlen(ptr->svr_info) + 1; - + *counter = count; } -- Gitblit v1.8.0