From 14c345b38d57fd814f217eb8465963a08ca79f7e Mon Sep 17 00:00:00 2001 From: wangzhengquan <wangzhengquan85@126.com> Date: 星期五, 05 二月 2021 17:41:09 +0800 Subject: [PATCH] update --- src/socket/shm_socket.cpp | 81 ++++++++++++++++++++++++++++++++++------ 1 files changed, 69 insertions(+), 12 deletions(-) diff --git a/src/socket/shm_socket.cpp b/src/socket/shm_socket.cpp index 8fef2f7..14274ca 100644 --- a/src/socket/shm_socket.cpp +++ b/src/socket/shm_socket.cpp @@ -65,7 +65,7 @@ return queue; } - +//鍒犻櫎鍖呭惈鍦╧eys鍐呯殑queue size_t shm_socket_remove_keys(int keys[], size_t length) { hashtable_t *hashtable = mm_get_hashtable(); LockFreeQueue<shm_packet_t> *mqueue; @@ -79,6 +79,38 @@ } return count; } + + +// 鍒犻櫎涓嶅湪keys鍐呯殑queue +size_t shm_socket_remove_keys_exclude(int keys[], size_t length) { + hashtable_t *hashtable = mm_get_hashtable(); + std::set<int> *keyset = hashtable_keyset(hashtable); + std::set<int>::iterator keyItr; + LockFreeQueue<shm_packet_t> *mqueue; + bool found; + size_t count = 0; + for (keyItr = keyset->begin(); keyItr != keyset->end(); keyItr++) { + found = false; + for (size_t i = 0; i < length; i++) { + if (*keyItr == keys[i]) { + found = true; + break; + } + } + // 100鍐呯殑鏄痓us鍐呴儴鑷繁鐢ㄧ殑 + if (!found && *keyItr > 100) { + // 閿�姣佸叡浜唴瀛樼殑queue + mqueue = (LockFreeQueue<shm_packet_t> *)hashtable_get(hashtable, *keyItr); + delete mqueue; + hashtable_remove(hashtable, *keyItr); + count++; + } + } + delete keyset; + return count; +} + + shm_socket_t *shm_open_socket(shm_socket_type_t socket_type) { int s, type; @@ -112,23 +144,31 @@ int shm_close_socket(shm_socket_t *sockt) { - int s; - + int rv; logger->debug("shm_close_socket\n"); if(sockt->queue != NULL) { delete sockt->queue; sockt->queue = NULL; } - s = pthread_mutex_destroy(&(sockt->mutex) ); - if(s != 0) { - err_exit(s, "shm_close_socket"); + rv = pthread_mutex_destroy(&(sockt->mutex) ); + if(rv != 0) { + err_exit(rv, "shm_close_socket"); } free(sockt); return 0; } + +int shm_socket_stop(shm_socket_t *sockt) { + struct timespec timeout = {5, 0}; + shm_packet_t sendpak = {0}; + sendpak.key = sockt->key; + sendpak.action = BUS_ACTION_STOP; + sendpak.size = 0; + return shm_sendpakto(sockt, &sendpak, sockt->key, &timeout, BUS_TIMEOUT_FLAG); +} int shm_socket_bind(shm_socket_t *sockt, int key) { sockt->key = key; @@ -175,6 +215,7 @@ shm_packet_t sendpak; shm_packet_t recvpak; std::map<std::string, shm_packet_t>::iterator recvbufIter; + std::string uuid = sole::uuid4().str(); sendpak.key = sockt->key; @@ -484,11 +525,15 @@ if( sockt->queue != NULL) goto LABEL_PUSH; + + if(hashtable_get_queue_count(hashtable) > QUEUE_COUNT_LIMIT) { + return EBUS_EXCEED_LIMIT; + } { if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0) err_exit(rv, "shm_sendto : pthread_mutex_lock"); - + if (sockt->queue == NULL) { if (sockt->key == 0) { sockt->key = hashtable_alloc_key(hashtable); @@ -507,7 +552,7 @@ LABEL_PUSH: - if (key == sockt->key) { + if (sendpak->action != BUS_ACTION_STOP && key == sockt->key) { logger->error( "can not send to your self!"); return EBUS_SENDTO_SELF; } @@ -527,13 +572,18 @@ } // 鐭繛鎺ユ柟寮忔帴鍙� -static int shm_recvpakfrom(shm_socket_t *sockt, shm_packet_t *recvpak , const struct timespec *timeout, int flag) { +static int shm_recvpakfrom(shm_socket_t *sockt, shm_packet_t *_recvpak , const struct timespec *timeout, int flag) { int rv; hashtable_t *hashtable = mm_get_hashtable(); + shm_packet_t recvpak; if( sockt->queue != NULL) goto LABEL_POP; + + if(hashtable_get_queue_count(hashtable) > QUEUE_COUNT_LIMIT) { + return EBUS_EXCEED_LIMIT; + } { if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0) @@ -557,11 +607,18 @@ LABEL_POP: + // + // printf("%p start recv.....\n", sockt); - printf("%p start recv.....\n", sockt); - - rv = sockt->queue->pop(*recvpak, timeout, flag); + rv = sockt->queue->pop(recvpak, timeout, flag); + if(rv != 0) + return rv; + + if(recvpak.action == BUS_ACTION_STOP) { + return EBUS_STOPED; + } + *_recvpak = recvpak; return rv; } // int shm_sendandrecv(shm_socket_t *sockt, const void *send_buf, -- Gitblit v1.8.0