From 609978b52bc2d6a26ef98cacd35bed5cde0714e7 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Mon, 18 Dec 2006 14:38:42 +0000 Subject: [PATCH] Branch prediction optimizations. --- lib/silcutil/silcfdstream.c | 8 ++++---- lib/silcutil/silcfsm.c | 4 ++-- lib/silcutil/silcschedule.c | 15 ++++++++------- lib/silcutil/silcsocketstream.c | 8 ++++---- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/lib/silcutil/silcfdstream.c b/lib/silcutil/silcfdstream.c index c614811d..e7a46904 100644 --- a/lib/silcutil/silcfdstream.c +++ b/lib/silcutil/silcfdstream.c @@ -49,14 +49,14 @@ SILC_TASK_CALLBACK(silc_fd_stream_io) return; switch (type) { - case SILC_TASK_WRITE: - stream->notifier(stream, SILC_STREAM_CAN_WRITE, stream->notifier_context); - break; - case SILC_TASK_READ: stream->notifier(stream, SILC_STREAM_CAN_READ, stream->notifier_context); break; + case SILC_TASK_WRITE: + stream->notifier(stream, SILC_STREAM_CAN_WRITE, stream->notifier_context); + break; + default: break; } diff --git a/lib/silcutil/silcfsm.c b/lib/silcutil/silcfsm.c index 4feffdff..47c9b51f 100644 --- a/lib/silcutil/silcfsm.c +++ b/lib/silcutil/silcfsm.c @@ -23,10 +23,10 @@ SILC_TASK_CALLBACK(silc_fsm_run); SILC_TASK_CALLBACK(silc_fsm_finish_fsm); SILC_TASK_CALLBACK(silc_fsm_sema_timedout); SILC_TASK_CALLBACK(silc_fsm_start_real_thread); -static void *silc_fsm_thread(void *context); static void silc_fsm_thread_termination_post(SilcFSMSema sema); static void silc_fsm_sema_ref(SilcFSMSema sema); static void silc_fsm_sema_unref(SilcFSMSema sema); +void *silc_fsm_thread(void *context); /* Allocate FSM */ @@ -714,7 +714,7 @@ static void silc_fsm_thread_termination_post(SilcFSMSema sema) /* Real thread */ -static void *silc_fsm_thread(void *context) +void *silc_fsm_thread(void *context) { SilcFSM fsm = context; SilcSchedule old = fsm->schedule; diff --git a/lib/silcutil/silcschedule.c b/lib/silcutil/silcschedule.c index ac96afab..cd5a3203 100644 --- a/lib/silcutil/silcschedule.c +++ b/lib/silcutil/silcschedule.c @@ -51,7 +51,8 @@ static void silc_schedule_dispatch_fd(SilcSchedule schedule) SilcUInt32 fd; silc_hash_table_list(schedule->fd_queue, &htl); - while (silc_hash_table_get(&htl, (void **)&fd, (void **)&task)) { + while (silc_likely(silc_hash_table_get(&htl, (void **)&fd, + (void **)&task))) { t = (SilcTask)task; if (silc_unlikely(!t->valid)) { @@ -103,6 +104,8 @@ static void silc_schedule_dispatch_timeout(SilcSchedule schedule, /* First task in the task queue has always the earliest timeout. */ silc_list_start(schedule->timeout_queue); task = silc_list_get(schedule->timeout_queue); + if (silc_unlikely(!task)) + return; do { t = (SilcTask)task; @@ -112,18 +115,14 @@ static void silc_schedule_dispatch_timeout(SilcSchedule schedule, continue; } - SILC_SCHEDULE_UNLOCK(schedule); - /* Execute the task if the timeout has expired */ - if (!silc_compare_timeval(&task->timeout, &curtime) && !dispatch_all) { - SILC_SCHEDULE_LOCK(schedule); + if (!silc_compare_timeval(&task->timeout, &curtime) && !dispatch_all) break; - } t->valid = FALSE; + SILC_SCHEDULE_UNLOCK(schedule); t->callback(schedule, schedule->app_context, SILC_TASK_EXPIRE, 0, t->context); - SILC_SCHEDULE_LOCK(schedule); /* Remove the expired task */ @@ -153,6 +152,8 @@ static void silc_schedule_select_timeout(SilcSchedule schedule) /* First task in the task queue has always the earliest timeout. */ silc_list_start(schedule->timeout_queue); task = silc_list_get(schedule->timeout_queue); + if (silc_unlikely(!task)) + return; do { t = (SilcTask)task; diff --git a/lib/silcutil/silcsocketstream.c b/lib/silcutil/silcsocketstream.c index 0e40d414..1c4e952a 100644 --- a/lib/silcutil/silcsocketstream.c +++ b/lib/silcutil/silcsocketstream.c @@ -64,14 +64,14 @@ SILC_TASK_CALLBACK(silc_socket_stream_io) return; switch (type) { - case SILC_TASK_WRITE: - stream->notifier(stream, SILC_STREAM_CAN_WRITE, stream->notifier_context); - break; - case SILC_TASK_READ: stream->notifier(stream, SILC_STREAM_CAN_READ, stream->notifier_context); break; + case SILC_TASK_WRITE: + stream->notifier(stream, SILC_STREAM_CAN_WRITE, stream->notifier_context); + break; + default: break; } -- 2.24.0