diff options
Diffstat (limited to 'lib/lru_cache.c')
| -rw-r--r-- | lib/lru_cache.c | 120 | 
1 files changed, 61 insertions, 59 deletions
diff --git a/lib/lru_cache.c b/lib/lru_cache.c index 4f638b86674..17621684758 100644 --- a/lib/lru_cache.c +++ b/lib/lru_cache.c @@ -308,45 +308,7 @@ static int lc_unused_element_available(struct lru_cache *lc)  	return 0;  } - -/** - * lc_get - get element by label, maybe change the active set - * @lc: the lru cache to operate on - * @enr: the label to look up - * - * Finds an element in the cache, increases its usage count, - * "touches" and returns it. - * - * In case the requested number is not present, it needs to be added to the - * cache. Therefore it is possible that an other element becomes evicted from - * the cache. In either case, the user is notified so he is able to e.g. keep - * a persistent log of the cache changes, and therefore the objects in use. - * - * Return values: - *  NULL - *     The cache was marked %LC_STARVING, - *     or the requested label was not in the active set - *     and a changing transaction is still pending (@lc was marked %LC_DIRTY). - *     Or no unused or free element could be recycled (@lc will be marked as - *     %LC_STARVING, blocking further lc_get() operations). - * - *  pointer to the element with the REQUESTED element number. - *     In this case, it can be used right away - * - *  pointer to an UNUSED element with some different element number, - *          where that different number may also be %LC_FREE. - * - *          In this case, the cache is marked %LC_DIRTY (blocking further changes), - *          and the returned element pointer is removed from the lru list and - *          hash collision chains.  The user now should do whatever housekeeping - *          is necessary. - *          Then he must call lc_changed(lc,element_pointer), to finish - *          the change. - * - * NOTE: The user needs to check the lc_number on EACH use, so he recognizes - *       any cache set change. - */ -struct lc_element *lc_get(struct lru_cache *lc, unsigned int enr) +static struct lc_element *__lc_get(struct lru_cache *lc, unsigned int enr, bool may_change)  {  	struct lc_element *e; @@ -366,6 +328,8 @@ struct lc_element *lc_get(struct lru_cache *lc, unsigned int enr)  	}  	++lc->misses; +	if (!may_change) +		RETURN(NULL);  	/* In case there is nothing available and we can not kick out  	 * the LRU element, we have to wait ... @@ -397,29 +361,67 @@ struct lc_element *lc_get(struct lru_cache *lc, unsigned int enr)  	RETURN(e);  } -/* similar to lc_get, - * but only gets a new reference on an existing element. - * you either get the requested element, or NULL. - * will be consolidated into one function. +/** + * lc_get - get element by label, maybe change the active set + * @lc: the lru cache to operate on + * @enr: the label to look up + * + * Finds an element in the cache, increases its usage count, + * "touches" and returns it. + * + * In case the requested number is not present, it needs to be added to the + * cache. Therefore it is possible that an other element becomes evicted from + * the cache. In either case, the user is notified so he is able to e.g. keep + * a persistent log of the cache changes, and therefore the objects in use. + * + * Return values: + *  NULL + *     The cache was marked %LC_STARVING, + *     or the requested label was not in the active set + *     and a changing transaction is still pending (@lc was marked %LC_DIRTY). + *     Or no unused or free element could be recycled (@lc will be marked as + *     %LC_STARVING, blocking further lc_get() operations). + * + *  pointer to the element with the REQUESTED element number. + *     In this case, it can be used right away + * + *  pointer to an UNUSED element with some different element number, + *          where that different number may also be %LC_FREE. + * + *          In this case, the cache is marked %LC_DIRTY (blocking further changes), + *          and the returned element pointer is removed from the lru list and + *          hash collision chains.  The user now should do whatever housekeeping + *          is necessary. + *          Then he must call lc_changed(lc,element_pointer), to finish + *          the change. + * + * NOTE: The user needs to check the lc_number on EACH use, so he recognizes + *       any cache set change.   */ -struct lc_element *lc_try_get(struct lru_cache *lc, unsigned int enr) +struct lc_element *lc_get(struct lru_cache *lc, unsigned int enr)  { -	struct lc_element *e; - -	PARANOIA_ENTRY(); -	if (lc->flags & LC_STARVING) { -		++lc->starving; -		RETURN(NULL); -	} +	return __lc_get(lc, enr, 1); +} -	e = lc_find(lc, enr); -	if (e) { -		++lc->hits; -		if (e->refcnt++ == 0) -			lc->used++; -		list_move(&e->list, &lc->in_use); /* Not evictable... */ -	} -	RETURN(e); +/** + * lc_try_get - get element by label, if present; do not change the active set + * @lc: the lru cache to operate on + * @enr: the label to look up + * + * Finds an element in the cache, increases its usage count, + * "touches" and returns it. + * + * Return values: + *  NULL + *     The cache was marked %LC_STARVING, + *     or the requested label was not in the active set + * + *  pointer to the element with the REQUESTED element number. + *     In this case, it can be used right away + */ +struct lc_element *lc_try_get(struct lru_cache *lc, unsigned int enr) +{ +	return __lc_get(lc, enr, 0);  }  /**  |