[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[tyndur-devel] [PATCH v2 6/6] kernel2: Beim Prozessende offene Dateien schliessen



+ kernel2: Wenn ein Prozess beendet wird, dann werden auch alle offenen
  Dateien geschlossen

Signed-off-by: Kevin Wolf <kevin@xxxxxxxxxx>
---
 src/kernel2/include/tasks.h   |    3 +++
 src/kernel2/src/syscalls/pm.c |    7 +++++++
 src/kernel2/src/tasks/pm.c    |   33 +++++++++++++++++++++++++++++----
 3 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/src/kernel2/include/tasks.h b/src/kernel2/include/tasks.h
index 5256e0f..1b719d7 100644
--- a/src/kernel2/include/tasks.h
+++ b/src/kernel2/include/tasks.h
@@ -155,6 +155,9 @@ void pm_init(void);
 /// Prozess erstellen
 pm_process_t* pm_create(pm_process_t* parent, const char* cmdline);
 
+/// Datenstrukturen eines Prozesses freigeben (vor dem Taskwechsel)
+void pm_prepare_destroy(pm_process_t* process);
+
 /// Prozess zerstoeren
 void pm_destroy(pm_process_t* process);
 
diff --git a/src/kernel2/src/syscalls/pm.c b/src/kernel2/src/syscalls/pm.c
index 806e827..eb63254 100644
--- a/src/kernel2/src/syscalls/pm.c
+++ b/src/kernel2/src/syscalls/pm.c
@@ -82,9 +82,16 @@ void syscall_pm_exit_process(void)
 {
     pm_process_t* old_task = current_process;
 
+    // Ein paar erste Datenstrukturen freigeben
+    pm_prepare_destroy(old_task);
+
     // Task abgeben
     pm_scheduler_push(current_thread);
 
+    // Den Prozess blockieren
+    while (pm_block(old_task) == false);
+
+
     // Genau jetzt muss der Prozess geloescht werden: Der Thread ist nicht mehr
     // aktiv, und er darf auch nicht wieder aktiviert werden.
     pm_destroy(old_task);
diff --git a/src/kernel2/src/tasks/pm.c b/src/kernel2/src/tasks/pm.c
index 047c4d5..e3085c5 100644
--- a/src/kernel2/src/tasks/pm.c
+++ b/src/kernel2/src/tasks/pm.c
@@ -45,6 +45,7 @@
 #include "lock.h"
 #include "timer.h"
 #include "lostio/core.h"
+#include "lostio/client.h"
 #include "lostio/userspace.h"
 
 
@@ -180,6 +181,33 @@ pm_process_t* pm_create(pm_process_t* parent, const char* cmdline)
 }
 
 /**
+ * Datenstrukturen eines Prozesses freigeben (falls von diesem Prozess selbst
+ * aufgerufen, darf der Task noch nicht gewechselt worden sein, damit
+ * unterbrechbare LIOv2-Funktionen benutzt werden koennen)
+ *
+ * @param process Pointer auf die Prozssstruktur.
+ */
+void pm_prepare_destroy(pm_process_t* process)
+{
+    // Alle Dateien schliessen und freigeben
+    struct lio_usp_stream* fd = NULL;
+    struct lio_usp_stream* next = NULL;
+    struct lio_stream* s;
+
+    fd = tree_next(process->lio_streams, NULL);
+    while (fd != NULL) {
+        next = tree_next(process->lio_streams, fd);
+
+        s = fd->stream;
+        lio_usp_remove_stream(process, fd);
+        lio_close(s);
+
+        fd = next;
+    }
+    tree_destroy(process->lio_streams);
+}
+
+/**
  * Prozess zerstoeren
  *
  * @param process Pointer auf die Prozssstruktur.
@@ -194,9 +222,6 @@ void pm_destroy(pm_process_t* process)
         mmc_activate(&init_process.context);
     }
 
-    // Den Prozess blockieren
-    while (pm_block(process) == false);
-
     // Eventhandler ausfuehren
     while ((info = list_pop(process->on_destroy))) {
         info->handler(process, info->prv);
@@ -238,7 +263,7 @@ void pm_destroy(pm_process_t* process)
     while ((thread = list_get_element_at(process->threads, i++))) {
         pm_thread_destroy(thread);
     }
-    
+
     // Kommandozeile freigeben
     free(process->cmdline);
     
-- 
1.6.0.2