vg_async_queue_end( &_gs_db.tasks, k_async_quit_when_empty );
}
- if( vg_async_consume( &_gameserver.tasks, 100 ) )
- break;
+ // TODO Measure max time spent on tasks?
+
+ while( vg_async_has_work( &_gameserver.tasks ) )
+ {
+ if( vg_async_process_next_task( &_gameserver.tasks ) == 0 )
+ goto EE;
+ }
}
- vg_info( "Program ends\n" );
+EE:vg_info( "Program ends\n" );
SteamAPI_ISteamNetworkingSockets_DestroyPollGroup( hSteamNetworkingSockets, _gameserver.client_group );
SteamAPI_ISteamNetworkingSockets_CloseListenSocket( hSteamNetworkingSockets, listener );
-
SteamGameServer_Shutdown();
E1:db_free();
return NULL;
}
- /*
- * Request processing loop
- */
- while(1)
- {
- usleep(50000);
-
- if( vg_async_consume( &_gs_db.tasks, 100 ) )
- break;
- }
+ while( vg_async_process_next_task( &_gs_db.tasks ) ) {}
sqlite3_close( _gs_db.db );
vg_low( "Database thread terminates.\n" );
THREAD_0;
vg_async_task *task = vg_allocate_async_task( &_gs_db.tasks, sizeof(struct task_set_username), 1 );
- task->handler = task_set_username;
struct task_set_username *info = (void *)task->data;
info->steamid = steamid;
vg_strncpy( username, info->name, sizeof(info->name), k_strncpy_always_add_null );
- vg_async_task_dispatch( &_gs_db.tasks, task );
+ vg_async_task_dispatch( &_gs_db.tasks, task, task_set_username );
}
enum request_status gameserver_cat_table( vg_msg *msg, const char *mod, const char *route, u32 week, const char *alias )
u32 task_size = sizeof( struct serialized_replay ) + buffer_size;
vg_async_task *task = vg_allocate_async_task( &_gs_db.tasks, task_size, 1 );
- task->handler = task_write_replay;
-
struct serialized_replay *replay_inf = (void *)task->data;
replay_inf->steamid = _gameserver.clients[ client_id ].steamid;
replay_inf->minute = minute;
}
replay_inf->buffer_size = output_size;
- vg_async_task_dispatch( &_gs_db.tasks, task );
+ vg_async_task_dispatch( &_gs_db.tasks, task, task_write_replay );
flags |= (u8)k_replay_minute_saved;
}
info->steam_id = steamid;
info->last_second = last_second;
info->centiseconds = centiseconds;
- task->handler = _gs_replay_async_request_save;
- vg_async_task_dispatch( &_gameserver.tasks, task );
+ vg_async_task_dispatch( &_gameserver.tasks, task, _gs_replay_async_request_save );
return;
}
replay->minute_flags[ minute_index ] |= k_replay_minute_save_request;
}
- vg_info( "Preparing descriptor file\n" );
u32 descriptor_size = 1024;
vg_async_task *replay_descriptor_task =
vg_allocate_async_task( &_gs_db.tasks, sizeof(struct replay_descriptor_info) + descriptor_size, 1 );
descriptor_info->message_length = msg.cur.co;
descriptor_info->last_second = last_second;
descriptor_info->steamid = steamid;
-
- vg_info( "..1\n" );
- replay_descriptor_task->handler = _gs_replay_write_descriptor;
- vg_async_task_dispatch( &_gs_db.tasks, replay_descriptor_task );
- vg_info( "...\n" );
+ vg_async_task_dispatch( &_gs_db.tasks, replay_descriptor_task, _gs_replay_write_descriptor );
}
void _gs_replay_server_tick(void)
vg_pool_watch( &_gs_requests.request_pool, rc->current_request );
vg_async_task *run_task = vg_allocate_async_task( &_gs_db.tasks, sizeof(struct task_request_run_info), 1 );
- run_task->handler = task_request_run;
struct task_request_run_info *info = (void *)run_task->data;
info->pool_id = rc->current_request;
- vg_async_task_dispatch( &_gs_db.tasks, run_task );
+ vg_async_task_dispatch( &_gs_db.tasks, run_task, task_request_run );
req->state = k_request_state_server_processing;
log_request_status( req );
E0:;
vg_async_task *return_task = vg_allocate_async_task( &_gameserver.tasks, sizeof(struct task_request_run_info), 1 );
memcpy( return_task->data, info, sizeof(struct task_request_run_info) );
- return_task->handler = task_request_processing_complete;
- vg_async_task_dispatch( &_gameserver.tasks, return_task );
+ vg_async_task_dispatch( &_gameserver.tasks, return_task, task_request_processing_complete );
}
void _gs_handle_request_message( u32 client_id, SteamNetworkingMessage_t *msg )