kthread implement yield
This commit is contained in:
parent
b2d3cd62ca
commit
dafaba7407
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
28
tests/test.c
28
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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user