From 5f246a2c098b663fa44d87bc5c9ac5c8f74bbcc1 Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期五, 26 二月 2021 14:04:39 +0800 Subject: [PATCH] update --- src/socket/shm_socket.cpp | 108 ++++++++++++++++++++++++++--------------------------- 1 files changed, 53 insertions(+), 55 deletions(-) diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp index 7e33cc6..562682e 100644 --- a/src/socket/shm_socket.cpp +++ b/src/socket/shm_socket.cpp @@ -17,15 +17,15 @@ } 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); -static int shm_sendpakto(shm_socket_t *sockt, const shm_packet_t *sendpak, +static int shm_sendpakto(shm_socket_t *sockt, shm_packet_t *sendpak, const int key, const struct timespec *timeout, const int flag); @@ -52,7 +52,7 @@ return queue; } else if(force) { hashtable_unlock(hashtable); - return (LockFreeQueue<shm_packet_t> *) queue; + return (LockFreeQueue<shm_packet_t> *) tmp_ptr; } hashtable_unlock(hashtable); @@ -114,14 +114,11 @@ int rv; logger->debug("shm_socket_close\n"); + // hashtable_remove(hashtable, mkey); // if(sockt->queue != NULL) { - // delete sockt->queue; // sockt->queue = NULL; // } - // hashtable_remove(hashtable, mkey); - - if(sockt->key != 0) { auto it = shmQueueStMap->find(sockt->key); if(it != shmQueueStMap->end()) { @@ -139,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); } @@ -257,12 +259,8 @@ if (rv != 0) { - if(rv == ETIMEDOUT) - return EBUS_TIMEOUT; - else { - logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv)); - return rv; - } + logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv)); + return rv; } @@ -279,6 +277,9 @@ if(key != NULL) *key = recvpak.key; + if(recvpak.key == 0) { + err_exit(0, "key = %d, pid= %d, recvpak.key == 0", shm_socket_get_key(sockt), getpid()); + } mm_free(recvpak.buf); return 0; } @@ -287,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); @@ -303,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); @@ -402,36 +405,33 @@ int *recv_size, const struct timespec *timeout, int flags) { - int rv, tryn = 6; + int rv = 0, tryn = 16; shm_packet_t sendpak; 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; - /* If first call from this thread, allocate buffer for thread, and save its location */ - // logger->debug("%d create tmp socket\n", pthread_self() ); - 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); } } - sendpak.key = tmp_socket->key; sendpak.size = send_size; if(send_buf != NULL) { @@ -458,11 +458,6 @@ rv = shm_recvpakfrom(tmp_socket, &recvpak, timeout, flags); if (rv != 0) { - - if(rv == ETIMEDOUT) { - return EBUS_TIMEOUT; - } - logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(tmp_socket), bus_strerror(rv)); return rv; } @@ -514,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; } @@ -538,7 +533,7 @@ -static int shm_sendpakto(shm_socket_t *sockt, const shm_packet_t *sendpak, +static int shm_sendpakto(shm_socket_t *sockt, shm_packet_t *sendpak, const int key, const struct timespec *timeout, const int flag) { int rv; @@ -549,9 +544,9 @@ if( sockt->queue != NULL) goto LABEL_PUSH; - if(hashtable_get_queue_count(hashtable) > QUEUE_COUNT_LIMIT) { - return EBUS_EXCEED_LIMIT; - } + // if(hashtable_get_queue_count(hashtable) > QUEUE_COUNT_LIMIT) { + // return EBUS_EXCEED_LIMIT; + // } { if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0) @@ -564,6 +559,8 @@ 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); + if ((rv = pthread_mutex_unlock(&(sockt->mutex))) != 0) + err_exit(rv, "shm_sendto : pthread_mutex_unlock"); return EBUS_KEY_INUSED; } @@ -601,7 +598,11 @@ goto ERR_CLOSED; } + sendpak->key = sockt->key; rv = remoteQueue->push(*sendpak, timeout, flag); + if(rv == ETIMEDOUT) { + return EBUS_TIMEOUT; + } return rv; ERR_CLOSED: @@ -620,9 +621,9 @@ if( sockt->queue != NULL) goto LABEL_POP; - if(hashtable_get_queue_count(hashtable) > QUEUE_COUNT_LIMIT) { - return EBUS_EXCEED_LIMIT; - } + // if(hashtable_get_queue_count(hashtable) > QUEUE_COUNT_LIMIT) { + // return EBUS_EXCEED_LIMIT; + // } { if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0) @@ -635,6 +636,8 @@ 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); + if ((rv = pthread_mutex_unlock(&(sockt->mutex))) != 0) + err_exit(rv, "shm_recvfrom : pthread_mutex_unlock"); return EBUS_KEY_INUSED; } @@ -650,25 +653,20 @@ LABEL_POP: - // 妫�鏌ey鏍囪鐨勭姸鎬� - // auto shmQueueMapIter = shmQueueStMap->find(sockt->key); - // if(shmQueueMapIter != shmQueueStMap->end()) { - // stRecord = shmQueueMapIter->second; - // if(stRecord.status = SHM_QUEUE_ST_CLOSED) { - // // key瀵瑰簲鐨勭姸鎬佹槸鍏抽棴鐨� - // goto ERR_CLOSED; - // } - // } rv = sockt->queue->pop(recvpak, timeout, flag); - if(rv != 0) + if(rv != 0) { + if(rv == ETIMEDOUT) { + return EBUS_TIMEOUT; + } return rv; + } if(recvpak.action == BUS_ACTION_STOP) { return EBUS_STOPED; } *_recvpak = recvpak; - return rv; + return 0; } -- Gitblit v1.8.0