static void _dispatch_queue(struct harbor *h, struct skynet_context * context, struct msg_queue * queue, uint32_t handle, const char name[GLOBALNAME_LENGTH] ) { int harbor_id = handle >> HANDLE_REMOTE_SHIFT; assert(harbor_id != 0); int fd = h->remote_fd[harbor_id]; if (fd < 0) { char tmp [GLOBALNAME_LENGTH+1]; memcpy(tmp, name , GLOBALNAME_LENGTH); tmp[GLOBALNAME_LENGTH] = '\0'; skynet_error(context, "Drop message to %s (in harbor %d)",tmp,harbor_id); return; } struct msg * m = _pop_queue(queue); while (m) { struct remote_message_header * cookie = (struct remote_message_header *)(m->buffer + m->size - sizeof(*cookie)); cookie->destination |= (handle & HANDLE_MASK); _header_to_message(cookie, (uint32_t *)cookie); int err = _send_package(fd, m->buffer, m->size); if (err) { close(fd); h->remote_fd[harbor_id] = _connect_to(context, h->remote_addr[harbor_id]); if (h->remote_fd[harbor_id] < 0) { skynet_error(context, "Reconnect to harbor %d %s failed",harbor_id, h->remote_addr[harbor_id]); return; } } free(m->buffer); m = _pop_queue(queue); } }
static void _request_master(struct harbor *h, struct skynet_context * context, const char name[GLOBALNAME_LENGTH], size_t i, uint32_t handle) { char buffer[4+i]; handle = htonl(handle); memcpy(buffer, &handle, 4); memcpy(buffer+4,name,i); int err = _send_package(h->master_fd, buffer, 4+i); if (err) { close(h->master_fd); h->master_fd = _connect_to(context, h->master_addr); if (h->master_fd < 0) { skynet_error(context, "Reconnect to master server %s failed", h->master_addr); return; } _send_package(h->master_fd, buffer, 4+i); } }
static void _request_master(struct harbor *h, const char name[GLOBALNAME_LENGTH], size_t i, uint32_t handle) { //uint8_t buffer[4+i]; uint8_t buffer[100]; to_bigendian(buffer, handle); memcpy(buffer+4,name,i); _send_package(h->ctx, h->master_fd, buffer, 4+i); }
static void _dispatch_queue(struct harbor *h, struct msg_queue * queue, uint32_t handle, const char name[GLOBALNAME_LENGTH] ) { int harbor_id = handle >> HANDLE_REMOTE_SHIFT; assert(harbor_id != 0); struct skynet_context * context = h->ctx; int fd = h->remote_fd[harbor_id]; if (fd < 0) { char tmp [GLOBALNAME_LENGTH+1]; memcpy(tmp, name , GLOBALNAME_LENGTH); tmp[GLOBALNAME_LENGTH] = '\0'; skynet_error(context, "Drop message to %s (in harbor %d)",tmp,harbor_id); return; } struct msg * m = _pop_queue(queue); while (m) { struct remote_message_header cookie; uint8_t *ptr = m->buffer + m->size - sizeof(cookie); memcpy(&cookie, ptr, sizeof(cookie)); cookie.destination |= (handle & HANDLE_MASK); _header_to_message(&cookie, ptr); _send_package(context, fd, m->buffer, m->size); m = _pop_queue(queue); } }