| | |
| | | shm_socket_t *client_socket; |
| | | shm_msg_t src; |
| | | |
| | | if (socket->acceptQueue->pop(src)) { |
| | | if (socket->acceptQueue->pop(src) == 0) { |
| | | |
| | | // print_msg("===accept:", src); |
| | | client_key = src.key; |
| | |
| | | msg.size = 0; |
| | | msg.type = SHM_SOCKET_OPEN_REPLY; |
| | | |
| | | if (client_socket->remoteQueue->push_timeout(msg, &timeout)) { |
| | | if (client_socket->remoteQueue->push_timeout(msg, &timeout) == 0) { |
| | | client_socket->status = SHM_CONN_ESTABLISHED; |
| | | return client_socket; |
| | | } else { |
| | |
| | | socket->remoteQueue->push_timeout(msg, &timeout); |
| | | |
| | | //接受open reply |
| | | if (socket->queue->pop(msg)) { |
| | | if (socket->queue->pop(msg) == 0) { |
| | | // 在这里server端已经准备好接受客户端发送请求了,完成与服务端的连接 |
| | | if (msg.type == SHM_SOCKET_OPEN_REPLY) { |
| | | socket->status = SHM_CONN_ESTABLISHED; |
| | |
| | | dest.buf = mm_malloc(size); |
| | | memcpy(dest.buf, buf, size); |
| | | |
| | | if (socket->remoteQueue->push(dest)) { |
| | | if (socket->remoteQueue->push(dest) == 0) { |
| | | return 0; |
| | | } else { |
| | | logger->error(errno, "connection has been closed!"); |
| | |
| | | } |
| | | shm_msg_t src; |
| | | |
| | | if (socket->messageQueue->pop(src)) { |
| | | if (socket->messageQueue->pop(src) == 0) { |
| | | void *_buf = malloc(src.size); |
| | | memcpy(_buf, src.buf, src.size); |
| | | *buf = _buf; |
| | |
| | | dest.buf = mm_malloc(size); |
| | | memcpy(dest.buf, buf, size); |
| | | |
| | | // printf("shm_sendto push before\n"); |
| | | |
| | | if(flags & SHM_MSG_NOWAIT != 0) { |
| | | rv = remoteQueue->push_nowait(dest); |
| | |
| | | rv = remoteQueue->push(dest); |
| | | } |
| | | |
| | | if (rv) { |
| | | if (rv == 0) { |
| | | // printf("shm_sendto push after\n"); |
| | | delete remoteQueue; |
| | | return 0; |
| | | } else { |
| | | delete remoteQueue; |
| | | mm_free(dest.buf); |
| | | if(errno == ETIMEDOUT) { |
| | | if(rv == EBUS_TIMEOUT) { |
| | | bus_errno = EBUS_TIMEOUT; |
| | | logger->error(errno, "sendto key %d failed, %s", key, bus_strerror(EBUS_TIMEOUT)); |
| | | return EBUS_TIMEOUT; |
| | | } else { |
| | | logger->error(errno, "sendto key %d failed!", key); |
| | | //logger->error(errno, "sendto key %d failed!", key); |
| | | return -1; |
| | | } |
| | | |
| | |
| | | err_exit(s, "shm_recvfrom : pthread_mutex_unlock"); |
| | | |
| | | shm_msg_t src; |
| | | // printf("shm_recvfrom pop before\n"); |
| | | |
| | | if(flags & SHM_MSG_NOWAIT != 0) { |
| | | rv = socket->queue->pop_nowait(src); |
| | |
| | | rv = socket->queue->pop(src); |
| | | } |
| | | |
| | | if (rv) { |
| | | if (rv == 0) { |
| | | if(buf != NULL) { |
| | | void *_buf = malloc(src.size); |
| | | memcpy(_buf, src.buf, src.size); |
| | |
| | | *key = src.key; |
| | | |
| | | mm_free(src.buf); |
| | | // printf("shm_recvfrom pop after\n"); |
| | | return 0; |
| | | } else { |
| | | return -1; |
| | |
| | | int shm_sendandrecv(shm_socket_t *socket, const void *send_buf, |
| | | const int send_size, const int send_key, void **recv_buf, |
| | | int *recv_size, struct timespec *timeout, int flags) { |
| | | return shm_sendandrecv_unsafe(socket, send_buf, send_size, send_key,recv_buf, recv_size, timeout, flags); |
| | | return _shm_sendandrecv_thread_local(socket, send_buf, send_size, send_key,recv_buf, recv_size, timeout, flags); |
| | | } |
| | | |
| | | |
| | |
| | | shm_socket_t *client_socket; |
| | | std::map<int, shm_socket_t *>::iterator iter; |
| | | |
| | | while (socket->queue->pop(src)) { |
| | | while (socket->queue->pop(src) == 0) { |
| | | |
| | | switch (src.type) { |
| | | case SHM_SOCKET_OPEN: |
| | |
| | | struct timespec timeout = {1, 0}; |
| | | shm_msg_t src; |
| | | |
| | | while (socket->queue->pop(src)) { |
| | | while (socket->queue->pop(src) == 0) { |
| | | switch (src.type) { |
| | | |
| | | case SHM_SOCKET_CLOSE: |