[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] Ramdisk
Hier ist mein zweiter Anlauf:
Das Freigeben des Speichers wird jetzt nur noch in
ramdisk_fs_res_destroy() erledigt. Außerdem ist es nicht mehr möglich
Resources mit Kindern mit ramdisk_fs_res_destroy() zu zerstören.
ramdisk_fs_destroy() zerstört trotzdem auch Kind-Resourcen mithilfe von
destroy_res().
Außerdem habe ich noch ein time() entfernt.
Janosch Gräf schrieb:
> Hi,
>
> Dieser Patch fixt zwei memleaks die beim Löschen einer Datei auftreten.
> * Löschen einer Klasse und zerstören der Klasse (beide Funktionen geben
> res->buffer frei)
> * Löschen einer Link-Klasse (Link-Pfad steht nicht mehr in res->buffer
> sondern in res->res.link_path)
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Lost mailing list
> Lost@xxxxxxxxxx
> http://list.tyndur.org/mailman/listinfo/lost
diff --git a/apps/ramdisk/init.c b/apps/ramdisk/init.c
index 82e3821..6b15663 100755
--- a/apps/ramdisk/init.c
+++ b/apps/ramdisk/init.c
@@ -36,8 +36,6 @@
#include "ramdisk_cdi.h"
#include "cdi/lists.h"
#include <stdio.h>
-// FIXME CDI kennt eigentlich keine POSIX-Funktionen
-#include <time.h>
int ramdisk_fs_init(struct cdi_fs_filesystem* cdi_fs)
{
@@ -50,13 +48,23 @@ int ramdisk_fs_init(struct cdi_fs_filesystem* cdi_fs)
root_res->res.dir = &ramdisk_fs_dir;
root_res->res.loaded = 1;
root_res->res.children = cdi_list_create();
- root_res->creation_time = time(NULL);
+ root_res->creation_time = 0;
cdi_fs->root_res = (struct cdi_fs_res*) root_res;
return 1;
}
+static int destroy_res(struct ramdisk_fs_res *res)
+{
+ struct ramdisk_fs_res *child;
+
+ while ((child = cdi_list_pop(res->res.children))) {
+ destroy_res(child);
+ }
+ ramdisk_fs_res_destroy(res);
+}
+
int ramdisk_fs_destroy(struct cdi_fs_filesystem* fs)
{
- return ramdisk_fs_res_destroy((struct ramdisk_fs_res*)fs->root_res);
+ return destroy_res((struct ramdisk_fs_res*)fs->root_res);
}
diff --git a/apps/ramdisk/res.c b/apps/ramdisk/res.c
index ef02c7a..47afa00 100755
--- a/apps/ramdisk/res.c
+++ b/apps/ramdisk/res.c
@@ -158,7 +158,6 @@ int ramdisk_fs_res_remove_class(struct cdi_fs_stream* stream,
switch (class) {
case CDI_FS_CLASS_FILE:
- free(res->buffer);
res->size = 0;
res->res.file = NULL;
break;
@@ -168,7 +167,6 @@ int ramdisk_fs_res_remove_class(struct cdi_fs_stream* stream,
break;
case CDI_FS_CLASS_LINK:
- free(res->buffer); // In res->buffer steht der Pfad zum Ziel.
res->res.link = NULL;
break;
@@ -207,17 +205,16 @@ int ramdisk_fs_res_remove(struct cdi_fs_stream* stream)
}
}
- ramdisk_fs_res_destroy(res);
-
- return 1;
+ return ramdisk_fs_res_destroy(res);
}
int ramdisk_fs_res_destroy(struct ramdisk_fs_res* res)
{
- struct ramdisk_fs_res *child;
- free(res->res.name);
+ if (cdi_list_size(res->res.children)>0) return 0;
+
free(res->buffer);
- while ((child = cdi_list_pop(res->res.children))) ramdisk_fs_res_destroy(child);
+ free(res->res.name);
+ free(res->res.link_path);
cdi_list_destroy(res->res.children);
free(res);