-
Notifications
You must be signed in to change notification settings - Fork 228
ДЗ Кооперативная многозадачность
Цель задания - написать движок для выполнения функций в режиме кооперативной многозадачности
Программа минимум - научиться переключаться между 2 функция во время их выполнения в рамках одного потока.
Реализовать переключение между функциями через управление слепком регистров, нам понадобятся функции setjmp
и longjmp
, описание работы которых можно найти в man
.
Для начала работы движок должен быть инициализирован. Во время этого создается самая первая корутина, которая может запустить какое угодно количество других. Для того, чтоб пользовательский код мог управлять процессом передачи управления, при создании корутины движок возвращает ее дескриптор как void *
.
Интерфейс движка опеределен в include/afina/coroutine/Engine.h
:
-
context - прозрачна структура, которая хранит в себе все данные нужные для сохранения и восстановления задачи
-
StackBottom - адрес в стэке, начиная с которого функции являются кооперативными
-
Store(context &) - сохраняет текущее состояние в заданный контекст
-
Restore (context &) - восстанавливает заданный контекст исполнения. Функция никогда не возвращается, вместо этого начинает исполняться код заданных данным контекстом
-
start(...) - запускает движок, создавая самую первую корутину
-
yield() - находит какую-то задачу, не являющуюся текущей и запускает ее. Если такой задачи не существует, то функция ничего не делает. Может быть вызвана только из корутины
-
sched(void *routine) - останавливает текущую задачу и запускает ту, которая заданна аргументом. Может быть вызвана только из корутины
-
run(...) - создает новую корутину, но не запускает ее, вызывающий код должен вызвать sched/yield для того, чтобы начать исполнение новой задачи
Реализация функция должна быть написана в src/coroutine/Engine.cpp
Базовые тесты находятся в test/coroutine/EngineTest.cpp
и собиратся/запускаются как runCoroutineTests