forked from cory/tildefriends
Make it so we don't have to wait ages for a timer to be able to shutdown with ^C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4796 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
58
src/ssb.c
58
src/ssb.c
@ -173,6 +173,14 @@ typedef struct _tf_thread_work_time_t
|
||||
uint64_t hrtime;
|
||||
} tf_thread_work_time_t;
|
||||
|
||||
typedef struct _tf_ssb_timer_t
|
||||
{
|
||||
tf_ssb_t* ssb;
|
||||
uv_timer_t timer;
|
||||
void (*callback)(tf_ssb_t* ssb, void* user_data);
|
||||
void* user_data;
|
||||
} tf_ssb_timer_t;
|
||||
|
||||
typedef struct _tf_ssb_t
|
||||
{
|
||||
bool own_context;
|
||||
@ -248,6 +256,9 @@ typedef struct _tf_ssb_t
|
||||
uv_thread_t thread_self;
|
||||
bool is_room;
|
||||
char* room_name;
|
||||
|
||||
tf_ssb_timer_t** timers;
|
||||
int timers_count;
|
||||
} tf_ssb_t;
|
||||
|
||||
typedef struct _tf_ssb_connection_message_request_t
|
||||
@ -2350,6 +2361,11 @@ static void _tf_ssb_on_handle_close(uv_handle_t* handle)
|
||||
handle->data = NULL;
|
||||
}
|
||||
|
||||
static void _tf_ssb_on_timer_close(uv_handle_t* handle)
|
||||
{
|
||||
tf_free(handle->data);
|
||||
}
|
||||
|
||||
void tf_ssb_destroy(tf_ssb_t* ssb)
|
||||
{
|
||||
tf_ssb_connections_destroy(ssb->connections_tracker);
|
||||
@ -2390,6 +2406,14 @@ void tf_ssb_destroy(tf_ssb_t* ssb)
|
||||
uv_close((uv_handle_t*)&ssb->settings_timer, _tf_ssb_on_handle_close);
|
||||
}
|
||||
|
||||
for (int i = 0; i < ssb->timers_count; i++)
|
||||
{
|
||||
uv_close((uv_handle_t*)&ssb->timers[i]->timer, _tf_ssb_on_timer_close);
|
||||
}
|
||||
ssb->timers_count = 0;
|
||||
tf_free(ssb->timers);
|
||||
ssb->timers = NULL;
|
||||
|
||||
while (ssb->broadcast_listener.data ||
|
||||
ssb->broadcast_sender.data ||
|
||||
ssb->broadcast_timer.data ||
|
||||
@ -3919,3 +3943,37 @@ void tf_ssb_set_verbose(tf_ssb_t* ssb, bool verbose)
|
||||
{
|
||||
ssb->verbose = verbose;
|
||||
}
|
||||
|
||||
static void _tf_ssb_scheduled_timer(uv_timer_t* handle)
|
||||
{
|
||||
tf_ssb_timer_t* timer = handle->data;
|
||||
timer->callback(timer->ssb, timer->user_data);
|
||||
for (int i = 0; i < timer->ssb->timers_count; i++)
|
||||
{
|
||||
if (timer->ssb->timers[i] == timer)
|
||||
{
|
||||
timer->ssb->timers[i] = timer->ssb->timers[--timer->ssb->timers_count];
|
||||
break;
|
||||
}
|
||||
}
|
||||
uv_close((uv_handle_t*)handle, _tf_ssb_on_timer_close);
|
||||
}
|
||||
|
||||
void tf_ssb_schedule_work(tf_ssb_t* ssb, int delay_ms, void (*callback)(tf_ssb_t* ssb, void* user_data), void* user_data)
|
||||
{
|
||||
ssb->timers = tf_resize_vec(ssb->timers, sizeof(uv_timer_t*) * (ssb->timers_count + 1));
|
||||
tf_ssb_timer_t* timer = tf_malloc(sizeof(tf_ssb_timer_t));
|
||||
*timer = (tf_ssb_timer_t)
|
||||
{
|
||||
.ssb = ssb,
|
||||
.timer =
|
||||
{
|
||||
.data = timer,
|
||||
},
|
||||
.callback = callback,
|
||||
.user_data = user_data,
|
||||
};
|
||||
ssb->timers[ssb->timers_count++] = timer;
|
||||
uv_timer_init(ssb->loop, &timer->timer);
|
||||
uv_timer_start(&timer->timer, _tf_ssb_scheduled_timer, delay_ms, 0);
|
||||
}
|
||||
|
Reference in New Issue
Block a user