gdcache.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * gdcache.h
  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@graphviz.org) 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. #include <stdlib.h>
  42. #if (!defined(__OpenBSD__)) && defined(HAVE_MALLOC_H)
  43. #include <malloc.h>
  44. #endif
  45. #ifndef NULL
  46. #define NULL (void *)0
  47. #endif
  48. /* user defined function templates */
  49. typedef int (*gdCacheTestFn_t)(void *userdata, void *keydata);
  50. typedef void *(*gdCacheFetchFn_t)(char **error, void *keydata);
  51. typedef void (*gdCacheReleaseFn_t)(void *userdata);
  52. /* element structure */
  53. typedef struct gdCache_element_s gdCache_element_t;
  54. struct gdCache_element_s {
  55. gdCache_element_t *next;
  56. void *userdata;
  57. };
  58. /* head structure */
  59. typedef struct gdCache_head_s gdCache_head_t;
  60. struct gdCache_head_s {
  61. gdCache_element_t *mru;
  62. int size;
  63. char *error;
  64. gdCacheTestFn_t gdCacheTest;
  65. gdCacheFetchFn_t gdCacheFetch;
  66. gdCacheReleaseFn_t gdCacheRelease;
  67. };
  68. /* function templates */
  69. gdCache_head_t *
  70. gdCacheCreate(
  71. int size,
  72. gdCacheTestFn_t gdCacheTest,
  73. gdCacheFetchFn_t gdCacheFetch,
  74. gdCacheReleaseFn_t gdCacheRelease );
  75. void
  76. gdCacheDelete( gdCache_head_t *head );
  77. void *
  78. gdCacheGet( gdCache_head_t *head, void *keydata );