根据getcontext和setcontext实现交换上下文

Implementing swapcontext in terms of getcontext and setcontext

本文关键字:交换 上下文 实现 setcontext getcontext 根据      更新时间:2023-10-16
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;
  }
}