OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / system / process / process_constructor.c
1 /** 
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  process.h
5  * @brief %jp{プロセスオブジェクト}
6  *
7  * Copyright (C) 2006-2007 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11 #include <string.h>
12 #include "process_local.h"
13
14
15 static const T_HANDLEOBJ_METHODS Process_Methods =
16         {
17                 Process_Delete,
18         };
19
20
21 static void Process_Entry(VPARAM Param);
22
23
24 /** コンストラクタ */
25 PROCESS_ERR Process_Constructor(C_PROCESS *self, const T_HANDLEOBJ_METHODS *pMethods, const T_PROCESS_CREATE_INF *pInf)
26 {
27         if ( pMethods == NULL )
28         {
29                 pMethods = &Process_Methods;
30         }
31
32         /* メンバ変数初期化 */
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); /* カレントディレクトリ */
45         
46         
47         /* 待ち合わせ用イベント生成 */
48         self->hEvt = SysEvt_Create(SYSEVT_ATTR_NORMAL);
49         if ( self->hEvt == SYSEVT_HANDLE_NULL )
50         {
51                 return PROCESS_ERR_NG;
52         }
53         SysEvt_Clear(self->hEvt);
54         
55         /* スタック用メモリ確保 */
56         if ( (self->pStack = SysMem_Alloc(self->StackSize)) == NULL )
57         {
58                 return PROCESS_ERR_NG;
59         }
60
61         /* プロセス生成 */
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 )
64         {
65                 SysEvt_Delete(self->hEvt);
66                 SysMem_Free(self->pStack);
67                 return PROCESS_ERR_NG;
68         }
69         
70         /* 親クラスコンストラクタ */
71         HandleObj_Constructor(&self->HandleObj, pMethods);
72         
73         /* 起動完了待ち */
74         SysEvt_Wait(self->hEvt);
75         
76         return PROCESS_ERR_OK;
77 }
78
79
80 /* プロセスエントリーポイント */
81 void Process_Entry(VPARAM Param)
82 {
83         C_PROCESS       *self;
84         int                     (*pfncEntry)(VPARAM Param);
85         VPARAM          ProcParam;
86         int                     iExitCode;
87
88         self = (C_PROCESS *)Param;
89
90         pfncEntry = self->pfncEntry;
91         ProcParam = self->Param;
92
93         SysEvt_Set(self->hEvt);
94         
95         iExitCode = pfncEntry(ProcParam);
96         
97         Process_Exit(iExitCode);
98 }
99
100
101 /* end of file */