From fcdbbd495c15b0b12e03f50a5c5fa1a6c30a737b Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期三, 24 二月 2021 14:42:55 +0800 Subject: [PATCH] update --- src/socket/shm_socket.cpp | 39 +++++++++++++++++++++++---------------- 1 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp index f5e1388..38bbd8f 100644 --- a/src/socket/shm_socket.cpp +++ b/src/socket/shm_socket.cpp @@ -17,10 +17,10 @@ } static pthread_once_t _once_ = PTHREAD_ONCE_INIT; -static pthread_key_t _perthread_socket_key_; +static pthread_key_t _localthread_socket_key_; -static void _destrory_socket_perthread(void *tmp_socket); -static void _create_socket_key_perthread(void); +static void _destrory_threadlocal_socket_(void *tmp_socket); +static void _create_threadlocal_socket_key_(void); static int shm_recvpakfrom(shm_socket_t *sockt, shm_packet_t *recvpak , const struct timespec *timeout, int flag); @@ -136,6 +136,11 @@ int shm_socket_close(shm_socket_t *sockt) { + + shm_socket_t * threadlocal_socket = (shm_socket_t *)pthread_getspecific(_localthread_socket_key_); + if(threadlocal_socket != NULL) { + _destrory_threadlocal_socket_(threadlocal_socket); + } return _shm_socket_close_(sockt); } @@ -283,15 +288,17 @@ // ================================================================================================= /* Free thread-specific data buffer */ -static void _destrory_socket_perthread(void *tmp_socket) +static void _destrory_threadlocal_socket_(void *tmp_socket) { int rv; + + logger->debug("%d destroy threadlocal socket\n", pthread_self()); + if(tmp_socket == NULL) return; - - logger->debug("%d destroy tmp socket\n", pthread_self()); + _shm_socket_close_((shm_socket_t *)tmp_socket); - rv = pthread_setspecific(_perthread_socket_key_, NULL); + rv = pthread_setspecific(_localthread_socket_key_, NULL); if ( rv != 0) { logger->error(rv, "shm_sendandrecv : pthread_setspecific"); exit(1); @@ -299,14 +306,14 @@ } /* One-time key creation function */ -static void _create_socket_key_perthread(void) +static void _create_threadlocal_socket_key_(void) { int s; /* Allocate a unique thread-specific data key and save the address of the destructor for thread-specific data buffers */ - s = pthread_key_create(&_perthread_socket_key_, _destrory_socket_perthread); - //s = pthread_key_create(&_perthread_socket_key_, NULL); + s = pthread_key_create(&_localthread_socket_key_, _destrory_threadlocal_socket_); + //s = pthread_key_create(&_localthread_socket_key_, NULL); if (s != 0) { logger->error(s, "pthread_key_create"); exit(1); @@ -403,22 +410,22 @@ shm_packet_t recvpak; std::map<int, shm_packet_t>::iterator recvbufIter; // 鐢╰hread local 淇濊瘉姣忎釜绾跨▼鐢ㄤ竴涓嫭鍗犵殑socket鎺ュ彈瀵规柟杩斿洖鐨勪俊鎭� - shm_socket_t *tmp_socket; + shm_socket_t *tmp_socket = NULL; - rv = pthread_once(&_once_, _create_socket_key_perthread); + rv = pthread_once(&_once_, _create_threadlocal_socket_key_); if (rv != 0) { logger->error(rv, "shm_sendandrecv pthread_once"); exit(1); } - tmp_socket = (shm_socket_t *)pthread_getspecific(_perthread_socket_key_); + tmp_socket = (shm_socket_t *)pthread_getspecific(_localthread_socket_key_); if (tmp_socket == NULL) { /* If first call from this thread, allocate buffer for thread, and save its location */ - logger->debug("%ld create tmp socket\n", (long)pthread_self() ); + logger->debug("%lu create threadlocal socket\n", (long)pthread_self() ); tmp_socket = shm_socket_open(SHM_SOCKET_DGRAM); - rv = pthread_setspecific(_perthread_socket_key_, tmp_socket); + rv = pthread_setspecific(_localthread_socket_key_, tmp_socket); if ( rv != 0) { logger->error(rv, "shm_sendandrecv : pthread_setspecific"); exit(1); @@ -502,7 +509,7 @@ tryn++; rv = shm_recvfrom(tmp_socket, recv_buf, recv_size, &recv_key, timeout, flags); if(rv != 0) { - logger->error("_shm_sendandrecv_thread_local : %s\n", bus_strerror(rv)); + logger->error("_shm_sendandrecv_alloc_new : %s\n", bus_strerror(rv)); return rv; } -- Gitblit v1.8.0