add possibility to ask thread to suicide itself
This commit is contained in:
@ -194,6 +194,34 @@ void Scheduler::kill(unsigned int tid, bse::unique_ptr<Thread>* ptr) {
|
|||||||
cpu.enable_int();
|
cpu.enable_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Can't retrive the thread right now because it's not clear when it's finished,
|
||||||
|
// maybe introduce a exited_queue and get it from there
|
||||||
|
void Scheduler::nice_kill(unsigned int tid, bse::unique_ptr<Thread>* ptr) {
|
||||||
|
cpu.disable_int();
|
||||||
|
|
||||||
|
for (bse::unique_ptr<Thread>& thread : block_queue) {
|
||||||
|
if (thread->tid == tid) {
|
||||||
|
thread->suicide();
|
||||||
|
log << INFO << "Nice killed thread in block_queue with id: " << tid << endl;
|
||||||
|
deblock(tid);
|
||||||
|
cpu.enable_int();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (bse::unique_ptr<Thread>& thread : ready_queue) {
|
||||||
|
if (thread->tid == tid) {
|
||||||
|
thread->suicide();
|
||||||
|
log << INFO << "Nice killed thread in ready_queue with id: " << tid << endl;
|
||||||
|
cpu.enable_int();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log << ERROR << "Can't nice kill thread (not found) with id: " << tid << endl;
|
||||||
|
cpu.enable_int();
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Methode: Scheduler::yield *
|
* Methode: Scheduler::yield *
|
||||||
*---------------------------------------------------------------------------*
|
*---------------------------------------------------------------------------*
|
||||||
|
|||||||
@ -90,6 +90,13 @@ public:
|
|||||||
void kill(unsigned int tid, bse::unique_ptr<Thread>* ptr);
|
void kill(unsigned int tid, bse::unique_ptr<Thread>* ptr);
|
||||||
void kill(unsigned int tid) { kill(tid, nullptr); }
|
void kill(unsigned int tid) { kill(tid, nullptr); }
|
||||||
|
|
||||||
|
// Ask thread to exit
|
||||||
|
// NOTE: I had many problems with killing threads that were stuck in some semaphore
|
||||||
|
// or were involved in any locking mechanisms, so with this a thread can make sure
|
||||||
|
// to "set things right" before exiting itself (but could also be ignored)
|
||||||
|
void nice_kill(unsigned int tid, bse::unique_ptr<Thread>* ptr);
|
||||||
|
void nice_kill(unsigned int tid) { nice_kill(tid, nullptr); }
|
||||||
|
|
||||||
// CPU freiwillig abgeben und Auswahl des naechsten Threads
|
// CPU freiwillig abgeben und Auswahl des naechsten Threads
|
||||||
void yield();
|
void yield();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user