ideas icon indicating copy to clipboard operation
ideas copied to clipboard

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

Open night-beast opened this issue 4 years ago • 1 comments

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

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

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

night-beast avatar Aug 07 '21 19:08 night-beast

Поскольку в вышеозначенной либе уже есть отличия от позикса (не сохраняется маска сигналов), предлагаю ввести ещё одно улучшение. А именно, чтобы 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;
}

stsp avatar Nov 21 '23 11:11 stsp