[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