silc_fsm_thread_alloc

SYNOPSIS

    SilcFSMThread silc_fsm_thread_alloc(SilcFSM fsm,
                                        void *thread_context,
                                        SilcFSMThreadDestructor destructor,
                                        void *destructor_context,
                                        SilcBool real_thread);

DESCRIPTION

Allocates FSM thread context. The thread will be executed in the FSM machine indicated by `fsm'. The caller must free the returned thread context with silc_fsm_free. If the 'real_thread' is TRUE then the thread will actually be executed in real thread, if platform supports them. The `thread_context' is delivered to every state function in the thread. Returns NULL on error or if the system is out of memory and sets silc_errno.

NOTES

If the system does not support threads, then this function will revert back to normal FSM threads.

If the `real_thread' is TRUE then FSM will allocate new SilcSchedule for the FSM thread. If you need scheduler in the real thread it is strongly recommended that you use the SilcSchedule that is allocated for the thread. You can retrieve the SilcSchedule from the thread using silc_fsm_get_schedule function. The new scheduler is a child scheduler of the original scheduler used with `fsm'. Note that, the allocated SilcSchedule will become invalid after the thread finishes. Note also that the scheduler is automatically set as global scheduler in that thread by calling silc_schedule_set_global.

If `real_thread' is FALSE the silc_fsm_get_schedule will return the SilcSchedule that was originally given to silc_fsm_alloc or silc_fsm_init.

EXAMPLE

    SILC_FSM_STATE(silc_foo_state)
    {
      SilcFSMThread thread;
      ...

      // Execute the route lookup in thread
      thread = silc_fsm_thread_alloc(fsm, fsm_context, NULL, NULL, FALSE);
      silc_fsm_start(thread, silc_route_lookup_start);

      // Wait here for the thread to terminate. Set the state where to go
      // after the thread has terminated.
      silc_fsm_next(fsm, silc_foo_route_lookup_finished);
      SILC_FSM_THREAD_WAIT(thread);
    }