static THOOKENTRY TTAG exec_dispatch(struct THook *hook, TAPTR obj, TTAG msg) { struct TExecBase *TExecBase = hook->thk_Data; switch (msg) { case TMSG_DESTROY: THALDestroyLock(TExecBase->texb_HALBase, &TExecBase->texb_Lock); TDESTROY(&TExecBase->texb_BaseMemManager); TDESTROY(&TExecBase->texb_MsgMemManager); break; #if defined(ENABLE_EXEC_IFACE) case TMSG_QUERYIFACE: { struct TInterfaceQuery *ifq = obj; if (TStrEqual(ifq->tifq_Name, "exec") && ifq->tifq_Version >= 1) return (TTAG) &TExecBase->texb_Exec1IFace; return TNULL; } case TMSG_DROPIFACE: TDBPRINTF(TDB_WARN,("drop interface: %p\n", obj)); break; #endif } return 0; }
static TBOOL exec_init(TEXECBASE *exec, TTAGITEM *tags) { TAPTR *halp, hal; halp = (TAPTR *) TGetTag(tags, TExecBase_HAL, TNULL); if (!halp) return TFALSE; hal = *halp; THALFillMem(hal, exec, sizeof(TEXECBASE), 0); exec->texb_HALBase = hal; if (THALInitLock(hal, &exec->texb_Lock)) { if (exec_initmm(exec, &exec->texb_MsgMemManager, TNULL, TMMT_Message, TNULL)) { if (exec_initmm(exec, &exec->texb_BaseMemManager, TNULL, TMMT_MemManager, TNULL)) { exec->texb_Module.tmd_Handle.thn_Hook.thk_Data = exec; exec->texb_Module.tmd_Handle.thn_Name = TMODNAME_EXEC; exec->texb_Module.tmd_Handle.thn_Owner = (struct TModule *) exec; exec->texb_Module.tmd_ModSuper = (struct TModule *) exec; exec->texb_Module.tmd_InitTask = TNULL; /* inserted later */ exec->texb_Module.tmd_HALMod = TNULL; /* inserted later */ exec->texb_Module.tmd_NegSize = EXEC_NUMVECTORS * sizeof(TAPTR); exec->texb_Module.tmd_PosSize = sizeof(TEXECBASE); exec->texb_Module.tmd_RefCount = 1; exec->texb_Module.tmd_Flags = TMODF_INITIALIZED | TMODF_VECTORTABLE; TInitList(&exec->texb_IntModList); exec->texb_InitModNode.tmin_Modules = (struct TInitModule *) TGetTag(tags, TExecBase_ModInit, TNULL); if (exec->texb_InitModNode.tmin_Modules) { TAddTail(&exec->texb_IntModList, &exec->texb_InitModNode.tmin_Node); } TInitList(&exec->texb_AtomList); TInitList(&exec->texb_TaskList); TInitList(&exec->texb_TaskInitList); TInitList(&exec->texb_TaskExitList); TInitList(&exec->texb_ModList); TAddHead(&exec->texb_ModList, (struct TNode *) exec); TAddHead(&exec->texb_ModList, (struct TNode *) hal); return TTRUE; } TDESTROY(&exec->texb_MsgMemManager); } THALDestroyLock(hal, &exec->texb_Lock); } return TFALSE; }
static void init_closeexecmodule(struct TEKlibInit *init) { struct TModule *execbase = (struct TModule *) init->tli_ExecBase; TINT nsize = execbase->tmd_NegSize; TDESTROY(execbase); TEKlib_Free(init->tli_BootHnd, ((TINT8 *) execbase) - nsize, execbase->tmd_NegSize + nsize); TEKlib_CloseModule(init->tli_BootHnd, init->tli_ExecMod); }
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); }
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; }
static void init_closehalmodule(struct TEKlibInit *init) { TDESTROY(init->tli_HALBase); TEKlib_CloseModule(init->tli_BootHnd, init->tli_HALMod); }