From c3f45eb5e24777f7dd5d635958455f33085f034d Mon Sep 17 00:00:00 2001 From: Arjob Mukherjee Date: Fri, 18 Oct 2024 00:31:20 +0530 Subject: [PATCH] Yield request event is sent regularly to processes --- include/applib/app.h | 7 +++++++ include/kernel.h | 7 +++++++ src/apps/mpdemo.c | 17 ++++++++++++++--- src/kernel/x86/interrupts.c | 1 + 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/include/applib/app.h b/include/applib/app.h index 2e76259..d5a95ce 100644 --- a/include/applib/app.h +++ b/include/applib/app.h @@ -27,6 +27,13 @@ typedef enum IProcessFlags { IPROCESS_FLAGS_KERNEL_PROCESS = (1 << 0), IPROCESS_FLAGS_THREAD = (1 << 1), } IProcessFlags; + +// Represents the 'KernelEvents' struct defined in 'kernel.h', but with some changes. +typedef enum IAppEvents { + APP_EVENT_NONE = 0, + APP_EVENT_TICK = 1, + APP_EVENT_PROCCESS_YIELD_REQ = 2 +} IAppEvents; // ============================================================================= typedef enum SYSCALLS { diff --git a/include/kernel.h b/include/kernel.h index b8682b7..803d5b4 100644 --- a/include/kernel.h +++ b/include/kernel.h @@ -28,6 +28,12 @@ typedef struct KernelStateInfo { extern volatile KernelStateInfo g_kstate; +typedef enum KernelEvents { + KERNEL_EVENT_NONE = 0, + KERNEL_EVENT_TICK = 1, + KERNEL_EVENT_PROCCESS_YIELD_REQ = 2 +} KernelEvents; + #define KERNEL_PHASE_SET(p) \ do { \ k_assert (p == 0 || (g_kstate.phase + 1) == p, "Current state is unsuitable for " #p); \ @@ -42,3 +48,4 @@ extern volatile KernelStateInfo g_kstate; #define KERNEL_TICK_COUNT_TO_MICROSEC(tick) ((tick)*CONFIG_TICK_PERIOD_MICROSEC) void k_delay (UINT ms); +void keventmanager_invoke(); diff --git a/src/apps/mpdemo.c b/src/apps/mpdemo.c index 0a75927..9948672 100644 --- a/src/apps/mpdemo.c +++ b/src/apps/mpdemo.c @@ -8,6 +8,14 @@ static void s_progressbar (UINT iterPerStep, char* title, UINT row, UINT color); static void thread0(); static void thread1(); +static bool shouldYield() +{ + UINT pid = sys_process_get_pid(); + IProcessEvent e; + sys_process_pop_event (pid, &e); + return (e.event == APP_EVENT_PROCCESS_YIELD_REQ); +} + static void s_printString (U32 row, U32 col, U32 bgcolor, U32 fgcolor, char* text) { syscall (SYSCALL_CONSOLE_SETCOLOR, bgcolor, fgcolor, 0, 0, 0); @@ -27,10 +35,10 @@ void s_progressbar (UINT iterPerStep, char* title, UINT row, UINT color) if (i % iterPerStep == 0) { column = (column + 1) % MAX_VGA_COLUMNS; } - sys_yield(); + if (shouldYield()) { + sys_yield(); + } } - - sys_process_kill(); } void proc_main() @@ -50,6 +58,7 @@ void proc_main() s_progressbar (iterPerStep, "Process 0:\n", 25, RED); + k_halt(); sys_process_kill(); s_printString (37, 0, BLACK, WHITE, "Cannot kill process 0. Make kernel thread slower for demo."); @@ -60,6 +69,7 @@ void thread0() UINT iterPerStep = 10; s_progressbar (iterPerStep, "Thread 0:\n", 29, GREEN); + sys_process_kill(); } void thread1() @@ -67,4 +77,5 @@ void thread1() UINT iterPerStep = 7; s_progressbar (iterPerStep, "Thread 1:\n", 33, YELLOW); + sys_process_kill(); } diff --git a/src/kernel/x86/interrupts.c b/src/kernel/x86/interrupts.c index 5201276..a0bd8b4 100644 --- a/src/kernel/x86/interrupts.c +++ b/src/kernel/x86/interrupts.c @@ -53,6 +53,7 @@ void timer_interrupt_handler (InterruptFrame* frame) "Interrupt timer period != tick period"); g_kstate.tick_count++; + keventmanager_invoke(); pic_send_eoi (PIC_IRQ_TIMER); }