int route_to_user(struct hub_info* hub, struct hub_user* user, struct adc_message* msg) { #ifdef DEBUG_SENDQ char* data = strndup(msg->cache, msg->length-1); LOG_PROTO("send %s: \"%s\"", sid_to_string(user->id.sid), data); free(data); #endif if (!user->connection) return 0; uhub_assert(msg->cache && *msg->cache); if (ioq_send_is_empty(user->send_queue) && !user_flag_get(user, flag_pipeline)) { /* Perform oportunistic write */ ioq_send_add(user->send_queue, msg); handle_net_write(user); } else { if (check_send_queue(hub, user, msg) >= 0) { ioq_send_add(user->send_queue, msg); if (!user_flag_get(user, flag_pipeline)) user_net_io_want_write(user); } } return 1; }
int handle_net_write(struct hub_user* user) { int ret = 0; while (hub_sendq_get_bytes(user->send_queue)) { ret = hub_sendq_send(user->send_queue, user); if (ret <= 0) break; } if (ret < 0) return quit_socket_error; if (hub_sendq_get_bytes(user->send_queue)) { user_net_io_want_write(user); } else { user_net_io_want_read(user); } return 0; }