diff options
Diffstat (limited to 'src/sys')
-rw-r--r-- | src/sys/schedule.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/sys/schedule.c b/src/sys/schedule.c index 287091c..fe919e6 100644 --- a/src/sys/schedule.c +++ b/src/sys/schedule.c @@ -80,7 +80,7 @@ struct Thread* get_unused_thread(void) return 0; } -void add_thread(void* pc, void* arg, unsigned char priority) +unsigned char add_thread(void* pc, void* arg, unsigned char priority) { struct Thread* thread = get_unused_thread(); thread_table[thread->offset] = 1; @@ -98,28 +98,36 @@ void add_thread(void* pc, void* arg, unsigned char priority) if (nextpid < FIRST_AVAIL_PID) { nextpid = FIRST_AVAIL_PID; } + // Cap Priority Level if (priority >= PRIORITIES) thread->priority = PRIORITIES - 1; else thread->priority = priority; + // This thread is new thread->old_priority = -1; + // Reserved for non-preemptible tasking thread->preempt = 0; // Get the Ready Queue struct ThreadQueue* ready_queue = &scheduler.ready[thread->priority]; // Get the write pointer struct ThreadEntryIterator* ready_write = &ready_queue->write; - // TODO: Check if it is possible to add - //if (ready_write->queue->thread == 0) { + if (ready_write->entry->thread == 0) { // Add the thread to the write pointer ready_write->entry->thread = thread; // Move the write pointer to the next entry ready_write->entry = ready_write->entry->next; - //} + } else { + // Cannot add, mark the stack space as available + // so that it can be used on a subsequent add thread + thread_table[thread->offset] = 0; + return 1; + } // Schedule if this was called in usermode unsigned long mode = getmode() & 0x1F; if (mode == 0x10) { sys0(SYS_YIELD_HIGH); } + return 0; } void uart_scheduler(void) |