gdcache.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * $Id$
  3. *
  4. * Caches of pointers to user structs in which the least-recently-used
  5. * element is replaced in the event of a cache miss after the cache has
  6. * reached a given size.
  7. *
  8. * John Ellson (ellson@lucent.com) Oct 31, 1997
  9. *
  10. * Test this with:
  11. * gcc -o gdcache -g -Wall -DTEST gdcache.c
  12. *
  13. * The cache is implemented by a singly-linked list of elements
  14. * each containing a pointer to a user struct that is being managed by
  15. * the cache.
  16. *
  17. * The head structure has a pointer to the most-recently-used
  18. * element, and elements are moved to this position in the list each
  19. * time they are used. The head also contains pointers to three
  20. * user defined functions:
  21. * - a function to test if a cached userdata matches some keydata
  22. * - a function to provide a new userdata struct to the cache
  23. * if there has been a cache miss.
  24. * - a function to release a userdata struct when it is
  25. * no longer being managed by the cache
  26. *
  27. * In the event of a cache miss the cache is allowed to grow up to
  28. * a specified maximum size. After the maximum size is reached then
  29. * the least-recently-used element is discarded to make room for the
  30. * new. The most-recently-returned value is always left at the
  31. * beginning of the list after retrieval.
  32. *
  33. * In the current implementation the cache is traversed by a linear
  34. * search from most-recent to least-recent. This linear search
  35. * probably limits the usefulness of this implementation to cache
  36. * sizes of a few tens of elements.
  37. */
  38. /*********************************************************/
  39. /* header */
  40. /*********************************************************/
  41. #if (!defined(_OSD_POSIX) && !defined(__FreeBSD__)) && HAVE_MALLOC_H
  42. #include <malloc.h>
  43. #else
  44. #include <stdlib.h> /* BS2000/OSD defines malloc() & friends in stdlib.h */
  45. #endif
  46. #ifndef NULL
  47. #define NULL (void *)0
  48. #endif
  49. /* user defined function templates */
  50. typedef int (*gdCacheTestFn_t)(void *userdata, void *keydata);
  51. typedef void *(*gdCacheFetchFn_t)(char **error, void *keydata);
  52. typedef void (*gdCacheReleaseFn_t)(void *userdata);
  53. /* element structure */
  54. typedef struct gdCache_element_s gdCache_element_t;
  55. struct gdCache_element_s {
  56. gdCache_element_t *next;
  57. void *userdata;
  58. };
  59. /* head structure */
  60. typedef struct gdCache_head_s gdCache_head_t;
  61. struct gdCache_head_s {
  62. gdCache_element_t *mru;
  63. int size;
  64. char *error;
  65. gdCacheTestFn_t gdCacheTest;
  66. gdCacheFetchFn_t gdCacheFetch;
  67. gdCacheReleaseFn_t gdCacheRelease;
  68. };
  69. /* function templates */
  70. gdCache_head_t *
  71. gdCacheCreate(
  72. int size,
  73. gdCacheTestFn_t gdCacheTest,
  74. gdCacheFetchFn_t gdCacheFetch,
  75. gdCacheReleaseFn_t gdCacheRelease );
  76. void
  77. gdCacheDelete( gdCache_head_t *head );
  78. void *
  79. gdCacheGet( gdCache_head_t *head, void *keydata );