]>
Commit | Line | Data |
---|---|---|
db9ecf05 | 1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
61d0578b LP |
2 | |
3 | #include "portable.h" | |
4 | #include "portabled-image.h" | |
5 | #include "portabled.h" | |
6 | ||
7 | Image *manager_image_cache_get(Manager *m, const char *name_or_path) { | |
8 | assert(m); | |
9 | ||
10 | return hashmap_get(m->image_cache, name_or_path); | |
11 | } | |
12 | ||
13 | static int image_cache_flush(sd_event_source *s, void *userdata) { | |
99534007 | 14 | Manager *m = ASSERT_PTR(userdata); |
61d0578b LP |
15 | |
16 | assert(s); | |
61d0578b | 17 | |
b07ec5a1 | 18 | hashmap_clear(m->image_cache); |
61d0578b LP |
19 | return 0; |
20 | } | |
21 | ||
22 | static int manager_image_cache_initialize(Manager *m) { | |
23 | int r; | |
24 | ||
25 | assert(m); | |
26 | ||
b07ec5a1 | 27 | r = hashmap_ensure_allocated(&m->image_cache, &image_hash_ops); |
61d0578b LP |
28 | if (r < 0) |
29 | return r; | |
30 | ||
31 | /* We flush the cache as soon as we are idle again */ | |
32 | if (!m->image_cache_defer_event) { | |
33 | r = sd_event_add_defer(m->event, &m->image_cache_defer_event, image_cache_flush, m); | |
34 | if (r < 0) | |
35 | return r; | |
36 | ||
37 | r = sd_event_source_set_priority(m->image_cache_defer_event, SD_EVENT_PRIORITY_IDLE); | |
38 | if (r < 0) | |
39 | return r; | |
40 | } | |
41 | ||
42 | r = sd_event_source_set_enabled(m->image_cache_defer_event, SD_EVENT_ONESHOT); | |
43 | if (r < 0) | |
44 | return r; | |
45 | ||
46 | return 0; | |
47 | } | |
48 | ||
49 | int manager_image_cache_add(Manager *m, Image *image) { | |
50 | int r; | |
51 | ||
52 | assert(m); | |
53 | ||
54 | /* We add the specified image to the cache under two keys. | |
55 | * | |
56 | * 1. Always under its path | |
57 | * | |
58 | * 2. If the image was discovered in the search path (i.e. its discoverable boolean set) we'll also add it | |
59 | * under its short name. | |
61d0578b LP |
60 | */ |
61 | ||
62 | r = manager_image_cache_initialize(m); | |
63 | if (r < 0) | |
64 | return r; | |
65 | ||
66 | image->userdata = m; | |
67 | ||
68 | r = hashmap_put(m->image_cache, image->path, image); | |
69 | if (r < 0) | |
70 | return r; | |
71 | ||
72 | image_ref(image); | |
73 | ||
74 | if (image->discoverable) { | |
75 | r = hashmap_put(m->image_cache, image->name, image); | |
76 | if (r < 0) | |
77 | return r; | |
78 | ||
79 | image_ref(image); | |
80 | } | |
81 | ||
82 | return 0; | |
83 | } | |
84 | ||
85 | int manager_image_cache_discover(Manager *m, Hashmap *images, sd_bus_error *error) { | |
86 | Image *image; | |
61d0578b LP |
87 | int r; |
88 | ||
89 | assert(m); | |
90 | ||
91 | /* A wrapper around image_discover() (for finding images in search path) and portable_discover_attached() (for | |
92 | * finding attached images). */ | |
93 | ||
d577d4a4 | 94 | r = image_discover(IMAGE_PORTABLE, NULL, images); |
61d0578b LP |
95 | if (r < 0) |
96 | return r; | |
97 | ||
90e74a66 | 98 | HASHMAP_FOREACH(image, images) |
61d0578b LP |
99 | (void) manager_image_cache_add(m, image); |
100 | ||
101 | return 0; | |
102 | } |