int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);
如果我的理解是正确的,交换上下文相当于首先在 oucp 上调用 getcontext,然后在 ucp 上调用 setcontext。我正在尝试了解如何使用 getcontext 和 setcontext 实现交换上下文。
int swapcontext(ucontext_t *oucp, ucontext_t *ucp)
{
getcontext(oucp);
setcontext(ucp);
}
问题是 oucp 的上下文在错误的行,我想以一种方式调用 getcontext,使得下一行是 setcontext(ucp) 之后的行。但是,setcontext 不会返回,所以我不能这样做。此外,如果我以这种方式实现交换上下文,如果我将相同的参数传递给 oucp 和 ucp,我就会卡住。
如何使用这两个函数实现交换上下文?还是不可能?
这里有一种方法可以做到这一点。这个想法是在第一次调用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;
}
复习考试时遇到了这个问题!只是一个在交换回旧上下文时增加计数的想法。
int swapcontext(ucontext_t* old_ucp, ucontext_t* new_ucp) {
volatile int count = 0;
getcontext(old_ucp);
count++;
if (count == 1) {
setcontext(new_ucp);
/* Unsuccessful? return -1 */
return -1;
}
if (count == 2) {
/* The saved context is restored, return 0 */
return 0;
}
}