1
int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);

私の理解が正しければ、swapcontext は、最初に oucp で getcontext を呼び出し、次に ucp で setcontext を呼び出すことと同じです。getcontext と setcontext を使用して swapcontext を実装する方法を確認しようとしています。

int swapcontext(ucontext_t *oucp, ucontext_t *ucp)  
{  
    getcontext(oucp);  
    setcontext(ucp);  
}

問題は、oucp のコンテキストが間違った行にあることです。次の行が setcontext(ucp) の次の行になるように getcontext を呼び出したいと考えています。ただし、 setcontext は返されないため、それはできません。さらに、この方法で swapcontext を実装すると、oucp と ucp に同じ引数を渡すとスタックしてしまいます。

これら 2 つの関数を使用して swapcontext を実装するにはどうすればよいでしょうか。それとも無理ですか?

4

1 に答える 1

3

これを行う1つの方法を次に示します。setcontext()が最初に呼び出されたときにブール変数を設定して、2 回目getcontext()に戻ったときにsetcontext()呼び出しをスキップできるようにするという考え方です。

int swapcontext(ucontext_t *oucp, ucontext_t *ucp) {
    volatile bool swapped = false;
    int result = getcontext(oucp);
    if (result == 0 && !swapped) {
        swapped = true;
        result = setcontext(ucp);
    }

    return result;
}
于 2013-10-22T16:42:25.537 に答える