int __rtai_task_delete(RT_TASK *task) { int err = 0; spl_t s; xnlock_get_irqsave(&nklock, s); task = rtai_h2obj_validate(task, RTAI_TASK_MAGIC, RT_TASK); if (!task) { err = -EINVAL; goto unlock_and_exit; } if (task->sigfn != NULL && --__rtai_task_sig == 0) xnpod_remove_hook(XNHOOK_THREAD_SWITCH, &__task_switch_hook); /* Does not return if task is current. */ xnpod_delete_thread(&task->thread_base); unlock_and_exit: xnlock_put_irqrestore(&nklock, s); return err; }
void __rtai_task_pkg_cleanup(void) { xnholder_t *holder; spl_t s; xnlock_get_irqsave(&nklock, s); while ((holder = getheadq(&__rtai_task_q)) != NULL) { RT_TASK *task = link2rtask(holder); xnpod_abort_thread(&task->thread_base); xnlock_sync_irq(&nklock, s); } xnlock_put_irqrestore(&nklock, s); xnpod_remove_hook(XNHOOK_THREAD_DELETE, &__task_delete_hook); if (__rtai_task_sig) xnpod_remove_hook(XNHOOK_THREAD_SWITCH, &__task_switch_hook); }
void psostask_cleanup(void) { xnholder_t *holder; spl_t s; xnlock_get_irqsave(&nklock, s); while ((holder = getheadq(&psostaskq)) != NULL) { psostask_t *task = link2psostask(holder); xnpod_abort_thread(&task->threadbase); xnlock_sync_irq(&nklock, s); } xnlock_put_irqrestore(&nklock, s); xnpod_remove_hook(XNHOOK_THREAD_DELETE, psostask_delete_hook); }
void wind_task_cleanup(void) { xnholder_t *holder; spl_t s; xnlock_get_irqsave(&nklock, s); while ((holder = getheadq(&wind_tasks_q)) != NULL) { WIND_TCB *pTcb = link2wind_task(holder); xnpod_abort_thread(&pTcb->threadbase); xnlock_sync_irq(&nklock, s); } xnlock_put_irqrestore(&nklock, s); xnpod_remove_hook(XNHOOK_THREAD_DELETE, wind_task_delete_hook); }
void __rtai_syscall_cleanup(void) { xnpod_remove_hook(XNHOOK_THREAD_DELETE, &__shadow_delete_hook); xnshadow_unregister_interface(__rtai_muxid); }