[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[tyndur-devel] [PATCH 06/11] kernel2: on_destroy-Handler für Threads
+ kernel2: Eventhandler für das Beenden von Threads, analog zum schon
bestehenden on_destroy für Prozesse
Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
src/kernel2/include/tasks.h | 11 +++++++++++
src/kernel2/src/tasks/thread.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 41 insertions(+), 0 deletions(-)
diff --git a/src/kernel2/include/tasks.h b/src/kernel2/include/tasks.h
index 55caae6..d4096bb 100644
--- a/src/kernel2/include/tasks.h
+++ b/src/kernel2/include/tasks.h
@@ -146,9 +146,16 @@ typedef struct {
/// Gesetzt, wenn der Thread beim Beenden den gesamten Prozess beendet
bool is_main_thread;
+
+ /**
+ * Eine Liste von Eventhandlern, die beim Loeschen des Threads
+ * aufgerufen werden
+ */
+ list_t* on_destroy;
} pm_thread_t;
typedef void (*pm_process_destroy_handler)(pm_process_t* process, void* prv);
+typedef void (*pm_thread_destroy_handler)(pm_thread_t* thread, void* prv);
extern list_t* process_list;
@@ -187,6 +194,10 @@ bool pm_unblock_rpc(pm_process_t* task, pid_t blocked_by);
void pm_register_on_destroy(pm_process_t* process,
pm_process_destroy_handler handler, void* prv);
+/// Handler fuer das Loeschen des Threads registrieren
+void pm_thread_register_on_destroy(pm_thread_t* thread,
+ pm_thread_destroy_handler handler, void* prv);
+
/// Entfernt den gegebenen Task aus allen RPC-Backlinks
void rpc_destroy_task_backlinks(pm_process_t* destroyed_process);
diff --git a/src/kernel2/src/tasks/thread.c b/src/kernel2/src/tasks/thread.c
index a2d01bf..676a930 100644
--- a/src/kernel2/src/tasks/thread.c
+++ b/src/kernel2/src/tasks/thread.c
@@ -44,6 +44,11 @@
#include "lock.h"
#include "cpu.h"
+struct on_destroy_info {
+ pm_thread_destroy_handler handler;
+ void* prv;
+};
+
static tid_t next_tid = 1;
static tid_t generate_tid(void)
@@ -80,6 +85,9 @@ pm_thread_t* pm_thread_create(pm_process_t* process, vaddr_t entry)
// Ein Pointer auf den Prozess im Thread hinterlegen
thread->process = process;
+
+ // Eventhandlerlisten anlegen
+ thread->on_destroy = list_create();
// Der Lock wird gesperrt initialisiert
thread->lock = 1;
@@ -158,6 +166,7 @@ pm_thread_t* pm_thread_create(pm_process_t* process, vaddr_t entry)
*/
void pm_thread_destroy(pm_thread_t* thread)
{
+ struct on_destroy_info* info;
// TODO Andere Threads beenden, falls thread->is_main_thread
// Zuerst muss der Thread angehalten werden
@@ -169,6 +178,13 @@ void pm_thread_destroy(pm_thread_t* thread)
// Beim Scheduler abmelden
pm_scheduler_delete(thread);
+ // Eventhandler ausfuehren
+ while ((info = list_pop(thread->on_destroy))) {
+ info->handler(thread, info->prv);
+ free(info);
+ }
+ list_destroy(thread->on_destroy);
+
// Wir brauchen immer einen gueltigen aktiven Thread, sonst kommt der
// Interrupthandler durcheinander und kann bei Exceptions im Kernel keine
// ordentliche Meldung mehr anzeigen.
@@ -313,3 +329,17 @@ bool pm_thread_unblock(pm_thread_t* thread)
unlock(&thread->lock);
return result;
}
+
+/**
+ * Handler fuer das Loeschen des Threads registrieren
+ */
+void pm_thread_register_on_destroy(pm_thread_t* thread,
+ pm_thread_destroy_handler handler, void* prv)
+{
+ struct on_destroy_info* info = malloc(sizeof(*info));
+
+ info->handler = handler;
+ info->prv = prv;
+
+ list_push(thread->on_destroy, info);
+}
--
1.7.7