根据getcontext和setcontext实现swapcontext

时间:2013-10-19 17:38:21

标签: c++ c ucontext

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的上下文是在错误的行,我想以一种方式调用getcontext,使得下一行是setcontext(ucp)之后的行。但是,setcontext没有返回,所以我不能这样做。此外,如果我以这种方式实现swapcontext,如果我将相同的参数传递给oucp和ucp,我将被卡住。

如何使用这两个函数实现swapcontext?或者是不可能的?

1 个答案:

答案 0 :(得分:1)

这是一种方法。我们的想法是在第一次调用setcontext()时设置一个布尔变量,这样第二次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;
}