177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1994
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Hewlett-Packard Company
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1996,1997
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc.
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1997
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Moscow Center for SPARC Technology
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk.
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies.
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted,
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice.
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_PTHREAD_ALLOC_H
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_PTHREAD_ALLOC_H
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Pthread-specific node allocator.
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This is similar to the default allocator, except that free-list
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * information is kept separately for each thread, avoiding locking.
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This should be reasonably fast even in the presence of threads.
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * The down side is that storage may not be well-utilized.
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * It is not an error to allocate memory in thread A and deallocate
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * it in thread B.  But this effectively transfers ownership of the memory,
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * so that it can only be reallocated by thread B.  Thus this can effectively
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * result in a storage leak if it's done on a regular basis.
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * It can also result in frequent sharing of
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * cache lines among processors, with potentially serious performance
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * consequences.
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if !defined (_STLP_PTHREADS)
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  error POSIX specific allocator implementation. Your system do not seems to \
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerhave this interface so please comment the _STLP_USE_PERTHREAD_ALLOC macro \
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turneror report to the STLport forum.
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_NO_IOSTREAMS)
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  error You cannot use per thread allocator implementation without building \
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' TurnerSTLport libraries.
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_ALLOC_H
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_alloc.h>
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Pthread_alloc_per_thread_state;
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Pthread-specific allocator.
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _STLP_CLASS_DECLSPEC _Pthread_alloc {
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic: // but only for internal use:
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Pthread_alloc_per_thread_state __state_type;
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef char value_type;
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Return a recycled or new per thread state.
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static __state_type * _STLP_CALL _S_get_per_thread_state();
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* n must be > 0      */
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void * _STLP_CALL allocate(size_t& __n);
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* p may not be 0 */
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void _STLP_CALL deallocate(void *__p, size_t __n);
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // boris : versions for per_thread_allocator
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* n must be > 0      */
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void * _STLP_CALL allocate(size_t& __n, __state_type* __a);
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* p may not be 0 */
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void _STLP_CALL deallocate(void *__p, size_t __n, __state_type* __a);
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  static void * _STLP_CALL reallocate(void *__p, size_t __old_sz, size_t& __new_sz);
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef _STLP_PRIV _Pthread_alloc __pthread_alloc;
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertypedef __pthread_alloc pthread_alloc;
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass pthread_allocator : public __stlport_class<pthread_allocator<_Tp> > {
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef pthread_alloc _S_Alloc;          // The underlying allocator.
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef size_t     size_type;
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef ptrdiff_t  difference_type;
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp*       pointer;
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp* const_pointer;
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp&       reference;
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp& const_reference;
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp        value_type;
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _NewType> struct rebind {
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef pthread_allocator<_NewType> other;
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  };
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pthread_allocator() _STLP_NOTHROW {}
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pthread_allocator(const pthread_allocator<_Tp>& a) _STLP_NOTHROW {}
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MEMBER_TEMPLATES) /* && defined (_STLP_FUNCTION_PARTIAL_ORDER) */
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _OtherType> pthread_allocator(const pthread_allocator<_OtherType>&)
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_NOTHROW {}
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~pthread_allocator() _STLP_NOTHROW {}
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pointer address(reference __x) const { return &__x; }
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const_pointer address(const_reference __x) const { return &__x; }
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // __n is permitted to be 0.  The C++ standard says nothing about what
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // the return value is when __n == 0.
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, const void* = 0) {
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n > max_size()) {
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_THROW_BAD_ALLOC;
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n != 0) {
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      size_type __buf_size = __n * sizeof(value_type);
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _Tp* __ret = __REINTERPRET_CAST(value_type*, _S_Alloc::allocate(__buf_size));
13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size);
13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return __ret;
14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return 0;
14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void deallocate(pointer __p, size_type __n) {
14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_ASSERT( (__p == 0) == (__n == 0) )
14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__p != 0) {
14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__p, _STLP_SHRED_BYTE, __n * sizeof(value_type));
15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _S_Alloc::deallocate(__p, __n * sizeof(value_type));
15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_type max_size() const _STLP_NOTHROW
15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return size_t(-1) / sizeof(_Tp); }
15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void destroy(pointer _p) { _p->~_Tp(); }
16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_NO_EXTENSIONS)
16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* STLport extension giving rounded size of an allocated memory buffer
16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * This method do not have to be part of a user defined allocator implementation
16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * and won't even be called if such a function was granted.
16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:
16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
16877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, size_type& __allocated_n) {
16977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n > max_size()) {
17077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_THROW_BAD_ALLOC;
17177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
17277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n != 0) {
17377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      size_type __buf_size = __n * sizeof(value_type);
17477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _Tp* __ret = __REINTERPRET_CAST(value_type*, _S_Alloc::allocate(__buf_size));
17577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
17677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size);
17777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
17877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      __allocated_n = __buf_size / sizeof(value_type);
17977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return __ret;
18077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
18177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
18277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return 0;
18377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
18477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_USE_PARTIAL_SPEC_WORKAROUND) && !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
18577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void _M_swap_workaround(pthread_allocator<_Tp>& __x) {}
18677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
18777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
18877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
18977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
19077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _STLP_CLASS_DECLSPEC pthread_allocator<void> {
19177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
19277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef size_t      size_type;
19377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef ptrdiff_t   difference_type;
19477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef void*       pointer;
19577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const void* const_pointer;
19677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef void        value_type;
19777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
19877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _NewType> struct rebind {
19977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef pthread_allocator<_NewType> other;
20077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  };
20177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
20277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
20377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
20477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _T1, class _T2>
20577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator==(const pthread_allocator<_T1>&,
20677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                       const pthread_allocator<_T2>& a2)
20777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return true; }
20877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
20977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
21077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _T1, class _T2>
21177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator!=(const pthread_allocator<_T1>&,
21277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                       const pthread_allocator<_T2>&)
21377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return false; }
21477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
21577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
21877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
21977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp, class _Atype>
22077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Alloc_traits<_Tp, pthread_allocator<_Atype> >
22177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef pthread_allocator<_Tp> allocator_type; };
22277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
22477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE)
22677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
22777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2>
22877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline pthread_allocator<_Tp2>&
22977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_rebind(pthread_allocator<_Tp1>& __x, const _Tp2*)
23077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (pthread_allocator<_Tp2>&)__x; }
23177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2>
23377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline pthread_allocator<_Tp2>
23477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_create(pthread_allocator<_Tp1>&, const _Tp2*)
23577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return pthread_allocator<_Tp2>(); }
23677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
23877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
23977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
24077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
24177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
24277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __pthread_alloc_type_traits {
24377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename _IsSTLportClass<pthread_allocator<_Tp> >::_Ret _STLportAlloc;
24477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //The default allocator implementation which is recognize thanks to the
24577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //__stlport_class inheritance is a stateless object so:
24677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_default_constructor;
24777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_copy_constructor;
24877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_assignment_operator;
24977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_destructor;
25077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc is_POD_type;
25177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
25277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
25477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
25577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
25677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
25777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<pthread_allocator<_Tp> > : _STLP_PRIV __pthread_alloc_type_traits<_Tp> {};
25877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
25977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
26077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<pthread_allocator<char> > : _STLP_PRIV __pthread_alloc_type_traits<char> {};
26177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_HAS_WCHAR_T)
26277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
26377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<pthread_allocator<wchar_t> > : _STLP_PRIV __pthread_alloc_type_traits<wchar_t> {};
26477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
26577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_USE_PTR_SPECIALIZATIONS)
26677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
26777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<pthread_allocator<void*> > : _STLP_PRIV __pthread_alloc_type_traits<void*> {};
26877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
26977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
27077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
27177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
27277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// per_thread_allocator<> : this allocator always return memory to the same thread
27377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// it was allocated from.
27477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner//
27577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
27677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
27777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass per_thread_allocator {
27877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef pthread_alloc _S_Alloc;          // The underlying allocator.
27977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef pthread_alloc::__state_type __state_type;
28077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
28177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef size_t     size_type;
28277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef ptrdiff_t  difference_type;
28377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp*       pointer;
28477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp* const_pointer;
28577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp&       reference;
28677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const _Tp& const_reference;
28777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _Tp        value_type;
28877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
28977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
29077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _NewType> struct rebind {
29177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef per_thread_allocator<_NewType> other;
29277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  };
29377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
29477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
29577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  per_thread_allocator() _STLP_NOTHROW {
29677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_state = _S_Alloc::_S_get_per_thread_state();
29777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
29877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  per_thread_allocator(const per_thread_allocator<_Tp>& __a) _STLP_NOTHROW : _M_state(__a._M_state){}
29977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_MEMBER_TEMPLATES) /* && defined (_STLP_FUNCTION_PARTIAL_ORDER) */
30177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _OtherType> per_thread_allocator(const per_thread_allocator<_OtherType>& __a)
30277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_NOTHROW : _M_state(__a._M_state) {}
30377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
30477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~per_thread_allocator() _STLP_NOTHROW {}
30677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
30777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  pointer address(reference __x) const { return &__x; }
30877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  const_pointer address(const_reference __x) const { return &__x; }
30977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
31077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // __n is permitted to be 0.  The C++ standard says nothing about what
31177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // the return value is when __n == 0.
31277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, const void* = 0) {
31377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n > max_size()) {
31477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_THROW_BAD_ALLOC;
31577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
31677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n != 0) {
31777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      size_type __buf_size = __n * sizeof(value_type);
31877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _Tp* __ret = __REINTERPRET_CAST(_Tp*, _S_Alloc::allocate(__buf_size, _M_state));
31977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
32077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size);
32177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
32277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return __ret;
32377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
32477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
32577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return 0;
32677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
32777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
32877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void deallocate(pointer __p, size_type __n) {
32977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_ASSERT( (__p == 0) == (__n == 0) )
33077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__p != 0) {
33177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
33277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__p, _STLP_SHRED_BYTE, __n * sizeof(value_type));
33377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
33477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _S_Alloc::deallocate(__p, __n * sizeof(value_type), _M_state);
33577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
33677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
33777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
33877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  size_type max_size() const _STLP_NOTHROW
33977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  { return size_t(-1) / sizeof(_Tp); }
34077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
34177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }
34277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void destroy(pointer _p) { _p->~_Tp(); }
34377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
34477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // state is being kept here
34577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  __state_type* _M_state;
34677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
34777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_NO_EXTENSIONS)
34877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  /* STLport extension giving rounded size of an allocated memory buffer
34977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * This method do not have to be part of a user defined allocator implementation
35077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   * and won't even be called if such a function was granted.
35177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner   */
35277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprotected:
35377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
35477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* allocate(size_type __n, size_type& __allocated_n) {
35577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n > max_size()) {
35677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _STLP_THROW_BAD_ALLOC;
35777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
35877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (__n != 0) {
35977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      size_type __buf_size = __n * sizeof(value_type);
36077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _Tp* __ret = __REINTERPRET_CAST(value_type*, _S_Alloc::allocate(__buf_size, _M_state));
36177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_DEBUG_ALLOC)
36277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      memset((char*)__ret, _STLP_SHRED_BYTE, __buf_size);
36377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
36477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      __allocated_n = __buf_size / sizeof(value_type);
36577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return __ret;
36677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
36777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    else
36877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      return 0;
36977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
37077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
37177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
37277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
37377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _STLP_CLASS_DECLSPEC per_thread_allocator<void> {
37477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
37577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef size_t      size_type;
37677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef ptrdiff_t   difference_type;
37777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef void*       pointer;
37877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef const void* const_pointer;
37977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef void        value_type;
38077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
38177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  template <class _NewType> struct rebind {
38277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef per_thread_allocator<_NewType> other;
38377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  };
38477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
38577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
38677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
38777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _T1, class _T2>
38877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator==(const per_thread_allocator<_T1>& __a1,
38977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                       const per_thread_allocator<_T2>& __a2)
39077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __a1._M_state == __a2._M_state; }
39177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
39377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _T1, class _T2>
39477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline bool operator!=(const per_thread_allocator<_T1>& __a1,
39577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                       const per_thread_allocator<_T2>& __a2)
39677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return __a1._M_state != __a2._M_state; }
39777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
39877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
39977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
40077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
40177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
40277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp, class _Atype>
40377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct _Alloc_traits<_Tp, per_thread_allocator<_Atype> >
40477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ typedef per_thread_allocator<_Tp> allocator_type; };
40577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
40677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
40777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
40877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE)
40977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
41077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2>
41177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline per_thread_allocator<_Tp2>&
41277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_rebind(per_thread_allocator<_Tp1>& __x, const _Tp2*)
41377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return (per_thread_allocator<_Tp2>&)__x; }
41477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
41577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp1, class _Tp2>
41677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline per_thread_allocator<_Tp2>
41777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__stl_alloc_create(per_thread_allocator<_Tp1>&, const _Tp2*)
41877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{ return per_thread_allocator<_Tp2>(); }
41977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
42077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_DONT_SUPPORT_REBIND_MEMBER_TEMPLATE */
42177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
42277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_PRIV_NAMESPACE
42377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
42477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
42577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __perthread_alloc_type_traits {
42677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef typename _IsSTLportClass<per_thread_allocator<_Tp> >::_Ret _STLportAlloc;
42777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //The default allocator implementation which is recognize thanks to the
42877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  //__stlport_class inheritance is a stateless object so:
42977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef __false_type has_trivial_default_constructor;
43077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_copy_constructor;
43177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_assignment_operator;
43277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef _STLportAlloc has_trivial_destructor;
43377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  typedef __false_type is_POD_type;
43477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
43577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_MOVE_TO_STD_NAMESPACE
43777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
43877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
43977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
44077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<per_thread_allocator<_Tp> > : _STLP_PRIV __perthread_alloc_type_traits<_Tp> {};
44177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#else
44277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
44377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<per_thread_allocator<char> > : _STLP_PRIV __perthread_alloc_type_traits<char> {};
44477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_HAS_WCHAR_T)
44577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
44677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<per_thread_allocator<wchar_t> > : _STLP_PRIV __perthread_alloc_type_traits<wchar_t> {};
44777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
44877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  if defined (_STLP_USE_PTR_SPECIALIZATIONS)
44977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_TEMPLATE_NULL
45077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct __type_traits<per_thread_allocator<void*> > : _STLP_PRIV __perthread_alloc_type_traits<void*> {};
45177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  endif
45277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
45377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
45477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
45577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
45677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
45777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_PTHREAD_ALLOC */
45877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
45977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables:
46077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++
46177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End:
462