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

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

Теги:
ucontext

1 ответ

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню