Open night-beast opened 3 years 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;
}
Для реализации stackful корутин нужно иметь возможность сохранять/переключать контекст выполнения.
В POSIX для этого были функции makecontext/swapcontext но на текущий момент они deprecated Есть реализация под Unix https://github.com/kaniini/libucontext, а так же платформонезависимая реализация в Boost.context
Хотелось бы иметь такую базовую вещь в стандарте