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;
}