_alloc.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. *
  3. * Copyright (c) 1996,1997
  4. * Silicon Graphics Computer Systems, Inc.
  5. *
  6. * Copyright (c) 1997
  7. * Moscow Center for SPARC Technology
  8. *
  9. * Copyright (c) 1999
  10. * Boris Fomitchev
  11. *
  12. * This material is provided "as is", with absolutely no warranty expressed
  13. * or implied. Any use is at your own risk.
  14. *
  15. * Permission to use or copy this software for any purpose is hereby granted
  16. * without fee, provided the above notices are retained on all copies.
  17. * Permission to modify the code and to distribute modified code is granted,
  18. * provided the above notices are retained, and a notice that the code was
  19. * modified is included with the above copyright notice.
  20. *
  21. */
  22. #ifndef _STLP_ALLOC_C
  23. #define _STLP_ALLOC_C
  24. #ifndef _STLP_INTERNAL_ALLOC_H
  25. # include <stl/_alloc.h>
  26. #endif
  27. #if defined (__WATCOMC__)
  28. # pragma warning 13 9
  29. # pragma warning 367 9
  30. # pragma warning 368 9
  31. #endif
  32. _STLP_BEGIN_NAMESPACE
  33. template <class _Alloc>
  34. void * _STLP_CALL __debug_alloc<_Alloc>::allocate(size_t __n) {
  35. size_t __total_extra = __extra_before_chunk() + __extra_after_chunk();
  36. size_t __real_n = __n + __total_extra;
  37. if (__real_n < __n) {
  38. //It means that we rolled on size_t, __n must be very large:
  39. _STLP_THROW_BAD_ALLOC;
  40. }
  41. __alloc_header *__result = (__alloc_header *)__allocator_type::allocate(__real_n);
  42. memset((char*)__result, __shred_byte, __real_n * sizeof(value_type));
  43. __result->__magic = __magic;
  44. __result->__type_size = sizeof(value_type);
  45. __result->_M_size = (_STLP_UINT32_T)__n;
  46. return ((char*)__result) + (long)__extra_before;
  47. }
  48. template <class _Alloc>
  49. void _STLP_CALL
  50. __debug_alloc<_Alloc>::deallocate(void *__p, size_t __n) {
  51. __alloc_header * __real_p = (__alloc_header*)((char *)__p -(long)__extra_before);
  52. // check integrity
  53. _STLP_VERBOSE_ASSERT(__real_p->__magic != __deleted_magic, _StlMsg_DBA_DELETED_TWICE)
  54. _STLP_VERBOSE_ASSERT(__real_p->__magic == __magic, _StlMsg_DBA_NEVER_ALLOCATED)
  55. _STLP_VERBOSE_ASSERT(__real_p->__type_size == 1,_StlMsg_DBA_TYPE_MISMATCH)
  56. _STLP_VERBOSE_ASSERT(__real_p->_M_size == __n, _StlMsg_DBA_SIZE_MISMATCH)
  57. // check pads on both sides
  58. unsigned char* __tmp;
  59. for (__tmp = (unsigned char*)(__real_p + 1); __tmp < (unsigned char*)__p; ++__tmp) {
  60. _STLP_VERBOSE_ASSERT(*__tmp == __shred_byte, _StlMsg_DBA_UNDERRUN)
  61. }
  62. size_t __real_n = __n + __extra_before_chunk() + __extra_after_chunk();
  63. for (__tmp= ((unsigned char*)__p) + __n * sizeof(value_type);
  64. __tmp < ((unsigned char*)__real_p) + __real_n ; ++__tmp) {
  65. _STLP_VERBOSE_ASSERT(*__tmp == __shred_byte, _StlMsg_DBA_OVERRUN)
  66. }
  67. // that may be unfortunate, just in case
  68. __real_p->__magic = __deleted_magic;
  69. memset((char*)__p, __shred_byte, __n * sizeof(value_type));
  70. __allocator_type::deallocate(__real_p, __real_n);
  71. }
  72. _STLP_END_NAMESPACE
  73. #endif /* _STLP_ALLOC_C */
  74. // Local Variables:
  75. // mode:C++
  76. // End: