1

reduce insane output + introduce block queue

This commit is contained in:
2022-07-17 01:14:32 +02:00
parent b1e3129de8
commit 566c11eab1
2 changed files with 72 additions and 15 deletions

View File

@ -56,8 +56,7 @@ void Scheduler::ready(Thread* that) {
cpu.disable_int();
this->ready_queue.insert(that);
log << TRACE << "Adding to ready_queue, ID: " << dec << that->tid << endl;
this->ready_queue.print(log << TRACE);
log << DEBUG << "Adding to ready_queue, ID: " << dec << that->tid << endl;
cpu.enable_int();
}
@ -82,8 +81,8 @@ void Scheduler::exit() {
}
Thread& next = *(Thread*)this->ready_queue.remove_first();
log << TRACE << "Exiting thread, ID: " << dec << this->get_active()->tid << " => " << next.tid << endl;
this->ready_queue.print(log << TRACE);
log << DEBUG << "Exiting thread, ID: " << dec << this->get_active()->tid << " => " << next.tid << endl;
delete this->get_active();
this->dispatch(next);
@ -109,13 +108,46 @@ void Scheduler::kill(Thread* that) {
// Thread-Wechsel durch PIT verhindern
cpu.disable_int();
if (!this->ready_queue.remove(that)) {
log << ERROR << "Can't kill thread that is not in ready_queue, ID: " << dec << that->tid << endl;
cpu.enable_int();
return;
// Not in ready queue
if (!this->block_queue.remove(that)) {
// Not in block queue
log << ERROR << "Can't kill thread that is not in any queue, ID: " << dec << that->tid << endl;
cpu.enable_int();
return;
}
}
log << TRACE << "Killing thread, ID: " << dec << that->tid << endl;
this->ready_queue.print(log << TRACE);
log << DEBUG << "Killing thread, ID: " << dec << that->tid << endl;
delete that;
cpu.enable_int();
}
void Scheduler::kill(unsigned int id) {
cpu.disable_int();
Thread* to_remove = NULL;
for (Thread* thread : this->ready_queue) {
if (thread->tid == id) {
this->ready_queue.remove(to_remove);
log << DEBUG << "Killing thread, ID: " << dec << id << endl;
delete to_remove;
cpu.enable_int();
return;
}
}
for (Thread* thread : this->block_queue) {
if (thread->tid == id) {
this->block_queue.remove(to_remove);
log << DEBUG << "Killing thread, ID: " << dec << id << endl;
delete to_remove;
cpu.enable_int();
return;
}
}
log << ERROR << "Can't kill thread that is not in any queue, ID: " << dec << id << endl;
cpu.enable_int();
}
@ -137,7 +169,7 @@ void Scheduler::yield() {
// Thread-Wechsel durch PIT verhindern
cpu.disable_int();
if (this->ready_queue.empty()) {
log << TRACE << "Skipping yield as no thread is waiting, active ID: " << dec << this->get_active()->tid << endl;
// log << TRACE << "Skipping yield as no thread is waiting, active ID: " << dec << this->get_active()->tid << endl;
cpu.enable_int();
return;
}
@ -145,8 +177,7 @@ void Scheduler::yield() {
Thread& next = *(Thread*)this->ready_queue.remove_first();
this->ready_queue.insert(this->get_active());
log << TRACE << "Yielding, ID: " << dec << this->get_active()->tid << " => " << next.tid << endl;
this->ready_queue.print(log << TRACE);
// log << TRACE << "Yielding, ID: " << dec << this->get_active()->tid << " => " << next.tid << endl;
this->dispatch(next);
}
@ -162,7 +193,8 @@ void Scheduler::preempt() {
/* Hier muss Code eingefuegt werden */
this->yield(); // We already have that
cpu.disable_int();
this->yield();
}
/*****************************************************************************
@ -179,7 +211,21 @@ void Scheduler::block() {
/* hier muss Code eingefuegt werden */
this->exit(); // If I'm not mistaken block/deblock is the same functionality we already have
// Basically the same as exit()
cpu.disable_int();
if (this->ready_queue.empty()) {
log << ERROR << "Can't block last thread, active ID: " << dec << this->get_active()->tid << endl;
cpu.enable_int();
return;
}
this->block_queue.insert(this->get_active()); // Thread that will be blocked waits in block_queue, so the scheduler can also
// kill blocked threads (for example keyboard demo needs this)
Thread& next = *(Thread*)this->ready_queue.remove_first();
log << TRACE << "Blocking thread, ID: " << dec << this->get_active()->tid << " => " << next.tid << endl;
this->dispatch(next);
}
/*****************************************************************************
@ -197,5 +243,14 @@ void Scheduler::deblock(Thread* that) {
/* hier muss Code eingefuegt werden */
this->ready(that);
// Basically the same as ready()
cpu.disable_int();
if (!this->block_queue.remove(that)) {
log << ERROR << "Unblocked thread wasn't in block_queue" << endl;
}
this->ready_queue.insert_at(that, 0); // Prefer deblocked
log << TRACE << "Adding to start of ready_queue, ID: " << dec << that->tid << endl;
cpu.enable_int();
}

View File

@ -40,6 +40,7 @@ private:
// NOTE: Using this instead of the Queue is a side effect, I added the ArrayList for different reasons
// but my Queue was shit so I replaced it (and didn't fix the Queue)
ArrayList<Thread*> ready_queue;
ArrayList<Thread*> block_queue;
public:
Scheduler() : has_idle_thread(false), log("SCHED") {}
@ -63,6 +64,7 @@ public:
// Thread mit 'Gewalt' terminieren
void kill(Thread* that);
void kill(unsigned int id);
// CPU freiwillig abgeben und Auswahl des naechsten Threads
void yield();