<!-- cache.xml orb package documentation Juergen Mueller Max Neunhoeffer Felix Noeske Copyright (C) 2005-2008 by the authors This chapter explains functionality for caches. --> <Chapter Label="cache"> <Heading>Caching techniques</Heading> <Section Label="cacheidea"> <Heading>The idea of caching</Heading> If one wants to work with a large number of large objects which require some time to prepare and one does not know beforehand, how often one will need each one, it makes sense to work with some sort of cache. A cache is a data structure to keep some of the objects already produced but not too many of them to waste a lot of memory. That is, objects which have not been used for some time can automatically be removed from the cache, whereas the objects which are used more frequently stay in the cache. This chapter describes an implementation of this idea used in the orbit-by-suborbit algorithms. </Section> <Section Label="cacheusage"> <Heading>Using caches</Heading> A cache is created using the following operation: <ManSection> <Oper Name="LinkedListCache" Arg="memorylimit"/> <Returns> A new cache object </Returns> <Description> This operation creates a new linked list cache that uses at most <A>memorylimit</A> bytes to store its entries. The cache is organised as a linked list, newly cached objects are appended at the beginning of the list, when the used memory grows over the limit, old objects are removed at the end of this list automatically. </Description> </ManSection> New objects are entered into the hash with the following function: <ManSection> <Oper Name="CacheObject" Arg="c, ob, mem"/> <Returns> A new node in the linked list cache </Returns> <Description> This operation enters the object <A>ob</A> into the cache <A>c</A>. The argument <A>mem</A> is an integer with the memory usage of the object <A>ob</A>. The object is prepended to the linked list cache and enough objects at the end are removed to enforce the memory usage limit. </Description> </ManSection> <ManSection> <Oper Name="ClearCache" Arg="c"/> <Returns> Nothing </Returns> <Description> Completely clears the cache <A>c</A> removing all nodes. </Description> </ManSection> A linked list cache is used as follows: Whenever you compute one of the objects you store it in the cache using <Ref Oper="CacheObject"/> and retain the linked list node that is returned. The usual place to retain it would be in a weak pointer object, such that this reference does not prevent the object to be garbage collected. When you next need this object, you check its corresponding position in the weak pointer object, if the reference is still there, you just use it and tell the cache that it was used again by calling <Ref Oper="UseCacheObject"/>, otherwise you create it anew and store it in the cache again. <P/> As long as the object stays in the cache it is not garbage collected and the weak pointer object will still have its reference. As soon as the object is thrown out of the cache, the only reference to its node is the weak pointer object, thus if a garbage collection happens, it can be garbage collected. Note that before that garbage collection happens, the object might still be accessible via the weak pointer object. In this way, the available main memory in the workspace is used very efficiently and can be freed immediately when needed. <ManSection> <Oper Name="UseCacheObject" Arg="c, r"/> <Returns> Nothing </Returns> <Description> The argument <A>c</A> must be a cache object and <A>r</A> a node for such a cache. The object is either moved to the front of the linked list (if it is still in the cache) or it is re-cached. If necessary, objects at the end are removed from the cache to enforce the memory usage limit. </Description> </ManSection> </Section> <!-- ############################################################ --> </Chapter>