int swapcontext(ucontext_t *oucp, ucontext_t *ucp);
int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);
Если мое понимание верно, swapcontext эквивалентен первому вызову getcontext в oucp, а затем вызову setcontext в ucp. Я пытаюсь увидеть, как я мог бы реализовать swapcontext с getcontext и setcontext.
int swapcontext(ucontext_t *oucp, ucontext_t *ucp)
{
getcontext(oucp);
setcontext(ucp);
}
Проблема в том, что контекст oucp находится не в той строке, я хочу вызвать getcontext таким образом, чтобы следующая строка была строкой после setcontext (ucp). Однако setcontext не возвращается, поэтому я не могу этого сделать. Более того, если я реализую swapcontext таким образом, если я передам те же аргументы в oucp и ucp, я застряну.
Как реализовать swapcontext, используя эти две функции? Или это невозможно?
Вот один из способов сделать это. Идея состоит в том, чтобы установить логическую переменную, когда 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;
}
Других решений пока нет …