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