Exemplo n.º 1
0
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;
}
Exemplo n.º 2
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;
}
Exemplo n.º 3
0
Arquivo: init.c Projeto: callcc/tekui
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);
}
Exemplo n.º 4
0
Arquivo: init.c Projeto: callcc/tekui
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);
}
Exemplo n.º 5
0
Arquivo: init.c Projeto: callcc/tekui
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;
}
Exemplo n.º 6
0
Arquivo: init.c Projeto: callcc/tekui
static void
init_closehalmodule(struct TEKlibInit *init)
{
	TDESTROY(init->tli_HALBase);
	TEKlib_CloseModule(init->tli_BootHnd, init->tli_HALMod);
}