void loop_quit(loop_t* loop) { if (NULL == loop) { return; } loop_run_inloop(loop, do_loop_quit, loop); return; }
void tcp_server_stop(tcp_server_t *server) { if (NULL == server) { return; } loop_run_inloop(server->loop, do_tcp_server_stop, server); return; }
void udp_peer_destroy(udp_peer_t* peer) { if (NULL == peer) { return; } loop_run_inloop(peer->loop, do_udp_peer_destroy, peer); return; }
void tcp_connection_destroy(tcp_connection_t* connection) { if (NULL == connection) { return; } loop_run_inloop(connection->loop, do_tcp_connection_destroy, connection); return; }
int loop_update_channel(loop_t *loop, channel_t* channel) { if (NULL == loop || NULL == channel) { log_error("loop_update_channel: bad loop(%p) or bad channel(%p)", loop, channel); return -1; } loop_run_inloop(loop, do_loop_update_channel, channel); return 0; }
void tcp_connection_attach(tcp_connection_t *connection, loop_t *loop) { if (NULL == connection || NULL == loop) { log_error("tcp_connection_attach: bad connection(%p) or bad loop(%p)", connection, loop); return; } log_debug("tcp_connection_attach: fd(%d)", connection->fd); connection->loop = loop; loop_run_inloop(loop, do_connection_attach, connection); return; }
int tcp_server_start(tcp_server_t *server) { if (NULL == server) { log_error("tcp_server_start: bad server"); return -1; } if (server->is_started) { return 0; } server->is_started = 1; loop_run_inloop(server->loop, do_tcp_server_start, server); return 0; }
udp_peer_t* udp_peer_new(loop_t *loop, const char *ip, unsigned short port, on_message_f messagecb, on_writable_f writecb, void *userdata) { SOCKET fd; udp_peer_t* peer; if (NULL == loop || NULL == ip || 0 == port || NULL == messagecb) { log_error("udp_peer_new: bad loop(%p) or bad ip(%p) or bad port(%p) or bad messagecb(%p)", loop, ip, port, messagecb); return NULL; } fd = create_udp_socket(port, ip); if (INVALID_SOCKET == fd) { log_error("udp_peer_new: create_udp_socket() failed, local addr: %s:%u, errno: %d", ip, port, WSAGetLastError()); return NULL; } peer = (udp_peer_t*)malloc(sizeof(udp_peer_t)); memset(peer, 0, sizeof(*peer)); peer->ref_count = 1; peer->loop = loop; strncpy(peer->ip, ip, 16); peer->port = port; peer->messagecb = messagecb; peer->message_userdata = userdata; peer->writecb = writecb; peer->write_userdata = userdata; peer->fd = fd; peer->channel = channel_new(fd, peer->loop, udp_peer_onevent, peer); loop_run_inloop(peer->loop, init_udp_peer_event, peer); return peer; }
on_writable_f udp_peer_onwrite(udp_peer_t* peer, on_writable_f writecb, void *userdata) { on_writable_f old_writecb; struct udp_peer_notify *notify; if (NULL == peer) { log_error("udp_peer_onwrite: bad peer"); return NULL; } old_writecb = peer->writecb; notify = (struct udp_peer_notify *)malloc(sizeof(*notify)); memset(notify, 0, sizeof(*notify)); (void)atomic_inc(&peer->ref_count); notify->peer = peer; notify->writecb = writecb; notify->write_userdata = userdata; loop_run_inloop(peer->loop, do_udp_peer_onwrite, notify); return old_writecb; }