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;
}
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 */
/* Real thread */
-static void *silc_fsm_thread(void *context)
+void *silc_fsm_thread(void *context)
{
SilcFSM fsm = context;
SilcSchedule old = fsm->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)) {
/* 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;
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 */
/* 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;
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;
}