/libs/headers/gc/gc_typed.h

http://github.com/nddrylliog/ooc · C++ Header · 111 lines · 38 code · 13 blank · 60 comment · 0 complexity · e5a2690199a5700d490c9f9119393279 MD5 · raw file

  1. /*
  2. * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
  3. * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved.
  4. * Copyright 1996 Silicon Graphics. All rights reserved.
  5. *
  6. * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
  7. * OR IMPLIED. ANY USE IS AT YOUR OWN RISK.
  8. *
  9. * Permission is hereby granted to use or copy this program
  10. * for any purpose, provided the above notices are retained on all copies.
  11. * Permission to modify the code and to distribute modified code is granted,
  12. * provided the above notices are retained, and a notice that the code was
  13. * modified is included with the above copyright notice.
  14. */
  15. /*
  16. * Some simple primitives for allocation with explicit type information.
  17. * Facilities for dynamic type inference may be added later.
  18. * Should be used only for extremely performance critical applications,
  19. * or if conservative collector leakage is otherwise a problem (unlikely).
  20. * Note that this is implemented completely separately from the rest
  21. * of the collector, and is not linked in unless referenced.
  22. * This does not currently support GC_DEBUG in any interesting way.
  23. */
  24. /* Boehm, May 19, 1994 2:13 pm PDT */
  25. #ifndef _GC_TYPED_H
  26. # define _GC_TYPED_H
  27. # ifndef _GC_H
  28. # include "gc.h"
  29. # endif
  30. #ifdef __cplusplus
  31. extern "C" {
  32. #endif
  33. typedef GC_word * GC_bitmap;
  34. /* The least significant bit of the first word is one if */
  35. /* the first word in the object may be a pointer. */
  36. # define GC_WORDSZ (8*sizeof(GC_word))
  37. # define GC_get_bit(bm, index) \
  38. (((bm)[index/GC_WORDSZ] >> (index%GC_WORDSZ)) & 1)
  39. # define GC_set_bit(bm, index) \
  40. (bm)[index/GC_WORDSZ] |= ((GC_word)1 << (index%GC_WORDSZ))
  41. # define GC_WORD_OFFSET(t, f) (offsetof(t,f)/sizeof(GC_word))
  42. # define GC_WORD_LEN(t) (sizeof(t)/ sizeof(GC_word))
  43. # define GC_BITMAP_SIZE(t) ((GC_WORD_LEN(t) + GC_WORDSZ-1)/GC_WORDSZ)
  44. typedef GC_word GC_descr;
  45. GC_API GC_descr GC_make_descriptor(GC_bitmap bm, size_t len);
  46. /* Return a type descriptor for the object whose layout */
  47. /* is described by the argument. */
  48. /* The least significant bit of the first word is one */
  49. /* if the first word in the object may be a pointer. */
  50. /* The second argument specifies the number of */
  51. /* meaningful bits in the bitmap. The actual object */
  52. /* may be larger (but not smaller). Any additional */
  53. /* words in the object are assumed not to contain */
  54. /* pointers. */
  55. /* Returns a conservative approximation in the */
  56. /* (unlikely) case of insufficient memory to build */
  57. /* the descriptor. Calls to GC_make_descriptor */
  58. /* may consume some amount of a finite resource. This */
  59. /* is intended to be called once per type, not once */
  60. /* per allocation. */
  61. /* It is possible to generate a descriptor for a C type T with */
  62. /* word aligned pointer fields f1, f2, ... as follows: */
  63. /* */
  64. /* GC_descr T_descr; */
  65. /* GC_word T_bitmap[GC_BITMAP_SIZE(T)] = {0}; */
  66. /* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f1)); */
  67. /* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f2)); */
  68. /* ... */
  69. /* T_descr = GC_make_descriptor(T_bitmap, GC_WORD_LEN(T)); */
  70. GC_API void * GC_malloc_explicitly_typed(size_t size_in_bytes, GC_descr d);
  71. /* Allocate an object whose layout is described by d. */
  72. /* The resulting object MAY NOT BE PASSED TO REALLOC. */
  73. /* The returned object is cleared. */
  74. GC_API void * GC_malloc_explicitly_typed_ignore_off_page
  75. (size_t size_in_bytes, GC_descr d);
  76. GC_API void * GC_calloc_explicitly_typed(size_t nelements,
  77. size_t element_size_in_bytes,
  78. GC_descr d);
  79. /* Allocate an array of nelements elements, each of the */
  80. /* given size, and with the given descriptor. */
  81. /* The elemnt size must be a multiple of the byte */
  82. /* alignment required for pointers. E.g. on a 32-bit */
  83. /* machine with 16-bit aligned pointers, size_in_bytes */
  84. /* must be a multiple of 2. */
  85. /* Returned object is cleared. */
  86. #ifdef GC_DEBUG
  87. # define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) GC_MALLOC(bytes)
  88. # define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes)
  89. #else
  90. # define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) \
  91. GC_malloc_explicitly_typed(bytes, d)
  92. # define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) \
  93. GC_calloc_explicitly_typed(n, bytes, d)
  94. #endif /* !GC_DEBUG */
  95. #ifdef __cplusplus
  96. } /* matches extern "C" */
  97. #endif
  98. #endif /* _GC_TYPED_H */