第2回 仕様と実際の処理を考える(前編)
この文章は、OS-9000/80386(OS-9/x86)およびOS-9/PowerPCに対応しています。
ここで制作するOS-9000用のファイルマネージャの機能を考えます。
OS-9000に標準で付いてくるファイルマネージャとしてはSCF、RBF、SBFなどがありますが、ちょっとしたI/Oデバイスを扱うにはちょっと大袈裟すぎます。そこで、ここで制作するファイルマネージャはおもいっきり低機能にして処理の殆どをデバイスドライバに任せる事を前提に設計してみます。
また、デバイスドライバをOS-9/68K風に作成できれば楽できそうなので、デバイスドライバを呼び出す部分はOS-9/68Kにある程度似せてみようと思います。
では、まず必要な機能を考えてみます。低機能だと銘打っていますので、RBFのようなマルチファイルはサポートしません。従ってこれに関する階層ディレクトリに関する処理は不要になります。また、ファイルの作成や削除などについても僅かな処理で済むようになります。
ファイルマネージャの各エントリ毎に必要な処理を考えます。
Attach
デバイスの初期化の為に呼び出されますので、必ずインプリメントしなければなりません。
以下の処理を行います。
- 既にAttachされているかチェックします。
- 既にAttachされている場合は使用カウントを+1して戻り値0でリターンします。
- 初めてAttachされる場合以下の処理を行います。
- デバイスドライバのスタティックストレージを初期化します。
- リソースロックを作成します。
- デバイスをロックします。
- デバイスドライバのスタティックストレージに切り替えます。
- デバイスドライバのInitエントリを呼び出します。
- ファイルマネージャのスタティックストレージに切り替えます。
- デバイスのロックを解除します。
- 使用カウントを1にします。
- デバイスドライバの返した戻り値でリターンします。
Chdir
階層ディレクトリをサポートしないので、この機能はインプリメントしません。E_UNKSVCを返します。
Close
パスがクローズされた事をデバイスドライバへ通知するために以下の処理を行います。
- パスディスクリプタの使用カウンタを調べます。
- 使用カウンタが2以上なら戻り値0でリターンします。
- 使用カウンタが1以下なら以下の処理を行います。
- デバイスドライバにSetStatエントリが有るか調べます。
- SetStatエントリが無ければ戻り値0でリターンします。
- SetStatエントリが有れば以下の処理を行います
- デバイスをロックします。
- デバイスドライバのスタティックストレージに切り替えます。
- パラメタにSS_CLOSEを指定してSetStatエントリを呼び出します。
- ファイルマネージャのスタティックストレージに切り替えます。
- デバイスのロックを解除します。
- デバイスドライバが返した戻り値がE_UNKSVCの場合は戻り値0でリターンします。
- デバイスドライバが返した戻り値がE_UNKSVC以外の場合はその値でリターンします。
Create
マルチファイルをサポートしないので、Openと同じ処理を行います。
Delete
マルチファイルをサポートしないので、インプリメントしません。E_UNKSVCを返します。
Detach
デバイスの後始末の為に呼び出されますので、必ずインプリメントしなければなりません。
以下の処理を行います。
- 使用カウントを-1します。
- 使用カウントが0にならなければ戻り値0でリターンします。
- 使用カウントが0になったら以下の処理を行います。
- デバイスをロックします。
- デバイスドライバのスタティックストレージに切り替えます。
- デバイスドライバのTerminateエントリを呼び出します。
- ファイルマネージャのスタティックストレージに切り替えます。
- デバイスのロックを解除します。
- リソースロックを破棄します。
- デバイスドライバが返した戻り値でリターンします。
Dup
特に処理を行いません。戻り値0でリターンします。
Getstat
機能が低い分ドライバに依存するので、Getstatはきちんとサポートする必要があります。ここの機能については後で考えます。
Makdir
階層ディレクトリはサポートしないので、この機能はインプリメントしません。E_UNKSVCを返します。
Open
パスがオープンされた事をデバイスドライバへ通知するために以下の処理を行います。
- デバイスドライバにSetStatエントリが有るか調べます。
- SetStatエントリが無ければ戻り値0でリターンします。
- SetStatエントリが有った場合は以下の処理を行います。
- デバイスをロックします。
- デバイスドライバのスタティックストレージに切り替えます。
- パラメタにSS_OPENを指定してSetStatエントリを呼び出します。
- ファイルマネージャのスタティックストレージに切り替えます。
- デバイスのロックを解除します。
- デバイスドライバが返した戻り値でリターンします。
Read
この機能はデバイスドライバに任せます。ファイルマネージャでは以下の処理を行います。
- デバイスドライバにReadエントリが有るか調べます。
- Readエントリが無ければE_UNKSVCでリターンします。
- Readエントリが有れば以下の処理を行います。
- デバイスをロックします。
- デバイスドライバのスタティックストレージに切り替えます。
- デバイスドライバのReadエントリを呼び出します。
- ファイルマネージャのスタティックストレージに切り替えます。
- デバイスのロックを解除します。
- デバイスドライバが返した戻り値でリターンします。
Readln
行編集機能はサポートしないのでReadと同様の処理を行います。
Seek
この機能はサポートしません。ただし、エラーを返すと問題の発生するアプリケーションがあるかもしれないので、戻り値0でリターンします。
Setstat
機能が低い分ドライバに依存するので、Setstatはきちんとサポートする必要があります。ここの機能については後で考えます。
Write
この機能はデバイスドライバに任せます。ファイルマネージャでは以下の処理を行います。
- デバイスドライバにWriteエントリが有るか調べます。
- Writeエントリが無ければE_UNKSVCでリターンします。
- Writeエントリが有れば以下の処理を行います。
- デバイスをロックします。
- デバイスドライバのスタティックストレージに切り替えます。
- デバイスドライバのWriteエントリを呼び出します。
- ファイルマネージャのスタティックストレージに切り替えます。
- デバイスのロックを解除します。
- デバイスドライバが返した値でリターンします。
Writeln
行編集機能はサポートしないのでWriteと同様の処理を行います。