| | |
| | | static inline int _shm_socket_check_key(shm_socket_t *socket) { |
| | | void *tmp_ptr = mm_get_by_key(socket->key); |
| | | if (tmp_ptr!= NULL && tmp_ptr != (void *)1 && !socket->force_bind ) { |
| | | bus_errno = ESHM_BUS_KEY_INUSED; |
| | | logger->error("%s. key = %d ", bus_strerror(ESHM_BUS_KEY_INUSED), socket->key); |
| | | bus_errno = EBUS_KEY_INUSED; |
| | | logger->error("%s. key = %d ", bus_strerror(EBUS_KEY_INUSED), socket->key); |
| | | return 0; |
| | | } |
| | | return 1; |
| | |
| | | } else { |
| | | |
| | | if(!_shm_socket_check_key(socket)) { |
| | | bus_errno = ESHM_BUS_KEY_INUSED; |
| | | return ESHM_BUS_KEY_INUSED; |
| | | bus_errno = EBUS_KEY_INUSED; |
| | | return EBUS_KEY_INUSED; |
| | | } |
| | | } |
| | | |
| | |
| | | socket->key = hashtable_alloc_key(hashtable); |
| | | } else { |
| | | if(!_shm_socket_check_key(socket)) { |
| | | bus_errno = ESHM_BUS_KEY_INUSED; |
| | | return ESHM_BUS_KEY_INUSED; |
| | | bus_errno = EBUS_KEY_INUSED; |
| | | return EBUS_KEY_INUSED; |
| | | } |
| | | } |
| | | |
| | |
| | | } else { |
| | | |
| | | if(!_shm_socket_check_key(socket)) { |
| | | bus_errno = ESHM_BUS_KEY_INUSED; |
| | | return ESHM_BUS_KEY_INUSED; |
| | | bus_errno = EBUS_KEY_INUSED; |
| | | return EBUS_KEY_INUSED; |
| | | } |
| | | |
| | | } |
| | |
| | | if ((s = pthread_mutex_unlock(&(socket->mutex))) != 0) |
| | | err_exit(s, "shm_sendto : pthread_mutex_unlock"); |
| | | |
| | | if (key == socket->key) { |
| | | logger->error( "can not send to your self!"); |
| | | return -1; |
| | | } |
| | | // There is some case where a socket need to send to himeself, for example when bus server need to stop, he need to send himself |
| | | // a top message. |
| | | |
| | | // if (key == socket->key) { |
| | | // logger->error( "can not send to your self!"); |
| | | // return -1; |
| | | // } |
| | | |
| | | SHMQueue<shm_msg_t> *remoteQueue; |
| | | if ((remoteQueue = _attach_remote_queue(key)) == NULL) { |
| | |
| | | |
| | | if (rv == 0) { |
| | | // printf("shm_sendto push after\n"); |
| | | delete remoteQueue; |
| | | return 0; |
| | | } else { |
| | | delete remoteQueue; |
| | | mm_free(dest.buf); |
| | | if(rv > EBUS_BASE) { |
| | | // bus_errno = EBUS_TIMEOUT; |
| | |
| | | } else { |
| | | |
| | | if(!_shm_socket_check_key(socket)) { |
| | | bus_errno = ESHM_BUS_KEY_INUSED; |
| | | return ESHM_BUS_KEY_INUSED; |
| | | bus_errno = EBUS_KEY_INUSED; |
| | | return EBUS_KEY_INUSED; |
| | | } |
| | | } |
| | | |
| | |
| | | socket->queue = NULL; |
| | | } |
| | | |
| | | if (socket->remoteQueue != NULL) { |
| | | delete socket->remoteQueue; |
| | | socket->remoteQueue = NULL; |
| | | } |
| | | |
| | | |
| | | if (socket->messageQueue != NULL) { |
| | | delete socket->messageQueue; |
| | |
| | | client_socket = iter->second; |
| | | |
| | | client_socket->remoteQueue->push_timeout(close_msg, &timeout); |
| | | delete client_socket->remoteQueue; |
| | | client_socket->remoteQueue = NULL; |
| | | |
| | | delete client_socket->messageQueue; |