OSDN Git Service

(none)
[hos/hos-v4a.git] / kernel / source / object / sem / pol_sem.c
1 /** 
2  *  Hyper Operating System V4 Advance
3  *
4  * @file  pol_sem.c
5  * @brief %jp{セマフォ資源の獲得(ポーリング)}%en{Acquire Semaphore Resource(Polling)}
6  *
7  * @version $Id: pol_sem.c,v 1.2 2006-09-02 10:43:19 ryuz Exp $
8  *
9  * Copyright (C) 1998-2006 by Project HOS
10  * http://sourceforge.jp/projects/hos/
11  */
12
13
14
15 #include "core/core.h"
16 #include "object/semobj.h"
17
18
19
20 #if _KERNEL_SPT_POL_SEM
21
22
23 #if _KERNEL_SPT_TWAI_SEM && (_KERNEL_OPT_CODE_SIZE <= _KERNEL_OPT_SPEED)        /* %jp{twai_semありで、サイズ優先なら} */
24
25 /** %jp{セマフォ資源の獲得(ポーリング)}%en{Acquire Semaphore Resource(Polling)}
26  * @param  semid    %jp{資源獲得対象のセマフォID番号}%en{ID number of the semaphore from which resource is acquired}
27  * @retval E_OK     %jp{正常終了}%en{Normal completion}
28  * @retval E_ID     %jp{不正ID番号(semidが不正あるいは使用できない)}%en{Invalid ID number(semid is invalid or unusable)}
29  * @retval E_NOEXS  %jp{オブジェクト未生成(対象セマフォが未登録)}%en{Non-existant object(specified semaphore is not registerd)}
30  * @retval E_TMOUT  %jp{ポーリング失敗}%en{Polling failure}
31  */
32 ER pol_sem(ID semid)
33 {
34         /* %jp{pol_semやtwai_semと共通処理とする} */
35         return _kernel_wai_sem(semid, TMO_POL);
36 }
37
38 #else
39
40 /** %jp{セマフォ資源の獲得(ポーリング)}%en{Acquire Semaphore Resource(Polling)}
41  * @param  semid    %jp{資源獲得対象のセマフォID番号}%en{ID number of the semaphore from which resource is acquired}
42  * @retval E_OK     %jp{正常終了}%en{Normal completion}
43  * @retval E_ID     %jp{不正ID番号(semidが不正あるいは使用できない)}%en{Invalid ID number(semid is invalid or unusable)}
44  * @retval E_NOEXS  %jp{オブジェクト未生成(対象セマフォが未登録)}%en{Non-existant object(specified semaphore is not registerd)}
45  * @retval E_TMOUT  %jp{ポーリング失敗}%en{Polling failure}
46  */
47 ER pol_sem(ID semid)
48 {
49         _KERNEL_T_SEMCB_PTR  semcb;
50         _KERNEL_SEM_T_SEMCNT semcnt;
51         ER                   ercd;
52         
53         /* %jp{ID のチェック} */
54 #if _KERNEL_SPT_POL_SEM_E_ID
55         if ( !_KERNEL_SEM_CHECK_SEMID(semid) )
56         {
57                 return E_ID;    /* %jp{不正ID番号}%en{Invalid ID number} */
58         }
59 #endif
60         
61         _KERNEL_ENTER_SVC();            /* %jp{サービスコールに入る}%en{enter service-call} */
62         
63         /* %jp{オブジェクト存在チェック} */
64 #if _KERNEL_SPT_POL_SEM_E_NOEXS
65         if ( !_KERNEL_SEM_CHECK_EXS(semid) )
66         {
67                 _KERNEL_LEAVE_SVC();    /* %jp{サービスコールから出る}%en{leave service-call} */
68                 return E_NOEXS;                 /* %jp{オブジェクト未生成}%en{Non-existant object} */
69         }
70 #endif
71
72         /* %jp{セマフォコントロールブロック取得} */
73         semcb = _KERNEL_SEM_ID2SEMCB(semid);
74         
75         /* %jp{セマフォカウンタ取得} */
76         semcnt = _KERNEL_SEM_GET_SEMCNT(semcb);
77
78         /* %jp{資源数チェック} */
79         if ( semcnt > 0 ) 
80         {
81                 /* %jp{セマフォ資源が獲得} */
82                 _KERNEL_SEM_SET_SEMCNT(semcb, semcnt - 1);              /* %jp{セマフォ資源の獲得} */
83                 ercd = E_OK;
84         }
85         else
86         {
87                 ercd = E_TMOUT;
88         }
89         
90         
91         _KERNEL_LEAVE_SVC();    /* %jp{サービスコールから出る}%en{leave service-call} */
92         
93         return ercd;
94 }
95
96 #endif
97
98
99 #else   /* _KERNEL_SPT_POL_SEM */
100
101
102 #if _KERNEL_SPT_POL_SEM_E_NOSPT
103
104 /** %jp{セマフォ資源の獲得(ポーリング)}%en{Acquire Semaphore Resource(Polling)}
105  * @param  semid    %jp{資源獲得対象のセマフォID番号}%en{ID number of the semaphore from which resource is acquired}
106  * @retval E_NOSPT  %jp{未サポート機能}%en{Unsupported function}
107  */
108 ER wai_sem(ID semid)
109 {
110         return E_NOSPT;
111 }
112
113 #endif
114
115
116 #endif  /* _KERNEL_SPT_POL_SEM */
117
118
119
120 /* end of file */