Add DEFINE_ARRAY_FREE_FUNC and mount_image_free_array
This is similar to DEFINE_POINTER_ARRAY_FREE_FUNC, but one pointer chase less. The name of the outer and inner functions are specified separately. The inner function does not free, so it'll be generally something like 'foo_done', but the outer function does free, so it can be called 'foo_array_free'.
This commit is contained in:
@@ -4055,7 +4055,7 @@ int bus_exec_context_set_transient_property(
|
||||
MountImage *mount_images = NULL;
|
||||
size_t n_mount_images = 0;
|
||||
|
||||
CLEANUP_ARRAY(mount_images, n_mount_images, mount_image_free_many);
|
||||
CLEANUP_ARRAY(mount_images, n_mount_images, mount_image_free_array);
|
||||
|
||||
r = sd_bus_message_enter_container(message, 'a', "(ssba(ss))");
|
||||
if (r < 0)
|
||||
@@ -4127,7 +4127,7 @@ int bus_exec_context_set_transient_property(
|
||||
|
||||
if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
|
||||
if (n_mount_images == 0) {
|
||||
mount_image_free_many(c->mount_images, c->n_mount_images);
|
||||
mount_image_free_array(c->mount_images, c->n_mount_images);
|
||||
c->mount_images = NULL;
|
||||
c->n_mount_images = 0;
|
||||
|
||||
@@ -4158,7 +4158,7 @@ int bus_exec_context_set_transient_property(
|
||||
MountImage *extension_images = NULL;
|
||||
size_t n_extension_images = 0;
|
||||
|
||||
CLEANUP_ARRAY(extension_images, n_extension_images, mount_image_free_many);
|
||||
CLEANUP_ARRAY(extension_images, n_extension_images, mount_image_free_array);
|
||||
|
||||
r = sd_bus_message_enter_container(message, 'a', "(sba(ss))");
|
||||
if (r < 0)
|
||||
@@ -4220,7 +4220,7 @@ int bus_exec_context_set_transient_property(
|
||||
|
||||
if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
|
||||
if (n_extension_images == 0) {
|
||||
mount_image_free_many(c->extension_images, c->n_extension_images);
|
||||
mount_image_free_array(c->extension_images, c->n_extension_images);
|
||||
c->extension_images = NULL;
|
||||
c->n_extension_images = 0;
|
||||
|
||||
|
||||
+2
-2
@@ -696,10 +696,10 @@ void exec_context_done(ExecContext *c) {
|
||||
bind_mount_free_many(c->bind_mounts, c->n_bind_mounts);
|
||||
c->bind_mounts = NULL;
|
||||
c->n_bind_mounts = 0;
|
||||
mount_image_free_many(c->mount_images, c->n_mount_images);
|
||||
mount_image_free_array(c->mount_images, c->n_mount_images);
|
||||
c->mount_images = NULL;
|
||||
c->n_mount_images = 0;
|
||||
mount_image_free_many(c->extension_images, c->n_extension_images);
|
||||
mount_image_free_array(c->extension_images, c->n_extension_images);
|
||||
c->extension_images = NULL;
|
||||
c->n_extension_images = 0;
|
||||
c->extension_directories = strv_free(c->extension_directories);
|
||||
|
||||
@@ -5235,7 +5235,7 @@ int config_parse_mount_images(
|
||||
|
||||
if (isempty(rvalue)) {
|
||||
/* Empty assignment resets the list */
|
||||
mount_image_free_many(c->mount_images, c->n_mount_images);
|
||||
mount_image_free_array(c->mount_images, c->n_mount_images);
|
||||
c->mount_images = NULL;
|
||||
c->n_mount_images = 0;
|
||||
return 0;
|
||||
@@ -5385,7 +5385,7 @@ int config_parse_extension_images(
|
||||
|
||||
if (isempty(rvalue)) {
|
||||
/* Empty assignment resets the list */
|
||||
mount_image_free_many(c->extension_images, c->n_extension_images);
|
||||
mount_image_free_array(c->extension_images, c->n_extension_images);
|
||||
c->extension_images = NULL;
|
||||
c->n_extension_images = 0;
|
||||
return 0;
|
||||
|
||||
+7
-10
@@ -3250,18 +3250,15 @@ int bind_mount_add(BindMount **b, size_t *n, const BindMount *item) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mount_image_free_many(MountImage *m, size_t n) {
|
||||
assert(m || n == 0);
|
||||
|
||||
FOREACH_ARRAY(i, m, n) {
|
||||
free(i->source);
|
||||
free(i->destination);
|
||||
mount_options_free_all(i->mount_options);
|
||||
}
|
||||
|
||||
free(m);
|
||||
static void mount_image_done(MountImage *m) {
|
||||
assert(m);
|
||||
m->source = mfree(m->source);
|
||||
m->destination = mfree(m->destination);
|
||||
m->mount_options = mount_options_free_all(m->mount_options);
|
||||
}
|
||||
|
||||
DEFINE_ARRAY_FREE_FUNC(mount_image_free_array, MountImage, mount_image_done);
|
||||
|
||||
int mount_image_add(MountImage **m, size_t *n, const MountImage *item) {
|
||||
_cleanup_free_ char *s = NULL, *d = NULL;
|
||||
_cleanup_(mount_options_free_allp) MountOptions *o = NULL;
|
||||
|
||||
@@ -303,7 +303,7 @@ DECLARE_STRING_TABLE_LOOKUP(private_pids, PrivatePIDs);
|
||||
void bind_mount_free_many(BindMount *b, size_t n);
|
||||
int bind_mount_add(BindMount **b, size_t *n, const BindMount *item);
|
||||
|
||||
void mount_image_free_many(MountImage *m, size_t n);
|
||||
void mount_image_free_array(MountImage *array, size_t n);
|
||||
int mount_image_add(MountImage **m, size_t *n, const MountImage *item);
|
||||
|
||||
void temporary_filesystem_free_many(TemporaryFileSystem *t, size_t n);
|
||||
|
||||
@@ -64,6 +64,16 @@
|
||||
free(array); \
|
||||
}
|
||||
|
||||
/* Clean up an array of objects of known size by dropping all the items in it.
|
||||
* Then free the array itself. */
|
||||
#define DEFINE_ARRAY_FREE_FUNC(name, type, helper) \
|
||||
void name(type *array, size_t n) { \
|
||||
assert(array || n == 0); \
|
||||
FOREACH_ARRAY(item, array, n) \
|
||||
helper(item); \
|
||||
free(array); \
|
||||
}
|
||||
|
||||
typedef void (*free_array_func_t)(void *p, size_t n);
|
||||
|
||||
/* An automatic _cleanup_-like logic for destroy arrays (i.e. pointers + size) when leaving scope */
|
||||
|
||||
Reference in New Issue
Block a user