| | |
| | | #include "shm_socket.h" |
| | | #include "socket_def.h" |
| | | #include "hashtable.h" |
| | | #include "logger_factory.h" |
| | | #include <map> |
| | |
| | | |
| | | int rv, i; |
| | | hashtable_t *hashtable = mm_get_hashtable(); |
| | | logger->debug("shm_socket_close\n"); |
| | | |
| | | |
| | | // if(sockt->key != 0) { |
| | | // auto it = shmQueueStMap->find(sockt->key); |
| | |
| | | // it->second.closeTime = time(NULL); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | |
| | | if(sockt->queue != NULL) { |
| | | sockt->queue->close(); |
| | |
| | | return 0; |
| | | } |
| | | |
| | | int shm_socket_bind_proc_id(shm_socket_t *sockt, const char *buf, int len) { |
| | | strncpy(sockt->proc_id, buf, len > MAX_STR_LEN ? MAX_STR_LEN : len); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | int shm_socket_get_key(shm_socket_t *sockt){ |
| | | return sockt->key; |
| | | } |
| | | |
| | | int shm_socket_get_procid(shm_socket_t *sockt, char *buf, int len) { |
| | | strncpy(buf, sockt->proc_id, len); |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | // 短连接方式发送 |
| | |
| | | { |
| | | int rv; |
| | | |
| | | logger->debug("%lu destroy threadlocal socket\n", pthread_self()); |
| | | |
| | | if(tmp_socket == NULL) |
| | | return; |
| | | |
| | |
| | | |
| | | |
| | | int rv = 0, tryn = 16; |
| | | static int Counter_suc = 0; |
| | | static int Counter_fail = 0; |
| | | shm_packet_t sendpak; |
| | | shm_packet_t recvpak; |
| | | std::map<int, shm_packet_t>::iterator recvbufIter; |
| | |
| | | { |
| | | /* If first call from this thread, allocate buffer for thread, and save its location */ |
| | | tmp_socket = shm_socket_open(SHM_SOCKET_DGRAM); |
| | | |
| | | rv = pthread_setspecific(_localthread_socket_key_, tmp_socket); |
| | | if ( rv != 0) { |
| | | logger->error(rv, "shm_sendandrecv : pthread_setspecific"); |
| | | exit(1); |
| | | } |
| | | |
| | | } |
| | | |
| | | 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; |
| | |
| | | } else { |
| | | // 答非所问,放到缓存里 |
| | | tmp_socket->recvbuf2.insert({recvpak.key, recvpak}); |
| | | exit(0); |
| | | continue; |
| | | } |
| | | } |
| | |
| | | return EBUS_RECVFROM_WRONG_END; |
| | | |
| | | LABLE_SUC: |
| | | sockt->key = tmp_socket->key; |
| | | if(recv_buf != NULL) { |
| | | void *_buf = malloc(recvpak.size); |
| | | memcpy(_buf, recvpak.buf, recvpak.size); |
| | |
| | | |
| | | // 超时导致接发送对象,与返回对象不对应的情况 |
| | | if(send_key != recv_key) { |
| | | // logger->debug("======%d use tmp_socket %d, send to %d, receive from %d\n", shm_socket_get_key(sockt), shm_socket_get_key(tmp_socket), send_key, recv_key); |
| | | // logger->error( "_shm_sendandrecv_alloc_new: send key expect to equal to recv key! send key =%d , recv key=%d", send_key, recv_key); |
| | | |
| | | logger->error( "_shm_sendandrecv_alloc_new: send key expect to equal to recv key! send key =%d , recv key=%d", send_key, recv_key); |
| | | |
| | | continue; |
| | | } |
| | |
| | | if ((rv = pthread_mutex_lock(&(sockt->mutex))) != 0) |
| | | err_exit(rv, "shm_recvfrom : pthread_mutex_lock"); |
| | | |
| | | |
| | | if (sockt->key == 0) { |
| | | sockt->key = hashtable_alloc_key(hashtable); |
| | | } |
| | |
| | | |
| | | LABEL_POP: |
| | | |
| | | |
| | | rv = sockt->queue->pop(recvpak, timeout, flag); |
| | | if(rv != 0) { |
| | | if(rv == ETIMEDOUT) { |
| | |
| | | *_recvpak = recvpak; |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | void proc_copy(char *dst, void *src, int *counter) { |
| | | int count = 0; |
| | | ProcInfo *ptr = static_cast<ProcInfo *>(src); |
| | | |
| | | memcpy(dst, ptr->proc_id, strlen(ptr->proc_id) + 1); |
| | | count = strlen(ptr->proc_id) + 1; |
| | | memcpy(dst + count, ptr->name, strlen(ptr->name) + 1); |
| | | count += strlen(ptr->name) + 1; |
| | | memcpy(dst + count, ptr->public_info, strlen(ptr->public_info) + 1); |
| | | count += strlen(ptr->public_info) + 1; |
| | | memcpy(dst + count, ptr->private_info, strlen(ptr->private_info) + 1); |
| | | count += strlen(ptr->private_info) + 1; |
| | | |
| | | *counter = count; |
| | | } |
| | | |
| | | |
| | | |
| | | |