shm_toc.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /*-------------------------------------------------------------------------
  2. *
  3. * shm_toc.h
  4. * shared memory segment table of contents
  5. *
  6. * This is intended to provide a simple way to divide a chunk of shared
  7. * memory (probably dynamic shared memory allocated via dsm_create) into
  8. * a number of regions and keep track of the addresses of those regions or
  9. * key data structures within those regions. This is not intended to
  10. * scale to a large number of keys and will perform poorly if used that
  11. * way; if you need a large number of pointers, store them within some
  12. * other data structure within the segment and only put the pointer to
  13. * the data structure itself in the table of contents.
  14. *
  15. * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
  16. * Portions Copyright (c) 1994, Regents of the University of California
  17. *
  18. * src/include/storage/shm_toc.h
  19. *
  20. *-------------------------------------------------------------------------
  21. */
  22. #ifndef SHM_TOC_H
  23. #define SHM_TOC_H
  24. #include "storage/shmem.h" /* for add_size() */
  25. /* shm_toc is an opaque type known only within shm_toc.c */
  26. typedef struct shm_toc shm_toc;
  27. extern shm_toc *shm_toc_create(uint64 magic, void *address, Size nbytes);
  28. extern shm_toc *shm_toc_attach(uint64 magic, void *address);
  29. extern void *shm_toc_allocate(shm_toc *toc, Size nbytes);
  30. extern Size shm_toc_freespace(shm_toc *toc);
  31. extern void shm_toc_insert(shm_toc *toc, uint64 key, void *address);
  32. extern void *shm_toc_lookup(shm_toc *toc, uint64 key, bool noError);
  33. /*
  34. * Tools for estimating how large a chunk of shared memory will be needed
  35. * to store a TOC and its dependent objects. Note: we don't really support
  36. * large numbers of keys, but it's convenient to declare number_of_keys
  37. * as a Size anyway.
  38. */
  39. typedef struct
  40. {
  41. Size space_for_chunks;
  42. Size number_of_keys;
  43. } shm_toc_estimator;
  44. #define shm_toc_initialize_estimator(e) \
  45. ((e)->space_for_chunks = 0, (e)->number_of_keys = 0)
  46. #define shm_toc_estimate_chunk(e, sz) \
  47. ((e)->space_for_chunks = add_size((e)->space_for_chunks, BUFFERALIGN(sz)))
  48. #define shm_toc_estimate_keys(e, cnt) \
  49. ((e)->number_of_keys = add_size((e)->number_of_keys, cnt))
  50. extern Size shm_toc_estimate(shm_toc_estimator *e);
  51. #endif /* SHM_TOC_H */