| | |
| | | |
| | | static int _shm_close_stream_socket(shm_socket_t *socket, bool notifyRemote); |
| | | |
| | | // 检查key是否已经被使用,是返回0, 否返回1 |
| | | 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 ) { |
| | | err_exit(0, "key %d has already been in used!", socket->key); |
| | | logger->error("key %d has already been in used!", socket->key); |
| | | return 0; |
| | | } |
| | | return 1; |
| | |
| | | socket->key = key; |
| | | } else { |
| | | |
| | | _shm_socket_check_key(socket); |
| | | if(!_shm_socket_check_key(socket)) { |
| | | return -1; |
| | | } |
| | | } |
| | | |
| | | socket->queue = new SHMQueue<shm_msg_t>(socket->key, 16); |
| | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @return 0成功. 其他值失败 |
| | | */ |
| | | int shm_connect(shm_socket_t *socket, int key) { |
| | | if (socket->socket_type != SHM_SOCKET_STREAM) { |
| | | logger->error( "can not invoke shm_connect method with a socket which is not " |
| | |
| | | hashtable_t *hashtable = mm_get_hashtable(); |
| | | if (hashtable_get(hashtable, key) == NULL) { |
| | | logger->error("shm_connect:connect at key %d failed!", key); |
| | | exit(1); |
| | | return -1; |
| | | } |
| | | |
| | | if (socket->key == -1) { |
| | | socket->key = hashtable_alloc_key(hashtable); |
| | | } else { |
| | | _shm_socket_check_key(socket); |
| | | if(!_shm_socket_check_key(socket)) { |
| | | return -1; |
| | | } |
| | | } |
| | | |
| | | socket->queue = new SHMQueue<shm_msg_t>(socket->key, 16); |
| | | |
| | | if ((socket->remoteQueue = _attach_remote_queue(key)) == NULL) { |
| | | logger->error("connect to %d failted", key); |
| | | exit(1); |
| | | return -1; |
| | | } |
| | | socket->messageQueue = new LockFreeQueue<shm_msg_t, DM_Allocator>(16); |
| | | |
| | |
| | | |
| | | } else { |
| | | logger->error( "connect failted!"); |
| | | exit(1); |
| | | return -1; |
| | | } |
| | | |
| | | return 0; |
| | |
| | | socket->key = hashtable_alloc_key(hashtable); |
| | | } else { |
| | | |
| | | _shm_socket_check_key(socket); |
| | | if(!_shm_socket_check_key(socket)) { |
| | | return -1; |
| | | } |
| | | |
| | | } |
| | | |
| | | socket->queue = new SHMQueue<shm_msg_t>(socket->key, 16); |
| | |
| | | socket->key = hashtable_alloc_key(hashtable); |
| | | } else { |
| | | |
| | | _shm_socket_check_key(socket); |
| | | if(!_shm_socket_check_key(socket)) { |
| | | return -1; |
| | | } |
| | | } |
| | | |
| | | socket->queue = new SHMQueue<shm_msg_t>(socket->key, 16); |