From 24678070d451711a03a69ca3a7aa6e695efeff28 Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期五, 12 三月 2021 19:05:12 +0800 Subject: [PATCH] upate --- src/socket/shm_socket.cpp | 49 ++++++++++++++++++++++++++++++------------------- 1 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp index f5e1388..4f5f4d9 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); @@ -46,13 +46,13 @@ if (tmp_ptr == NULL || tmp_ptr == (void *)1 ) { - queue = new LockFreeQueue<shm_packet_t>(16); + queue = new LockFreeQueue<shm_packet_t>(1024); hashtable_put(hashtable, key, (void *)queue); hashtable_unlock(hashtable); return queue; } else if(force) { hashtable_unlock(hashtable); - return (LockFreeQueue<shm_packet_t> *) queue; + return (LockFreeQueue<shm_packet_t> *) tmp_ptr; } hashtable_unlock(hashtable); @@ -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("%lu 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); @@ -318,7 +325,7 @@ const int send_size, const int key, void **recv_buf, int *recv_size, const struct timespec *timeout, int flags) { - int rv, tryn = 6; + int rv, tryn = 16; shm_packet_t sendpak; shm_packet_t recvpak; std::map<std::string, shm_packet_t>::iterator recvbufIter; @@ -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; } @@ -593,6 +600,10 @@ sendpak->key = sockt->key; rv = remoteQueue->push(*sendpak, timeout, flag); + + if(rv != 0) { + mm_free(sendpak->buf); + } if(rv == ETIMEDOUT) { return EBUS_TIMEOUT; } -- Gitblit v1.8.0