コード例 #1
0
ファイル: exec_lua.c プロジェクト: RangelReale/luaexec
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;
}
コード例 #2
0
ファイル: hal.c プロジェクト: callcc/tekui
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;
}
コード例 #3
0
ファイル: init.c プロジェクト: 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);
}
コード例 #4
0
ファイル: hal.c プロジェクト: callcc/tekui
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);
}
コード例 #5
0
ファイル: init.c プロジェクト: 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;
}