Я пытаюсь реализовать планировщик, который вызывает мои собственные реализации библиотеки pthread (create, join, et c). Планировщик запускается интервальным таймером, а также, если приложение вызывает mythread_yield()
. Проблема, с которой я сталкиваюсь, заключается в том, что переключение контекста из функции mythread_yield()
в мой планировщик, а затем попытка вернуться назад не работает. Каждый раз, когда я переключаю контекст назад, он начинается в начале моей print3
функции, а не в той строке, где она называется mythread_yield()
schedule_context
- глобальная переменная.
mythread_yield ()
int mythread_yield() {
Node* p = pop_front(&head);
p->thread_info.status = READY;
push_tail(&head, &p->thread_info);
swapcontext(&(p->thread_info.context), &schedule_context);
return 0;
}
myscheduler
static void myscheduler(void) {
if (head == NULL) {
return;
}
head->thread_info.status = RUNNING;
current_thread_id = head->thread_info.id;
//this is where I attempt to context swap back to my thread's function
swapcontext(&tmp, &head->thread_info.context);
}
print3
void *print3(void* args) {
printf("3\n"); //always starts back here instead of at mythread_yield
unsigned int sum=0;
int i=0;
for(; i < 10000; i++) {
sum += i;
if (i == 5000) {
mythread_yield();
}
}
printf("3: sum = %d\n", sum);
}