kthread implement yield
This commit is contained in:
parent
b2d3cd62ca
commit
dafaba7407
@ -1,19 +1,25 @@
|
|||||||
#include "assert.h"
|
|
||||||
#include "kthread.h"
|
#include "kthread.h"
|
||||||
#include "list.h"
|
|
||||||
#include "alloc.h"
|
#include "alloc.h"
|
||||||
|
#include "assert.h"
|
||||||
|
#include "irq.h"
|
||||||
#include "klibc.h"
|
#include "klibc.h"
|
||||||
|
#include "list.h"
|
||||||
#include "vga.h"
|
#include "vga.h"
|
||||||
|
|
||||||
static struct kthread *currentThread;
|
static struct kthread *currentThread;
|
||||||
|
|
||||||
void kthreadExit(){
|
void kthreadExit()
|
||||||
|
{
|
||||||
|
uint32_t flags;
|
||||||
|
disable_IRQs(flags);
|
||||||
struct kthread *current = currentThread;
|
struct kthread *current = currentThread;
|
||||||
struct kthread *next = kthreadSelectNext();
|
struct kthread *next = kthreadSelectNext();
|
||||||
if (next == current)
|
if (next == current)
|
||||||
assert("cannot exit thread");
|
assert("cannot exit thread");
|
||||||
currentThread = next;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,10 +77,26 @@ struct kthread *kthreadSelectNext(){
|
|||||||
return nextThread;
|
return nextThread;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct cpu_state *switchKthread(struct cpu_state *prevCpu){
|
struct cpu_state *switchKthread(struct cpu_state *prevCpu)
|
||||||
currentThread->cpuState = prevCpu;
|
{
|
||||||
|
uint32_t flags;
|
||||||
|
disable_IRQs(flags);
|
||||||
|
currentThread->cpuState = prevCpu;
|
||||||
struct kthread *nextThread = kthreadSelectNext();
|
struct kthread *nextThread = kthreadSelectNext();
|
||||||
printStringDetails(nextThread->name, RED, BLACK, 40, VGA_HEIGHT - 1);
|
printStringDetails(nextThread->name, RED, BLACK, 40, VGA_HEIGHT - 1);
|
||||||
currentThread = nextThread;
|
currentThread = nextThread;
|
||||||
|
restore_IRQs(flags);
|
||||||
return nextThread->cpuState;
|
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;
|
struct kthread *prev;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int kthreadSetup(vaddr_t mainStack, size_t mainStackSize);
|
int kthreadSetup(vaddr_t mainStack, size_t mainStackSize);
|
||||||
void kthreadExit();
|
void kthreadExit();
|
||||||
|
|
||||||
struct kthread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func,
|
struct kthread *kthreadCreate(const char *name, cpu_kstate_function_arg1_t func, void *args);
|
||||||
void *args);
|
|
||||||
|
|
||||||
void kthreadDelete(struct kthread *thread);
|
void kthreadDelete(struct kthread *thread);
|
||||||
|
|
||||||
struct kthread *kthreadSelectNext();
|
struct kthread *kthreadSelectNext();
|
||||||
struct cpu_state *switchKthread(struct cpu_state *prevCpu);
|
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 "assert.h"
|
||||||
#include "cpu_context.h"
|
#include "cpu_context.h"
|
||||||
#include "klibc.h"
|
#include "klibc.h"
|
||||||
|
#include "kthread.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "paging.h"
|
#include "paging.h"
|
||||||
@ -217,6 +218,32 @@ void testCoroutine()
|
|||||||
printf("Back in main !\n");
|
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)
|
void run_test(void)
|
||||||
{
|
{
|
||||||
testPaging();
|
testPaging();
|
||||||
@ -230,4 +257,5 @@ void run_test(void)
|
|||||||
printf("Testing backtrace\n");
|
printf("Testing backtrace\n");
|
||||||
test_backtrace();
|
test_backtrace();
|
||||||
testCoroutine();
|
testCoroutine();
|
||||||
|
testKthread();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user