aboutsummaryrefslogtreecommitdiff
path: root/lib/io
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-12-04 01:33:45 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-01-19 16:24:56 +0100
commit47f24f2a8faf71395a1d054e9823beb000442cce (patch)
treedd01d8b69125b3dda444c9b92437ad0c5a0af9bc /lib/io
parent4160b50a0b4c51f8b7191928cdf38d9fb0147fe2 (diff)
Implement rudimentary reference counting for sqfs_object_t
Implement grab/drop functions to increase/decrease reference count and destroy the object if the count drops to 0. Make sure that all objects that maintain internal references actually grab that reference, duplicate it in the copy function, drop it in the destroy handler. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/io')
-rw-r--r--lib/io/compress/ostream_compressor.c4
-rw-r--r--lib/io/uncompress/istream_compressor.c4
-rw-r--r--lib/io/unix/ostream.c2
3 files changed, 6 insertions, 4 deletions
diff --git a/lib/io/compress/ostream_compressor.c b/lib/io/compress/ostream_compressor.c
index f63a3d2..a5f16d5 100644
--- a/lib/io/compress/ostream_compressor.c
+++ b/lib/io/compress/ostream_compressor.c
@@ -56,7 +56,7 @@ static void comp_destroy(sqfs_object_t *obj)
ostream_comp_t *comp = (ostream_comp_t *)obj;
comp->cleanup(comp);
- sqfs_destroy(comp->wrapped);
+ sqfs_drop(comp->wrapped);
free(comp);
}
@@ -95,7 +95,7 @@ ostream_t *ostream_compressor_create(ostream_t *strm, int comp_id)
sqfs_object_init(comp, comp_destroy, NULL);
- comp->wrapped = strm;
+ comp->wrapped = sqfs_grab(strm);
comp->inbuf_used = 0;
base = (ostream_t *)comp;
diff --git a/lib/io/uncompress/istream_compressor.c b/lib/io/uncompress/istream_compressor.c
index 1c73e3a..d4e1aea 100644
--- a/lib/io/uncompress/istream_compressor.c
+++ b/lib/io/uncompress/istream_compressor.c
@@ -18,7 +18,7 @@ static void comp_destroy(sqfs_object_t *obj)
istream_comp_t *comp = (istream_comp_t *)obj;
comp->cleanup(comp);
- sqfs_destroy(comp->wrapped);
+ sqfs_drop(comp->wrapped);
free(comp);
}
@@ -57,7 +57,7 @@ istream_t *istream_compressor_create(istream_t *strm, int comp_id)
sqfs_object_init(comp, comp_destroy, NULL);
- comp->wrapped = strm;
+ comp->wrapped = sqfs_grab(strm);
base = (istream_t *)comp;
base->get_filename = comp_get_filename;
diff --git a/lib/io/unix/ostream.c b/lib/io/unix/ostream.c
index 6ed18e6..5ef2af2 100644
--- a/lib/io/unix/ostream.c
+++ b/lib/io/unix/ostream.c
@@ -163,6 +163,8 @@ ostream_t *ostream_open_stdout(void)
strm->append = file_append;
strm->flush = file_flush;
strm->get_filename = file_get_filename;
+
+ sqfs_object_init(file, file_destroy, NULL);
return strm;
fail:
perror("creating file wrapper for stdout");