| | |
| | | |
| | | static char *_bus_errlist[_bus_nerr] = { |
| | | "\0", |
| | | "Timeout", |
| | | "Timed out", |
| | | "The other end is not inline", |
| | | "Key already in use", |
| | | "Network fault", |
| | |
| | | int net_mod_socket_sendto_timeout(void *_socket, const void *buf, const int size, const int key, int sec, int nsec){ |
| | | NetModSocket *sockt = (NetModSocket *)_socket; |
| | | logger->debug("net_mod_socket_sendto: %d sendto %d", net_mod_socket_get_key(_socket), key); |
| | | // return sockt->sendto_timeout(buf, size, key, sec, nsec); |
| | | return sockt->sendto(buf, size, key); |
| | | return sockt->sendto_timeout(buf, size, key, sec, nsec); |
| | | // return sockt->sendto(buf, size, key); |
| | | } |
| | | // 发送信息立刻返回。 |
| | | int net_mod_socket_sendto_nowait(void *_socket, const void *buf, const int size, const int key){ |
| | |
| | | // 接受信息超时返回。 @sec 秒 , @nsec 纳秒 |
| | | int net_mod_socket_recvfrom_timeout(void *_socket, void **buf, int *size, int *key, int sec, int nsec){ |
| | | NetModSocket *sockt = (NetModSocket *)_socket; |
| | | return sockt->recvfrom(buf, size, key); |
| | | //return sockt->recvfrom_timeout(buf, size, key, sec, nsec); |
| | | // return sockt->recvfrom(buf, size, key); |
| | | return sockt->recvfrom_timeout(buf, size, key, sec, nsec); |
| | | } |
| | | int net_mod_socket_recvfrom_nowait(void *_socket, void **buf, int *size, int *key){ |
| | | NetModSocket *sockt = (NetModSocket *)_socket; |
| | |
| | | int net_mod_socket_sendandrecv_timeout(void *_socket, net_node_t *node_arr, int arrlen, void *send_buf, int send_size, |
| | | net_mod_recv_msg_t ** recv_arr, int *recv_arr_size, int timeout){ |
| | | NetModSocket *sockt = (NetModSocket *)_socket; |
| | | return sockt->sendandrecv(node_arr, arrlen, send_buf, send_size, recv_arr, recv_arr_size); |
| | | // return sockt->sendandrecv_timeout(node_arr, arrlen, send_buf, send_size, recv_arr, recv_arr_size, timeout); |
| | | // return sockt->sendandrecv(node_arr, arrlen, send_buf, send_size, recv_arr, recv_arr_size); |
| | | return sockt->sendandrecv_timeout(node_arr, arrlen, send_buf, send_size, recv_arr, recv_arr_size, timeout); |
| | | } |
| | | |
| | | int net_mod_socket_sendandrecv_nowait(void *_socket, net_node_t *node_arr, int arrlen, void *send_buf, int send_size, |
| | |
| | | |
| | | |
| | | |
| | | static int _shm_close_dgram_socket(shm_socket_t *socket); |
| | | |
| | | |
| | | static void _destrory_socket_perthread(void *tmp_socket); |
| | |
| | | LockFreeQueue<shm_msg_t> *queue; |
| | | hashtable_lock(hashtable); |
| | | void *tmp_ptr = hashtable_get(hashtable, key); |
| | | if (tmp_ptr == NULL || tmp_ptr == (void *)1 || force ) { |
| | | |
| | | |
| | | if (tmp_ptr == NULL || tmp_ptr == (void *)1 ) { |
| | | queue = new LockFreeQueue<shm_msg_t>(16); |
| | | hashtable_put(hashtable, key, (void *)queue); |
| | | hashtable_unlock(hashtable); |
| | | return queue; |
| | | } else if(force) { |
| | | hashtable_unlock(hashtable); |
| | | return (LockFreeQueue<shm_msg_t> *) queue; |
| | | } |
| | | |
| | | hashtable_unlock(hashtable); |
| | |
| | | socket->socket_type = socket_type; |
| | | socket->key = 0; |
| | | socket->force_bind = false; |
| | | // socket->dispatch_thread = 0; |
| | | socket->queue = NULL; |
| | | |
| | | |
| | | s = pthread_mutexattr_init(&mtxAttr); |
| | |
| | | int s; |
| | | |
| | | logger->debug("shm_close_socket\n"); |
| | | _shm_close_dgram_socket(socket); |
| | | if(socket->queue != NULL) { |
| | | delete socket->queue; |
| | | socket->queue = NULL; |
| | | } |
| | | |
| | | s = pthread_mutex_destroy(&(socket->mutex) ); |
| | | if(s != 0) { |
| | |
| | | } |
| | | 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); |
| | | return EBUS_KEY_INUSED; |
| | | } |
| | | } |
| | |
| | | return 0; |
| | | } else { |
| | | mm_free(dest.buf); |
| | | if(rv == ETIMEDOUT) |
| | | return EBUS_TIMEOUT; |
| | | else { |
| | | logger->debug("====%d sendto key %d failed %s", shm_socket_get_key(sockt), key, bus_strerror(rv)); |
| | | return rv; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | sokt->queue = shm_socket_bind_queue( sokt->key, sokt->force_bind); |
| | | if(sokt->queue == NULL ) { |
| | | logger->error("%s. key = %d", bus_strerror(EBUS_KEY_INUSED), sokt->key); |
| | | return EBUS_KEY_INUSED; |
| | | } |
| | | } |
| | |
| | | mm_free(src.buf); |
| | | return 0; |
| | | } else { |
| | | logger->debug("shm_recvfrom failed %s", bus_strerror(rv)); |
| | | if(rv == ETIMEDOUT) |
| | | return EBUS_TIMEOUT; |
| | | else { |
| | | logger->debug("%d shm_recvfrom failed %s", shm_socket_get_key(sockt), bus_strerror(rv)); |
| | | return rv; |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | |
| | | |
| | | // ============================================================================================================ |
| | | |
| | | |
| | | |
| | | int _shm_close_dgram_socket(shm_socket_t *socket){ |
| | | if(socket->queue != NULL) { |
| | | delete socket->queue; |
| | | socket->queue = NULL; |
| | | } |
| | | |
| | | return 0; |
| | | } |
| | | |
| | | |
| | | |