Merge pull request #18432 from yuwata/libude-list-cleanups

libudev: cleanups for libudev-list
This commit is contained in:
Lennart Poettering 2021-02-02 15:05:46 +01:00 committed by GitHub
commit edf370af9e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -39,9 +39,10 @@ static struct udev_list_entry *udev_list_entry_free(struct udev_list_entry *entr
return NULL;
if (entry->list) {
if (entry->list->unique)
if (entry->list->unique && entry->name)
hashmap_remove(entry->list->unique_entries, entry->name);
else
if (!entry->list->unique || entry->list->uptodate)
LIST_REMOVE(entries, entry->list->entries, entry);
}
@ -70,9 +71,9 @@ struct udev_list *udev_list_new(bool unique) {
struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char *_name, const char *_value) {
_cleanup_(udev_list_entry_freep) struct udev_list_entry *entry = NULL;
_cleanup_free_ char *name = NULL, *value = NULL;
int r;
assert(list);
assert(_name);
name = strdup(_name);
if (!name)
@ -89,26 +90,22 @@ struct udev_list_entry *udev_list_entry_add(struct udev_list *list, const char *
return NULL;
*entry = (struct udev_list_entry) {
.list = list,
.name = TAKE_PTR(name),
.value = TAKE_PTR(value),
};
if (list->unique) {
r = hashmap_ensure_allocated(&list->unique_entries, &string_hash_ops);
if (r < 0)
return NULL;
udev_list_entry_free(hashmap_get(list->unique_entries, entry->name));
r = hashmap_put(list->unique_entries, entry->name, entry);
if (r < 0)
if (hashmap_ensure_put(&list->unique_entries, &string_hash_ops, entry->name, entry) < 0)
return NULL;
list->uptodate = false;
} else
LIST_APPEND(entries, list->entries, entry);
entry->list = list;
return TAKE_PTR(entry);
}
@ -119,8 +116,8 @@ void udev_list_cleanup(struct udev_list *list) {
return;
if (list->unique) {
hashmap_clear_with_destructor(list->unique_entries, udev_list_entry_free);
list->uptodate = false;
hashmap_clear_with_destructor(list->unique_entries, udev_list_entry_free);
} else
LIST_FOREACH_SAFE(entries, i, n, list->entries)
udev_list_entry_free(i);