177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1996,1997
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc.
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1997
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Moscow Center for SPARC Technology
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk.
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies.
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted,
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice.
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_ALLOC_C
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_ALLOC_C
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ALLOC_H
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_alloc.h>
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (__WATCOMC__)
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  pragma warning 13 9
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  pragma warning 367 9
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  pragma warning 368 9
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Alloc>
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid * _STLP_CALL __debug_alloc<_Alloc>::allocate(size_t __n) {
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t __total_extra = __extra_before_chunk() + __extra_after_chunk();
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t __real_n = __n + __total_extra;
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  if (__real_n < __n) {
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    //It means that we rolled on size_t, __n must be very large:
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_THROW_BAD_ALLOC;
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __alloc_header *__result = (__alloc_header *)__allocator_type::allocate(__real_n);
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset((char*)__result, __shred_byte, __real_n * sizeof(value_type));
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __result->__magic = __magic;
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __result->__type_size = sizeof(value_type);
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __result->_M_size = (_STLP_UINT32_T)__n;
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return ((char*)__result) + (long)__extra_before;
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Alloc>
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnervoid  _STLP_CALL
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__debug_alloc<_Alloc>::deallocate(void *__p, size_t __n) {
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __alloc_header * __real_p = (__alloc_header*)((char *)__p -(long)__extra_before);
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // check integrity
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_VERBOSE_ASSERT(__real_p->__magic != __deleted_magic, _StlMsg_DBA_DELETED_TWICE)
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_VERBOSE_ASSERT(__real_p->__magic == __magic, _StlMsg_DBA_NEVER_ALLOCATED)
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_VERBOSE_ASSERT(__real_p->__type_size == 1,_StlMsg_DBA_TYPE_MISMATCH)
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _STLP_VERBOSE_ASSERT(__real_p->_M_size == __n, _StlMsg_DBA_SIZE_MISMATCH)
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // check pads on both sides
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  unsigned char* __tmp;
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (__tmp = (unsigned char*)(__real_p + 1); __tmp < (unsigned char*)__p; ++__tmp) {
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_VERBOSE_ASSERT(*__tmp == __shred_byte, _StlMsg_DBA_UNDERRUN)
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_t __real_n = __n + __extra_before_chunk() + __extra_after_chunk();
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  for (__tmp= ((unsigned char*)__p) + __n * sizeof(value_type);
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner       __tmp < ((unsigned char*)__real_p) + __real_n ; ++__tmp) {
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_VERBOSE_ASSERT(*__tmp == __shred_byte, _StlMsg_DBA_OVERRUN)
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // that may be unfortunate, just in case
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __real_p->__magic = __deleted_magic;
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  memset((char*)__p, __shred_byte, __n * sizeof(value_type));
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __allocator_type::deallocate(__real_p, __real_n);
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /*  _STLP_ALLOC_C */
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables:
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End:
88