Exemplo n.º 1
0
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());
	}
}
Exemplo n.º 2
0
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();
}