Реализация pthread API с использованием контекстов - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь реализовать планировщик, который вызывает мои собственные реализации библиотеки 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...