2 * Hyper Operating System Application Framework
5 * @brief %jp{プロセスオブジェクト}
7 * Copyright (C) 2006-2007 by Project HOS
8 * http://sourceforge.jp/projects/hos/
12 #include "process_local.h"
15 static const T_HANDLEOBJ_METHODS Process_Methods =
21 static void Process_Entry(VPARAM Param);
25 PROCESS_ERR Process_Constructor(C_PROCESS *self, const T_HANDLEOBJ_METHODS *pMethods, const T_PROCESS_CREATE_INF *pInf)
27 if ( pMethods == NULL )
29 pMethods = &Process_Methods;
33 self->iExitCode = -1; /* 終了コード */
34 self->pHandleList = NULL; /* 所有するハンドルのリスト(終了時に開放) */
35 self->pfncEntry = pInf->pfncEntry; /* 起動アドレス */
36 self->Param = pInf->Param; /* ユーザーパラメータ */
37 self->StackSize = pInf->StackSize; /* スタックサイズ */
38 self->Priority = pInf->Priority; /* プロセス優先度 */
39 self->hTerminal = pInf->hTerminal; /* ターミナル */
40 self->hConsole = pInf->hConsole; /* コンソール */
41 self->hStdIn = pInf->hStdIn; /* 標準入力 */
42 self->hStdOut = pInf->hStdOut; /* 標準出力 */
43 self->hStdErr = pInf->hStdErr; /* 標準エラー出力 */
44 strncpy(self->szCurrentDir, pInf->szCurrentDir, FILE_MAX_PATH); /* カレントディレクトリ */
48 self->hEvt = SysEvt_Create(SYSEVT_ATTR_NORMAL);
49 if ( self->hEvt == SYSEVT_HANDLE_NULL )
51 return PROCESS_ERR_NG;
53 SysEvt_Clear(self->hEvt);
56 if ( (self->pStack = SysMem_Alloc(self->StackSize)) == NULL )
58 return PROCESS_ERR_NG;
62 self->hPrc = SysPrc_Create(Process_Entry, (VPARAM)self, self->pStack, self->StackSize, self->Priority, SYSPRC_ATTR_NORMAL);
63 if ( self->hPrc == SYSPRC_HANDLE_NULL )
65 SysEvt_Delete(self->hEvt);
66 SysMem_Free(self->pStack);
67 return PROCESS_ERR_NG;
71 HandleObj_Constructor(&self->HandleObj, pMethods);
74 SysEvt_Wait(self->hEvt);
76 return PROCESS_ERR_OK;
81 void Process_Entry(VPARAM Param)
84 int (*pfncEntry)(VPARAM Param);
88 self = (C_PROCESS *)Param;
90 pfncEntry = self->pfncEntry;
91 ProcParam = self->Param;
93 SysEvt_Set(self->hEvt);
95 iExitCode = pfncEntry(ProcParam);
97 Process_Exit(iExitCode);