English
PROGRAMMER'S GUIDEファイルシステムライブラリ
戻る進む
ファイルシステムライブラリ

5.アクセス方式


 本ライブラリで提供するアクセス方式には以下の二通りがあります。

5.1 完了復帰型アクセス

 完了復帰型アクセスは、標準Cライブラリのファイルアクセス関数に近い方式です。
 完了復帰型アクセスのプログラム例を以下に示します。

[例]
#define BUF_SIZE 2048

GfsHn gfs; /* ファイルハンドル  */ Sint32 fid; /* ファイル識別子   */ Sint32 nsct = 1; /* 読み込みセクタ数  */ Uint32 buf[BUF_SIZE/4]; /* 読み込み領域    */ gfs = GFS_Open(fid); /* ファイルオープン   */ GFS_Fread(gfs, nsct, buf, BUF_SIZE); /* bufにnsctセクタ読み込む  */ GFS_Close(gfs); /* ファイルクローズ   */

5.2 即時復帰型アクセス

 即時復帰型アクセスは、リクエスト関数とサーバ関数を用いて行われます。リクエスト関数は、リクエスト受け付け処理のみを実行して、即時復帰します。入力の完了状態を監視しながら、サーバ関数を繰り返し呼び出すことで実際のアクセス処理が行われます。サーバ関数の呼び出しループの中でアプリケーションの処理を行うこともできます。一度リクエストを発行したファイルハンドルに対しては、そのアクセス処理が終了するまでリクエストを発行できません。

 (1)単数ファイルに対する即時復帰型アクセス
 単数ファイルのアクセスでは、GFS_NwExecOneがサーバ関数です。
 一つのファイルを即時復帰型でアクセスするプログラム例を以下に示します。この例ではGFS_NwFreadがリクエスト関数です。

例]
#define BUF_SIZE  2048*2

GfsHn gfs;                              /* ファイルハンドル         */
Sint32 nsct = 2;                        /* 読み込みセクタ数         */
Sint32 stat;                            /* サーバの状態           */
Uint32 buf[BUF_SIZE/4];                 /* 読込み領域            */

gfs = GFS_Open(fid);                    /* ファイルオープン         */
/* リクエスト関数     */
GFS_NwFread(gfs, nsct, buf, BUF_SIZE);  /* bufにnsctセクタ読み込む  */
                                        /* 即時復帰する           */

for (;;) {
     /* サーバ関数     */
     stat = GFS_NwExecOne(gfs);         /* 読み込みの実行          */
     if (stat == GFS_SVR_COMPLETED) {   /* 読み込み完了か ?         */
          break;
     }
     user();                            /* 任意のユーザ処理         */
}

GFS_Close(gfs); /* ファイルクローズ   */

 (2)複数ファイルに対する即時復帰型アクセス
 複数ファイルの連続アクセスでは、GFS_NwExecSererがサーバ関数となります。
 リクエスト関数は単数ファイルのアクセスと共通です。
 アプリケーションは、複数のファイルに対し、アクセス処理のリクエストを発行します。その後、定期的にサーバに制御権を渡すことによって、アクセス処理が順次実行されます。アクセス処理はリクエストがあった順に一つずつ行われます。
 三つのファイルを読み込みながら、ユーザ処理を行うプログラム例を次に示します。

[例]
/* 各ファイルからの読み込みセクタ数 */
#define NSCT1  1
#define NSCT2  2
#define NSCT3  3

/* 各ファイルのデータ格納領域の大きさ(単位はバイト) */
#define BSIZE1 2048*NSCT1
#define BSIZE2 2048*NSCT2
#define BSIZE3 2048*NSCT3

Sint32 fid1, fid2, fid3; /* 各ファイルのファイル識別子  */ GfsHn gfs1, gfs2, gfs3; /* 各ファイルのファイルハンドル */ Uint32 buf1[BSIZE1/4]; /* 各ファイルのデータ格納領域  */ Uint32 buf2[BSIZE2/4]; Uint32 buf3[BSIZE3/4]; GfsHn now_gfs; /* アクセス中のファイルハンドル */ Sint32 stat; /* サーバの状態         */ gfs1 = GFS_Open(fid1); /* ファイルオープン       */ gfs2 = GFS_Open(fid2); gfs3 = GFS_Open(fid3); GFS_NwFread(gfs1, NSCT1, buf1, BSIZE1); /* 読み込み動作の開始      */ GFS_NwFread(gfs2, NSCT2, buf2, BSIZE2); GFS_NwFread(gfs3, NSCT3, buf3, BSIZE3); for (;;) { stat = GFS_NwExecServer(&now_gfs); /* 読み込みの実行        */ if (stat == GFS_SVR_COMPLETED) { /* 実行する仕事がないか?    */ break; } user(); /* 任意のユーザ処理       */ } GFS_Close(gfs1); GFS_Close(gfs2); GFS_Close(gfs3);

 (3) CDバッファへの先読み
 大きなファイルを少しずつ連続して読み込むときには、GFS_NwCdReadでCDバッファへの先読みを指定すると、CDの読みとり速度を最大限に活かすことができます。
 次に示すプログラム例では1000セクタのファイルを10セクタずつ連続して読み込みます。GFS_NwCdReadで1000セクタ先読みするよう指定しているので、目的のファイルが1000セクタ連続して再生され、バッファに格納されます。この処理と並行してCDバッファからデータを取り出しているので、バッファフルにならず、再生は中断されません。
 この例で行っている処理を先読みを使わずに行うと、CD再生が10セクタごとに中断されるため、無駄な時間が発生します。

[例]
#define SECT_SIZE    2048
#define FILE_SECT     1000
#define FILE_SIZE     (FILE_SECT*SECT_SIZE)
#define RD_UNIT       10

Uint8 *rd_bp, *proc_bp;            /* 読み込みバッファと処理バッファ        */
Uint32 buf1[RD_UNIT*SECT_SIZE/4];  /* データ格納領域1               */
Uint32 buf2[RD_UNIT*SECT_SIZE/4];  /* データ格納領域2               */
GfsHn gfs;
Sint32 i, stat, nbyte;

gfs = GFS_Open(fid); GFS_NwCdRead(gfs, FILE_SECT); /* CDバッファへの先読み指示    */ GFS_SetTransPara(gfs, RD_UNIT); /* 最大RD_UNITセクタ1度に取り出す    */ for (i = 0; i < FILE_SECT / RD_UNIT; ++i) { /* 読み込み、処理バッファの設定 */ if (i & 1) { rd_bp = buf1; proc_bp = buf2; } else { rd_bp = buf2; proc_bp = buf1; } /* CDバッファからの取り出し実行 */ GFS_NwFread(gfs, RD_UNIT, rd_bp, RD_UNIT * SECT_SIZE); do { if (i & 0) { user_process(proc_bp); /* 読み込んだデータに対する処理     */ } else { user_process0(); /* データが読み込まれる前の処理     */ } GFS_NwExecOne(gfs); GFS_NwGetStat(gfs, &stat, &nbyte); }while (nbyte < RD_UNIT * SECT_SIZE); }


戻る進む
PROGRAMMER'S GUIDEファイルシステムライブラリ
Copyright SEGA ENTERPRISES, LTD., 1997