/** * Based on the timestamp, determine the proper token keys to use limiting * to the first ``count'' items. * * @return NULL if we cannot locate any suitable keys. */ static const struct tokkey * find_tokkey_upto(time_t now, size_t count) { time_t adjusted = now - VERSION_ANCIENT_BAN; uint i; if (GNET_PROPERTY(version_debug) > 4) { g_debug("%s: count=%zu, from %s()", G_STRFUNC, count, stacktrace_caller_name(1)); } g_assert(count <= G_N_ELEMENTS(token_keys)); for (i = 0; i < count; i++) { const struct tokkey *tk = &token_keys[i]; if (GNET_PROPERTY(version_debug) > 4) { g_debug("%s: index=%u, ver.timestamp=%u, adjusted=%u (%s)", G_STRFUNC, i, (unsigned) tk->ver.timestamp, (unsigned) adjusted, tk->ver.timestamp > adjusted ? "OK" : i + 1 == count ? "FAILED" : "no"); } if (tk->ver.timestamp > adjusted) return tk; } return NULL; }
/** * Invalidate possibly cached page. * * This is used when we know a new and fresh copy of the page is held on * the disk. Further access to the page will require reloading the * page from disk. */ void lru_invalidate(DBM *db, long bno) { struct lru_cache *cache = db->cache; void *value; if ( g_hash_table_lookup_extended(cache->pagnum, ulong_to_pointer(bno), NULL, &value) ) { long idx = pointer_to_int(value); g_assert(idx >= 0 && idx < cache->pages); g_assert(cache->numpag[idx] == bno); /* * One should never be invalidating a dirty page, unless something * went wrong during a split and we're trying to undo things. * Since the operation will cause a data loss, warn. */ if (cache->dirty[idx]) { g_warning("sdbm: \"%s\": %s() invalidating dirty page #%ld", db->name, stacktrace_caller_name(1), bno); } hash_list_remove(cache->used, value); g_hash_table_remove(cache->pagnum, ulong_to_pointer(bno)); cache->numpag[idx] = -1; cache->dirty[idx] = FALSE; slist_append(cache->available, value); /* Make index available */ } }