Реализация swapcontext с точки зрения getcontext и setcontext

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, используя эти две функции? Или это невозможно?

0

Решение

Вот один из способов сделать это. Идея состоит в том, чтобы установить логическую переменную, когда 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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]