[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