OSDN Git Service

(none)
[hos/hos-v4a.git] / aplfw / system / file / chrdrv_waitwritesignal.c
1 /** 
2  *  Hyper Operating System  Application Framework
3  *
4  * @file  chrfile.h
5  * @brief %jp{キャラクタ型デバイスドライバ用ファイルディスクリプタ}
6  *
7  * %jp{ファイルディスクリプタとして機能するクラス}
8  *
9  * Copyright (C) 2006-2007 by Project HOS
10  * http://sourceforge.jp/projects/hos/
11  */
12
13
14
15 #include "chrdrv_local.h"
16
17
18 /** 書込み可能になった可能性があるまで待つ */
19 FILE_ERR ChrDrv_WaitWriteSignal(C_CHRDRV *self, C_CHRFILE *pFile)
20 {
21         SYSPRC_HANDLE   hPrc;
22
23         SysMtx_Lock(self->hMtx);        /* クリティカルセクションに入る */
24         
25         /* ファイルモードチェック */
26         if ( (pFile->cWriteMode & FILE_WMODE_POLING) || pFile->hPrcWrite != SYSPRC_HANDLE_NULL )
27         {
28                 SysMtx_Unlock(self->hMtx);      /* クリティカルセクションを出る */
29                 return FILE_ERR_NG;                     /* ポーリングモードならブロックしない */
30         }
31
32         /* 状態チェック */
33         if ( self->iStatus & CHRDRV_STATUS_WRITE )
34         {
35                 SysMtx_Unlock(self->hMtx);      /* クリティカルセクションを出る */
36                 return FILE_ERR_OK;                     /* 即時成功 */
37         }
38
39         /* 自プロセス取得 */
40         hPrc = SysPrc_GetCurrentHandle();
41         
42         /* 待ちタスク登録 */
43         pFile->hPrcWrite = hPrc;
44         
45         SysMtx_Unlock(self->hMtx);      /* クリティカルセクションを出る */
46         
47         /* 待ちに入る */
48         SysPrc_Suspend(hPrc);
49         
50         return FILE_ERR_OK;
51 }
52
53
54
55 /* end of file */