mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 00:14:32 +09:00
machine: move manager_acquire_image to src/machine/machined-core.c
This is a prep step to reuse the function in varlink interface.
This commit is contained in:
@@ -377,60 +377,6 @@ int bus_image_method_get_os_release(
|
||||
return bus_reply_pair_array(message, image->os_release);
|
||||
}
|
||||
|
||||
static int image_flush_cache(sd_event_source *s, void *userdata) {
|
||||
Manager *m = ASSERT_PTR(userdata);
|
||||
|
||||
assert(s);
|
||||
|
||||
hashmap_clear(m->image_cache);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int manager_acquire_image(Manager *m, const char *name, Image **ret) {
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(name);
|
||||
|
||||
Image *existing = hashmap_get(m->image_cache, name);
|
||||
if (existing) {
|
||||
if (ret)
|
||||
*ret = existing;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!m->image_cache_defer_event) {
|
||||
r = sd_event_add_defer(m->event, &m->image_cache_defer_event, image_flush_cache, m);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_event_source_set_priority(m->image_cache_defer_event, SD_EVENT_PRIORITY_IDLE);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = sd_event_source_set_enabled(m->image_cache_defer_event, SD_EVENT_ONESHOT);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
_cleanup_(image_unrefp) Image *image = NULL;
|
||||
r = image_find(IMAGE_MACHINE, name, NULL, &image);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
image->userdata = m;
|
||||
|
||||
r = hashmap_ensure_put(&m->image_cache, &image_hash_ops, image->name, image);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (ret)
|
||||
*ret = image;
|
||||
|
||||
TAKE_PTR(image);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int image_object_find(sd_bus *bus, const char *path, const char *interface, void *userdata, void **found, sd_bus_error *error) {
|
||||
_cleanup_free_ char *e = NULL;
|
||||
Manager *m = userdata;
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
|
||||
extern const BusObjectImplementation image_object;
|
||||
|
||||
int manager_acquire_image(Manager *m, const char *name, Image **ret);
|
||||
char* image_bus_path(const char *name);
|
||||
|
||||
int bus_image_method_remove(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
|
||||
@@ -402,3 +402,57 @@ int machine_get_os_release(Machine *machine, char ***ret_os_release) {
|
||||
*ret_os_release = TAKE_PTR(l);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int image_flush_cache(sd_event_source *s, void *userdata) {
|
||||
Manager *m = ASSERT_PTR(userdata);
|
||||
|
||||
assert(s);
|
||||
|
||||
hashmap_clear(m->image_cache);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int manager_acquire_image(Manager *m, const char *name, Image **ret) {
|
||||
int r;
|
||||
|
||||
assert(m);
|
||||
assert(name);
|
||||
|
||||
Image *existing = hashmap_get(m->image_cache, name);
|
||||
if (existing) {
|
||||
if (ret)
|
||||
*ret = existing;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!m->image_cache_defer_event) {
|
||||
r = sd_event_add_defer(m->event, &m->image_cache_defer_event, image_flush_cache, m);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to add defered event: %m");
|
||||
|
||||
r = sd_event_source_set_priority(m->image_cache_defer_event, SD_EVENT_PRIORITY_IDLE);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to set source priority for event: %m");
|
||||
}
|
||||
|
||||
r = sd_event_source_set_enabled(m->image_cache_defer_event, SD_EVENT_ONESHOT);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to enable source: %m") ;
|
||||
|
||||
_cleanup_(image_unrefp) Image *image = NULL;
|
||||
r = image_find(IMAGE_MACHINE, name, NULL, &image);
|
||||
if (r < 0)
|
||||
return log_debug_errno(r, "Failed to find image: %m");
|
||||
|
||||
image->userdata = m;
|
||||
|
||||
r = hashmap_ensure_put(&m->image_cache, &image_hash_ops, image->name, image);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (ret)
|
||||
*ret = image;
|
||||
|
||||
TAKE_PTR(image);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -68,3 +68,4 @@ void manager_enqueue_gc(Manager *m);
|
||||
|
||||
int machine_get_addresses(Machine* machine, struct local_address **ret_addresses);
|
||||
int machine_get_os_release(Machine *machine, char ***ret_os_release);
|
||||
int manager_acquire_image(Manager *m, const char *name, Image **ret);
|
||||
|
||||
Reference in New Issue
Block a user