2 * Hyper Operating System V4 Advance
5 * @brief %jp{セマフォ資源の獲得(ポーリング)}%en{Acquire Semaphore Resource(Polling)}
7 * @version $Id: pol_sem.c,v 1.2 2006-09-02 10:43:19 ryuz Exp $
9 * Copyright (C) 1998-2006 by Project HOS
10 * http://sourceforge.jp/projects/hos/
15 #include "core/core.h"
16 #include "object/semobj.h"
20 #if _KERNEL_SPT_POL_SEM
23 #if _KERNEL_SPT_TWAI_SEM && (_KERNEL_OPT_CODE_SIZE <= _KERNEL_OPT_SPEED) /* %jp{twai_semありで、サイズ優先なら} */
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}
34 /* %jp{pol_semやtwai_semと共通処理とする} */
35 return _kernel_wai_sem(semid, TMO_POL);
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}
49 _KERNEL_T_SEMCB_PTR semcb;
50 _KERNEL_SEM_T_SEMCNT semcnt;
54 #if _KERNEL_SPT_POL_SEM_E_ID
55 if ( !_KERNEL_SEM_CHECK_SEMID(semid) )
57 return E_ID; /* %jp{不正ID番号}%en{Invalid ID number} */
61 _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */
63 /* %jp{オブジェクト存在チェック} */
64 #if _KERNEL_SPT_POL_SEM_E_NOEXS
65 if ( !_KERNEL_SEM_CHECK_EXS(semid) )
67 _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */
68 return E_NOEXS; /* %jp{オブジェクト未生成}%en{Non-existant object} */
72 /* %jp{セマフォコントロールブロック取得} */
73 semcb = _KERNEL_SEM_ID2SEMCB(semid);
76 semcnt = _KERNEL_SEM_GET_SEMCNT(semcb);
82 _KERNEL_SEM_SET_SEMCNT(semcb, semcnt - 1); /* %jp{セマフォ資源の獲得} */
91 _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */
99 #else /* _KERNEL_SPT_POL_SEM */
102 #if _KERNEL_SPT_POL_SEM_E_NOSPT
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}
116 #endif /* _KERNEL_SPT_POL_SEM */