From dafaba7407d1d82d82be38ec2c47da9dea357132 Mon Sep 17 00:00:00 2001 From: Mathieu Maret Date: Fri, 24 Apr 2020 23:34:34 +0200 Subject: [PATCH] kthread implement yield --- core/kthread.c | 36 +++++++++++++++++++++++++++++------- core/kthread.h | 7 +++---- tests/test.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/core/kthread.c b/core/kthread.c index 69fb4c7..fce5417 100644 --- a/core/kthread.c +++ b/core/kthread.c @@ -1,19 +1,25 @@ -#include "assert.h" #include "kthread.h" -#include "list.h" #include "alloc.h" +#include "assert.h" +#include "irq.h" #include "klibc.h" +#include "list.h" #include "vga.h" static struct kthread *currentThread; -void kthreadExit(){ +void kthreadExit() +{ + uint32_t flags; + disable_IRQs(flags); struct kthread *current = currentThread; - struct kthread *next = kthreadSelectNext(); + struct kthread *next = kthreadSelectNext(); if (next == current) assert("cannot exit thread"); currentThread = next; - cpu_context_exit_to(next->cpuState, (cpu_kstate_function_arg1_t *)kthreadDelete, (uint32_t)current); + cpu_context_exit_to(next->cpuState, (cpu_kstate_function_arg1_t *)kthreadDelete, + (uint32_t)current); + restore_IRQs(flags); return; } @@ -71,10 +77,26 @@ struct kthread *kthreadSelectNext(){ return nextThread; } -struct cpu_state *switchKthread(struct cpu_state *prevCpu){ - currentThread->cpuState = prevCpu; +struct cpu_state *switchKthread(struct cpu_state *prevCpu) +{ + uint32_t flags; + disable_IRQs(flags); + currentThread->cpuState = prevCpu; struct kthread *nextThread = kthreadSelectNext(); printStringDetails(nextThread->name, RED, BLACK, 40, VGA_HEIGHT - 1); currentThread = nextThread; + restore_IRQs(flags); return nextThread->cpuState; } + +int kthreadYield() +{ + uint32_t flags; + disable_IRQs(flags); + struct kthread *next = kthreadSelectNext(); + struct kthread *current = currentThread; + currentThread = next; + cpu_context_switch(¤t->cpuState, next->cpuState); + restore_IRQs(flags); + return 0; +} diff --git a/core/kthread.h b/core/kthread.h index 60183f7..128bb8f 100644 --- a/core/kthread.h +++ b/core/kthread.h @@ -15,14 +15,13 @@ struct kthread { struct kthread *prev; }; - int kthreadSetup(vaddr_t mainStack, size_t mainStackSize); void kthreadExit(); -struct kthread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, - void *args); - +struct kthread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, void *args); void kthreadDelete(struct kthread *thread); struct kthread *kthreadSelectNext(); struct cpu_state *switchKthread(struct cpu_state *prevCpu); + +int kthreadYield(); diff --git a/tests/test.c b/tests/test.c index 17ffc57..c970349 100644 --- a/tests/test.c +++ b/tests/test.c @@ -2,6 +2,7 @@ #include "assert.h" #include "cpu_context.h" #include "klibc.h" +#include "kthread.h" #include "list.h" #include "mem.h" #include "paging.h" @@ -217,6 +218,32 @@ void testCoroutine() printf("Back in main !\n"); } +static void kthread1(void *strIn) +{ + char *str = (char *)strIn; + printf("\nkth1: %s\n", (char *)strIn); + for (; *str != '\n'; str++) { + printf("kth1_: %c\n", *str); + kthreadYield(); + } +} + +static void kthread2(void *strIn) +{ + char *str = (char *)strIn; + printf("\nkth2: %s\n", (char *)strIn); + for (; *str != '\n'; str++) { + printf("kth2_: %c\n", *str); + kthreadYield(); + } +} + +void testKthread() +{ + kthreadCreate("Test1", (cpu_kstate_function_arg1_t *)kthread1, (void *)"Hlowrd\n"); + kthreadCreate("Test2", (cpu_kstate_function_arg1_t *)kthread2, (void *)"el ol\n"); +} + void run_test(void) { testPaging(); @@ -230,4 +257,5 @@ void run_test(void) printf("Testing backtrace\n"); test_backtrace(); testCoroutine(); + testKthread(); }