cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
88 stars 0 forks source link

Сохранение/переключения контекста выполнения #472

Open night-beast opened 3 years ago

night-beast commented 3 years ago

Для реализации stackful корутин нужно иметь возможность сохранять/переключать контекст выполнения.

В POSIX для этого были функции makecontext/swapcontext но на текущий момент они deprecated Есть реализация под Unix https://github.com/kaniini/libucontext, а так же платформонезависимая реализация в Boost.context

Хотелось бы иметь такую базовую вещь в стандарте

stsp commented 10 months ago

Поскольку в вышеозначенной либе уже есть отличия от позикса (не сохраняется маска сигналов), предлагаю ввести ещё одно улучшение. А именно, чтобы getcontex() сохранял единичку в регистре результата ($rax например). Тогда, после переключения на такой контекст, getcontext() вернёт 1, вместо 0. Это по аналогии с лонгждампами. Удобство, как минимум, в том, что swapcontext() тогда не обязан быть на асме, а может выглядеть вот так: https://github.com/dosemu2/dosemu2/blob/devel/src/base/lib/mcontext/context.c#L49-L54

int swapmcontext(m_ucontext_t *oucp, const m_ucontext_t *ucp)
{
    if(getmcontext(oucp) == 0)
        setmcontext(ucp);
    return 0;
}