[Mona] 割り込み待ち関数

全然関係ないですが、広告のクリック率があがってちょっぴりうれしい。


先日作ったタイマーAPIのset_timer/kill_timerを利用して、タイムアウトつきの割り込み待ち関数を作成・実験。
タイムアウトつきの割り込み待ち関数とは、「一定時間割り込みを待ち、時間内に割り込みがない場合はエラーを返す関数」です。
この関数はドライバの実装で使用します。
通常であれば割り込みがくると想定していい場面にも関わらず、何かの拍子に割り込みがこない場合もあるのでタイムアウトを設定するというわけです。
これをIDEDriver, FDCDriverに組み込む予定。


ちなみにプロトタイプ実装はこんな感じ。てきとうだなぁ・・・(;´Д`)

#define WAIT_INTERRUPT(ms, irq) WaitInterruptWithTimeout(ms, irq, __FILE__, __LINE__)

bool WaitInterruptWithTimeout(dword ms, byte irq, const char* file, int line)
{
    MessageInfo msg;

    dword timerId = set_timer(ms);

    for (int i = 0; ; i++)
    {
        int result = Message::peek(&msg, i);

        if (result != 0)
        {
            i--;
            syscall_mthread_yield_message();
        }
        else if (msg.header == MSG_TIMER)
        {
            if (msg.arg1 != timerId) continue;
            kill_timer(timerId);

            Message::peek(&msg, i, PEEK_REMOVE);

            printf("interrupt timeout %s:%d\n", file, line);
            return false;
        }
        else if (msg.header == MSG_INTERRUPTED)
        {
            if (msg.arg1 != irq) continue;
            kill_timer(timerId);

            Message::peek(&msg, i, PEEK_REMOVE);
            return true;
        }
    }
    return false;
}