/* * ======== Task_deleteTerminatedTasksFunc ======== */ Void Task_deleteTerminatedTasksFunc() { UInt key; Task_Handle tsk; key = Hwi_disable(); if (!Queue_empty(Task_Module_State_terminatedQ())) { tsk = Queue_head(Task_Module_State_terminatedQ()); Hwi_restore(key); Task_delete(&tsk); } else { Hwi_restore(key); } }
/* * ======== Task_exit ======== */ Void Task_exit() { UInt tskKey, hwiKey; Task_Object *tsk; #ifndef ti_sysbios_knl_Task_DISABLE_ALL_HOOKS Int i; #endif tsk = Task_self(); #ifndef ti_sysbios_knl_Task_DISABLE_ALL_HOOKS /* * Process Task_exit hooks. Should be called outside the Task kernel. */ for (i = 0; i < Task_hooks.length; i++) { if (Task_hooks.elem[i].exitFxn != NULL) { Task_hooks.elem[i].exitFxn(tsk); } } #endif Log_write2(Task_LD_exit, (UArg)tsk, (UArg)tsk->fxn); tskKey = Task_disable(); hwiKey = Hwi_disable(); Task_blockI(tsk); tsk->mode = Task_Mode_TERMINATED; Task_processVitalTaskFlag(tsk); Hwi_restore(hwiKey); Queue_elemClear((Queue_Elem *)tsk); /* add to terminated task list if it was dynamically created */ if (Task_deleteTerminatedTasks == TRUE) { Task_Handle dynTask; dynTask = Task_Object_first(); while (dynTask) { if (tsk == dynTask) { tsk->readyQ = Task_Module_State_terminatedQ(); Queue_put(tsk->readyQ, (Queue_Elem *)tsk); break; } else { dynTask = Task_Object_next(dynTask); } } } Task_restore(tskKey); }
/* * ======== Task_deleteTerminatedTasksFunc ======== */ Void Task_deleteTerminatedTasksFunc() { UInt hwiKey, taskKey; Task_Handle tsk; taskKey = Task_disable(); hwiKey = Hwi_disable(); if (!Queue_empty(Task_Module_State_terminatedQ())) { tsk = Queue_head(Task_Module_State_terminatedQ()); Hwi_restore(hwiKey); tsk->readyQ = NULL; Task_delete(&tsk); } else { Hwi_restore(hwiKey); } Task_restore(taskKey); }
/* * ======== Task_Instance_finalize ======== */ Void Task_Instance_finalize(Task_Object *tsk, Int status) { #ifndef ti_sysbios_knl_Task_DISABLE_ALL_HOOKS Int i, cnt; #endif UInt taskKey, hwiKey; /* * Task's can only be deleted from main and task threads. * Running Tasks can not be deleted. */ if (status == 0) { taskKey = Task_disable(); /* * Bar users from calling Task_delete() on terminated tasks * if deleteTerminatedTasks is enabled. */ if ((Task_deleteTerminatedTasks == TRUE) && (Task_getMode(tsk) == Task_Mode_TERMINATED) && (tsk->readyQ == Task_Module_State_terminatedQ())) { Error_raise(NULL, Task_E_deleteNotAllowed, tsk, 0); } Assert_isTrue((Task_getMode(tsk) != Task_Mode_RUNNING), Task_A_badTaskState); Assert_isTrue((BIOS_getThreadType() == BIOS_ThreadType_Main) || (BIOS_getThreadType() == BIOS_ThreadType_Task), Task_A_badThreadType); hwiKey = Hwi_disable(); if (tsk->mode == Task_Mode_READY) { /* remove task from its ready list */ Queue_remove((Queue_Elem *)tsk); /* if last task in readyQ, remove corresponding bit in curSet */ if (Queue_empty(tsk->readyQ)) { Task_module->curSet &= ~tsk->mask; } /* * if task was made ready by a pend timeout but hasn't run yet * then its clock object is still on the Clock service Q. */ if (tsk->pendElem != NULL) { if (BIOS_clockEnabled && tsk->pendElem->clock) { Clock_removeI(tsk->pendElem->clock); } } } if (tsk->mode == Task_Mode_BLOCKED) { Assert_isTrue(tsk->pendElem != NULL, Task_A_noPendElem); /* Seemingly redundant test in case Asserts are disabled */ if (tsk->pendElem != NULL) { Queue_remove(&(tsk->pendElem->qElem)); if (BIOS_clockEnabled && tsk->pendElem->clock) { Clock_removeI(tsk->pendElem->clock); } } } if (tsk->mode == Task_Mode_TERMINATED) { /* remove task from terminated task list */ Queue_remove((Queue_Elem *)tsk); } else { Task_processVitalTaskFlag(tsk); } Hwi_restore(hwiKey); Task_restore(taskKey); } /* return if failed before allocating stack */ if (status == 1) { return; } if (BIOS_runtimeCreatesEnabled) { /* free stack if it was allocated dynamically */ if (tsk->stackHeap != (xdc_runtime_IHeap_Handle)(-1)) { Memory_free(tsk->stackHeap, tsk->stack, tsk->stackSize); } } /* return if failed to allocate Hook Env */ if (status == 2) { return; } /* status == 0 or status == 3 - in both cases create hook was called */ #ifndef ti_sysbios_knl_Task_DISABLE_ALL_HOOKS /* free any allocated Hook Envs */ if (Task_hooks.length > 0) { if (status == 0) { cnt = Task_hooks.length; } else { cnt = status - 3; /* # successful createFxn() calls */ } /* * only call deleteFxn() if createFxn() was successful */ for (i = 0; i < cnt; i++) { if (Task_hooks.elem[i].deleteFxn != NULL) { Task_hooks.elem[i].deleteFxn(tsk); } } Memory_free(Task_Object_heap(), tsk->hookEnv, Task_hooks.length * sizeof (Ptr)); } #endif }