static int tek_lib_exec_child_signal(lua_State *L) { struct LuaExecChild *ctx = luaL_checkudata(L, 1, TEK_LIB_TASK_CLASSNAME); TUINT sig = tek_lib_exec_string2sig(luaL_optstring(L, 2, "t")); if (ctx->task) TExecSignal(ctx->exec, ctx->task, sig); return 0; }
EXPORT TINT hal_abortio(struct THALBase *hal, struct TTimeRequest *req) { struct HALSpecific *hws = hal->hmb_Specific; TAPTR exec = hws->hsp_ExecBase; TUINT status; #ifdef USE_MMTIMER EnterCriticalSection(&hws->hsp_DevLock); status = TExecGetMsgStatus(exec, req); if (status == (TMSG_STATUS_SENT | TMSGF_QUEUED)) { /* enforce immediate expiration */ req->ttr_Data.ttr_Time.tdt_Int64 = 0; req->ttr_Req.io_Error = TIOERR_ABORTED; TRemove(&req->ttr_Req.io_Node); while (!hal_replytimereq(req)); } LeaveCriticalSection(&hws->hsp_DevLock); #else EnterCriticalSection(&hws->hsp_DevLock); status = TExecGetMsgStatus(exec, req); if (!(status & TMSGF_RETURNED)) { if (status & TMSGF_QUEUED) { /* remove from ioport */ TAPTR ioport = TExecGetUserPort(exec, hws->hsp_DevTask); TExecRemoveMsg(exec, ioport, req); } else { /* remove from reqlist */ TRemove((struct TNode *) req); TExecSignal(exec, hws->hsp_DevTask, TTASK_SIG_USER); } } else { /* already replied */ req = TNULL; } LeaveCriticalSection(&hws->hsp_DevLock); if (req) { req->ttr_Req.io_Error = TIOERR_ABORTED; TExecReplyMsg(exec, req); } #endif return 0; }
static void init_tek_destroy(TAPTR apptask) { TAPTR exec, exectask, boot; struct TEKlibInit *init; exec = TGetExecBase(apptask); exectask = TExecFindTask(exec, TTASKNAME_EXEC); init = TExecGetInitData(exec, exectask); boot = init->tli_BootHnd; init_destroyatom(exec, init->tli_AtomUnique, "sys.unique"); init_destroyatom(exec, init->tli_AtomRetValP, "sys.returnvalue"); init_destroyatom(exec, init->tli_AtomProgName, "sys.progname"); init_destroyatom(exec, init->tli_AtomArgs, "sys.arguments"); init_destroyatom(exec, init->tli_AtomArgV, "sys.argv"); init_destroyatom(exec, init->tli_AtomInitMods, "sys.imods"); /* deinitializations in basetask: */ TExecDoExec(init->tli_ExecBase, TEXEC_CMD_EXIT, TNULL); TExecSignal(init->tli_ExecBase, init->tli_ExecTask, TTASK_SIG_ABORT); TExecSignal(init->tli_ExecBase, init->tli_IOTask, TTASK_SIG_ABORT); TDESTROY(init->tli_ExecTask); TDESTROY(init->tli_IOTask); TCALLHOOKPKT(&init->tli_OrgAppTaskHook, apptask, TNULL); init_closeexecmodule(init); init_closehalmodule(init); TEKlib_FreeVec(boot, init->tli_ProgDir); TEKlib_FreeVec(boot, init->tli_SysDir); TEKlib_FreeVec(boot, init->tli_ModDir); TEKlib_Free(boot, init, sizeof(struct TEKlibInit)); TEKlib_Exit(boot); }
LOCAL TCALLBACK void hal_close(struct THALBase *hal, struct TTask *task) { struct HALSpecific *hws = hal->hmb_Specific; EnterCriticalSection(&hws->hsp_DevLock); if (hws->hsp_DevTask) { if (--hws->hsp_RefCount == 0) { TDBPRINTF(2,("hal.device refcount dropped to 0\n")); TExecSignal(hws->hsp_ExecBase, hws->hsp_DevTask, TTASK_SIG_ABORT); TDBPRINTF(2,("destroy hal.device task...\n")); TDestroy(hws->hsp_DevTask); hws->hsp_DevTask = TNULL; } } LeaveCriticalSection(&hws->hsp_DevLock); }
static struct TTask *init_tek_create(TTAGITEM *usertags) { struct TEKlibInit *init; TAPTR boot = TEKlib_Init(usertags); if (boot == TNULL) return TNULL; init = TEKlib_Alloc(boot, sizeof(struct TEKlibInit)); if (init) { init->tli_BootHnd = boot; init->tli_ProgDir = TEKlib_GetProgDir(boot, usertags); init->tli_SysDir = TEKlib_GetSysDir(boot, usertags); init->tli_ModDir = TEKlib_GetModDir(boot, usertags); /* load host abstraction module */ if (init_openhalmodule(init, usertags)) { /* load exec module */ if (init_openexecmodule(init, usertags)) { /* place application task into current context */ init->tli_ExecTags[0].tti_Tag = TTask_Name; init->tli_ExecTags[0].tti_Value = (TTAG) TTASKNAME_ENTRY; init->tli_ExecTags[1].tti_Tag = TTask_InitData; init->tli_ExecTags[1].tti_Value = (TTAG) init; init->tli_ExecTags[2].tti_Tag = TTAG_MORE; init->tli_ExecTags[2].tti_Value = (TTAG) usertags; init->tli_AppTask = TExecCreateSysTask(init->tli_ExecBase, TNULL, init->tli_ExecTags); if (init->tli_AppTask) { /* fill in missing fields in execbase */ ((struct TModule *) init->tli_ExecBase)->tmd_HALMod = init->tli_ExecMod; ((struct TModule *) init->tli_ExecBase)->tmd_InitTask = init->tli_AppTask; /* create ramlib task */ init->tli_ExecTags[0].tti_Value = (TTAG) TTASKNAME_RAMLIB; init->tli_IOTask = TExecCreateSysTask(init->tli_ExecBase, init_execfunc, init->tli_ExecTags); if (init->tli_IOTask) { /* create execbase task */ init->tli_ExecTags[0].tti_Value = (TTAG) TTASKNAME_EXEC; init->tli_ExecTask = TExecCreateSysTask(init->tli_ExecBase, init_execfunc, init->tli_ExecTags); if (init->tli_ExecTask) { /* this is the backdoor for the remaining ** initializations in the entrytask context */ if (TExecDoExec(init->tli_ExecBase, TEXEC_CMD_INIT, TNULL)) { struct THandle *ath = (struct THandle *) init->tli_AppTask; /* overwrite apptask destructor */ init->tli_OrgAppTaskHook = ath->thn_Hook; TInitHook(&ath->thn_Hook, init_destroyapptask, TNULL); init_appatoms(init, usertags); /* application is running */ return init->tli_AppTask; } TExecSignal(init->tli_ExecBase, init->tli_ExecTask, TTASK_SIG_ABORT); TDESTROY(init->tli_ExecTask); } TExecSignal(init->tli_ExecBase, init->tli_IOTask, TTASK_SIG_ABORT); TDESTROY(init->tli_IOTask); } TDESTROY(init->tli_AppTask); } init_closeexecmodule(init); } else TDBPRINTF(20, ("could not open Exec module\n")); init_closehalmodule(init); } else TDBPRINTF(20, ("could not open HAL module\n")); TEKlib_FreeVec(boot, init->tli_ProgDir); TEKlib_FreeVec(boot, init->tli_SysDir); TEKlib_FreeVec(boot, init->tli_ModDir); TEKlib_Free(boot, init, sizeof(struct TEKlibInit)); } TEKlib_Exit(boot); return TNULL; }