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?或者是不可能的?
答案 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;
}