OSDN Git Service

e49234170a1d682893b3c58fb3dd00f2f9cf5b7e
[hos/hos-v4a.git] / kernel / source / object / tsk / rsm_tsk.c
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  rsm_tsk.c
5  * @brief 
6  *
7  * Copyright (C) 1998-2006 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12
13 #include "core/core.h"
14
15
16 #if _KERNEL_SPT_RSM_TSK
17
18
19 ER rsm_tsk(
20                 ID tskid)
21 {
22         _KERNEL_T_TSKHDL      tskhdl;
23         _KERNEL_T_TCB         *tcb;
24         _KERNEL_TSK_T_TSKSTAT tskstat;
25         _KERNEL_TSK_T_SUSCNT  suscnt;
26
27
28 #if _KERNEL_SPT_SUS_TSK_E_ID
29         if ( !_KERNEL_TSK_CHECK_TSKID(tskid) )
30         {
31                 return E_ID;    /* %jp{不正ID番号} */
32         }
33 #endif
34         
35         _KERNEL_ENTER_SVC();                    /* %jp{enter service-call}%jp{サービスコールに入る} */
36                 
37         /* %jp{オブジェクト存在チェック} */
38 #ifdef _KERNEL_SPT_SUS_TSK_E_NOEXS
39         if ( _KERNEL_TSK_CHECK_EXS(tskid) )
40         {
41                 _KERNEL_LEAVE_SVC();            /* %jp{leave service-call}%jp{サービスコールを出る} */
42                 return E_NOEXS;                         /* %jp{オブジェクト未生成} */
43         }
44 #endif
45
46         /* ID番号指定時の変換 */
47         tskhdl = _KERNEL_TSK_ID2TSKHDL(tskid);
48         
49         /* %jp{コントロールブロック取得} */
50         tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
51
52         /* %jp{タスク状態取得} */
53         tskstat = _KERNEL_TSK_GET_TSKSTAT(tcb);
54         if ( !(tskstat & _KERNEL_TTS_SUS) )
55         {
56                 _KERNEL_LEAVE_SVC();            /* %jp{leave service-call}%jp{サービスコールを出る} */
57                 return E_OBJ;                           
58         }
59
60         suscnt = _KERNEL_TSK_GET_SUSCNT(tcb);
61         if ( suscnt > 0 )
62         {
63                 _KERNEL_TSK_SET_SUSCNT(tcb, suscnt - 1);
64         }
65         else
66         {
67                 _KERNEL_DSP_RSM_TSK(tskhdl);                    /* %jp{タスクの強制待ち解除} */
68
69                 _KERNEL_DSP_TSK();
70         }
71
72         _KERNEL_LEAVE_SVC();    /* %jp{サービスコール終了} */
73
74         return E_OK;
75 }
76
77
78 #else   /* _KERNEL_SPT_RSM_TSK */
79
80
81 #if _KERNEL_SPT_RSM_TSK_E_NOSPT
82
83 ER rsm_tsk(
84                 ID tskid)
85 {
86         return E_NOSPT;
87 }
88
89 #endif
90
91
92 #endif
93
94
95 /* end of file */