SilcFSM fsm;
fsm = silc_calloc(1, sizeof(*fsm));
- if (!fsm)
+ if (silc_unlikely(!fsm))
return NULL;
- if (!silc_fsm_init(fsm, fsm_context, destructor,
- destructor_context, schedule)) {
+ if (silc_unlikely(!silc_fsm_init(fsm, fsm_context, destructor,
+ destructor_context, schedule))) {
silc_free(fsm);
return NULL;
}
SilcFSMThread thread;
thread = silc_calloc(1, sizeof(*thread));
- if (!thread)
+ if (silc_unlikely(!thread))
return NULL;
silc_fsm_thread_init(thread, fsm, thread_context, destructor,
{
SilcFSM f = fsm;
if (!f->thread)
- silc_schedule_task_add_timeout(f->schedule, silc_fsm_free_final, f, 0, 0);
- else
- silc_fsm_free_final(f->schedule, silc_schedule_get_context(f->schedule),
- 0, 0, f);
+ if (silc_schedule_task_add_timeout(f->schedule, silc_fsm_free_final,
+ f, 0, 0))
+ return;
+ silc_fsm_free_final(f->schedule, silc_schedule_get_context(f->schedule),
+ 0, 0, f);
}
/* Task to start real thread. We start threads through scheduler, not
/* Start real thread through scheduler */
if (f->thread && f->real_thread) {
- silc_schedule_task_add_timeout(f->schedule, silc_fsm_start_real_thread,
- f, 0, 0);
+ if (!silc_schedule_task_add_timeout(f->schedule,
+ silc_fsm_start_real_thread,
+ f, 0, 0))
+ silc_fsm_start_real_thread(f->schedule,
+ silc_schedule_get_context(f->schedule),
+ 0, 0, f);
return;
}
/* Normal FSM operation */
- silc_schedule_task_add_timeout(f->schedule, silc_fsm_run, f, 0, 0);
+ if (!silc_schedule_task_add_timeout(f->schedule, silc_fsm_run, f, 0, 0))
+ silc_fsm_run(f->schedule, silc_schedule_get_context(f->schedule), 0, 0, f);
}
/* Start FSM in the specified state synchronously */
SilcFSM f = fsm;
SILC_ASSERT(!f->finished);
- f->finished = TRUE;
+
+ /* Machine must not have active threads */
+ if (!f->thread && f->u.m.threads)
+ assert(f->u.m.threads == 0);
+
f->started = FALSE;
+ f->finished = TRUE;
silc_schedule_task_del_by_all(f->schedule, 0, silc_fsm_run, f);
f->next_later = FALSE;
}
/* Normal FSM operation */
- if (f->synchronous)
- silc_fsm_finish_fsm(f->schedule, silc_schedule_get_context(f->schedule),
- 0, 0, fsm);
- else
- silc_schedule_task_add_timeout(f->schedule, silc_fsm_finish_fsm, f, 0, 0);
+ if (!f->synchronous)
+ if (silc_schedule_task_add_timeout(f->schedule, silc_fsm_finish_fsm,
+ f, 0, 0))
+ return;
+
+ silc_fsm_finish_fsm(f->schedule, silc_schedule_get_context(f->schedule),
+ 0, 0, fsm);
}
/* Return associated scheduler */
return (SilcFSM)thread->u.t.fsm;
}
-/* Returns TRUE if FSM is started and not yet finished */
+/* Returns TRUE if FSM is started */
SilcBool silc_fsm_is_started(void *fsm)
{
SilcFSM f = fsm;
-
- if (f->started && !f->finished)
- return TRUE;
-
- return FALSE;
+ return f->started;
}
/* Set context */
SILC_ASSERT(t->thread);
- if (t->finished)
- return FALSE;
t->u.t.sema = silc_fsm_sema_alloc(t->u.t.fsm, 0);
if (!t->u.t.sema)
return FALSE;
SilcFSMSema sema;
sema = silc_calloc(1, sizeof(*sema));
- if (!sema)
+ if (silc_unlikely(!sema))
return NULL;
silc_fsm_sema_init(sema, fsm, value);
}
p = silc_calloc(1, sizeof(*p));
- if (!p)
+ if (silc_unlikely(!p))
continue;
p->sema = sema;
p->fsm = fsm;
cannot be used in this thread. Application may still use it if it
wants but we use our own. */
fsm->schedule = silc_schedule_init(0, old);
- if (!fsm->schedule)
+ if (silc_unlikely(!fsm->schedule))
return NULL;
/* Start the FSM thread */
- if (!silc_schedule_task_add_timeout(fsm->schedule, silc_fsm_run, fsm, 0, 0))
+ if (silc_unlikely(!silc_schedule_task_add_timeout(fsm->schedule,
+ silc_fsm_run, fsm, 0, 0)))
return NULL;
/* Run the scheduler */