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