Handle-with-cache.c Guide

GHashTableIter iter; gpointer key, value; g_hash_table_iter_init(&iter, handle_cache); while (g_hash_table_iter_next(&iter, &key, &value)) { CacheEntry *entry = value; if (entry->ref_count == 0 && (now - entry->last_access) > max_age_seconds) { to_remove = g_list_prepend(to_remove, key); } }

A common optimization is or using a per-key mutex: handle-with-cache.c

static UserProfile* load_user_profile_from_disk(int user_id) { // Simulate expensive I/O printf("Loading user %d from disk...\n", user_id); sleep(1); // Pretend this is slow UserProfile *profile = malloc(sizeof(UserProfile)); profile->user_id = user_id; profile->name = malloc(32); profile->email = malloc(64); sprintf(profile->name, "User_%d", user_id); sprintf(profile->email, "user%d@example.com", user_id); return profile; } This is the heart of the module. The cache is transparent to the caller. A "handle" is an opaque pointer or identifier

The module handle-with-cache.c exemplifies a classic design pattern: the . A "handle" is an opaque pointer or identifier to a resource, and the cache stores recently accessed handles to avoid redundant initialization or I/O operations. *key = user_id

// Store in cache (use user_id as key) int *key = malloc(sizeof(int)); *key = user_id; g_hash_table_insert(handle_cache, key, new_entry);