void v_noq_send_buf(VNetOutQueue *queue, VCMDBufHead *buf) { static int count = 0; /* if(queue->unsent_comands > V_NOQ_MAX_SORTED_COMMANDS) { */ if(queue->unsorted == NULL) { queue->unsorted_end = buf; queue->unsorted = buf; }else { queue->unsorted_end->next = buf; queue->unsorted_end = buf; } queue->unsorted_count++; /* }else v_noq_sort_and_colapse_buf(queue, buf); */ count = (count + 1) % 30; if(count == 0) { v_con_network_listen(); v_noq_send_queue(queue, v_con_get_network_address()); } }
boolean v_con_callback_update(void) { static unsigned int seconds; boolean output = FALSE; unsigned int size, connection, s; VNetInPacked *p; v_n_get_current_time(&s, NULL); connection = VConData.current_connection; for(VConData.current_connection = 0; VConData.current_connection < VConData.con_count; VConData.current_connection++) if(VConData.con[VConData.current_connection].connect_stage != V_CS_CONNECTED) v_update_connection_pending(s != seconds); seconds = s; VConData.current_connection = connection; if(VConData.pending_packets == 0) return FALSE; if(VConData.con[VConData.current_connection].connect_stage == V_CS_CONNECTED) { while((p = v_niq_get(&VConData.con[VConData.current_connection].in_queue, &size)) != NULL) { VConData.pending_packets--; v_fs_unpack(p->data, size); v_niq_release(&VConData.con[VConData.current_connection].in_queue, p); output = TRUE; } v_con_network_listen(); } return output; }
void verse_callback_update(unsigned int microseconds) { unsigned int connection, passed; v_ping_update(); /* Deliver any pending pings. */ connection = VConData.current_connection; for(VConData.current_connection = 0; VConData.current_connection < VConData.con_count; VConData.current_connection++) { if(VConData.con[VConData.current_connection].connect_stage == V_CS_CONNECTED) v_noq_send_queue(VConData.con[VConData.current_connection].out_queue, &VConData.con[VConData.current_connection].network_address); if(VConData.con[VConData.current_connection].destroy_flag == TRUE) { v_noq_destroy_network_queue(VConData.con[VConData.current_connection].out_queue); VConData.pending_packets -= v_niq_free(&VConData.con[VConData.current_connection].in_queue); v_destroy_ordered_storage(VConData.con[VConData.current_connection].ordered_storage); if(VConData.con[VConData.current_connection].expected_key != NULL) free(VConData.con[VConData.current_connection].expected_key); if(VConData.con_count - 1 != VConData.current_connection) VConData.con[VConData.current_connection] = VConData.con[VConData.con_count - 1]; VConData.con_count--; if(connection >= VConData.con_count) VConData.current_connection = 0; return; } } VConData.current_connection = connection; if(VConData.con_count > 0) { /* printf("checking timeout of stage %d connection %u\n", VConData.con[VConData.current_connection].connect_stage, VConData.current_connection); */ if(V_CONNECTON_TIME_OUT < v_niq_time_out(&VConData.con[VConData.current_connection].in_queue)) { if(VConData.con[VConData.current_connection].connect_stage != V_CS_CONNECTED) { VConData.con[VConData.current_connection].destroy_flag = TRUE; } else v_callback_connect_terminate("connection timed out"); } } v_con_network_listen(); if(VConData.con_count > 0) if(v_con_callback_update()) return; for(passed = 0; passed < microseconds && VConData.pending_packets == 0;) { boolean update; if(microseconds - passed > V_CON_MAX_MICROSECOND_BETWEEN_SENDS) /* Still a long way to go? */ passed += v_n_wait_for_incoming(V_CON_MAX_MICROSECOND_BETWEEN_SENDS); else passed += v_n_wait_for_incoming(microseconds - passed); do { update = v_con_network_listen(); connection = VConData.current_connection; for(VConData.current_connection = 0; VConData.current_connection < VConData.con_count; VConData.current_connection++) { if(VConData.con[VConData.current_connection].connect_stage == V_CS_CONNECTED) { if(v_noq_send_queue(VConData.con[VConData.current_connection].out_queue, &VConData.con[VConData.current_connection].network_address)) update = TRUE; } } VConData.current_connection = connection; } while(update); } if(VConData.con_count > 0) v_con_callback_update(); }