⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pthread_alloc

📁 c++ STL source code, hash and vector etc
💻
📖 第 1 页 / 共 2 页
字号:
    if (__bytes_left >= __total_bytes) {        __result = _S_start_free;        _S_start_free += __total_bytes;        return(__result);    } else if (__bytes_left >= __size) {        __nobjs = __bytes_left/__size;        __total_bytes = __size * __nobjs;        __result = _S_start_free;        _S_start_free += __total_bytes;        return(__result);    } else {        size_t __bytes_to_get =		2 * __total_bytes + _S_round_up(_S_heap_size >> 4);        // Try to make use of the left-over piece.        if (__bytes_left > 0) {            _Pthread_alloc_per_thread_state<_Max_size>* __a =                 (_Pthread_alloc_per_thread_state<_Max_size>*)			pthread_getspecific(_S_key);            __obj * volatile * __my_free_list =                        __a->__free_list + _S_freelist_index(__bytes_left);            ((__obj *)_S_start_free) -> __free_list_link = *__my_free_list;            *__my_free_list = (__obj *)_S_start_free;        }#       ifdef _SGI_SOURCE          // Try to get memory that's aligned on something like a          // cache line boundary, so as to avoid parceling out          // parts of the same line to different threads and thus          // possibly different processors.          {            const int __cache_line_size = 128;  // probable upper bound            __bytes_to_get &= ~(__cache_line_size-1);            _S_start_free = (char *)memalign(__cache_line_size, __bytes_to_get);             if (0 == _S_start_free) {              _S_start_free = (char *)malloc_alloc::allocate(__bytes_to_get);            }          }#       else  /* !SGI_SOURCE */          _S_start_free = (char *)malloc_alloc::allocate(__bytes_to_get);#       endif        _S_heap_size += __bytes_to_get;        _S_end_free = _S_start_free + __bytes_to_get;    }  }  // lock is released here  return(_S_chunk_alloc(__size, __nobjs));}/* Returns an object of size n, and optionally adds to size n free list.*//* We assume that n is properly aligned.                                *//* We hold the allocation lock.                                         */template <size_t _Max_size>void *_Pthread_alloc_per_thread_state<_Max_size>::_M_refill(size_t __n){    int __nobjs = 128;    char * __chunk =	_Pthread_alloc_template<_Max_size>::_S_chunk_alloc(__n, __nobjs);    __obj * volatile * __my_free_list;    __obj * __result;    __obj * __current_obj, * __next_obj;    int __i;    if (1 == __nobjs)  {        return(__chunk);    }    __my_free_list = __free_list		 + _Pthread_alloc_template<_Max_size>::_S_freelist_index(__n);    /* Build free list in chunk */      __result = (__obj *)__chunk;      *__my_free_list = __next_obj = (__obj *)(__chunk + __n);      for (__i = 1; ; __i++) {        __current_obj = __next_obj;        __next_obj = (__obj *)((char *)__next_obj + __n);        if (__nobjs - 1 == __i) {            __current_obj -> __free_list_link = 0;            break;        } else {            __current_obj -> __free_list_link = __next_obj;        }      }    return(__result);}template <size_t _Max_size>void *_Pthread_alloc_template<_Max_size>::reallocate(void *__p, size_t __old_sz, size_t __new_sz){    void * __result;    size_t __copy_sz;    if (__old_sz > _Max_size	&& __new_sz > _Max_size) {        return(realloc(__p, __new_sz));    }    if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p);    __result = allocate(__new_sz);    __copy_sz = __new_sz > __old_sz? __old_sz : __new_sz;    memcpy(__result, __p, __copy_sz);    deallocate(__p, __old_sz);    return(__result);}template <size_t _Max_size>_Pthread_alloc_per_thread_state<_Max_size> *_Pthread_alloc_template<_Max_size>::_S_free_per_thread_states = 0;template <size_t _Max_size>pthread_key_t _Pthread_alloc_template<_Max_size>::_S_key;template <size_t _Max_size>bool _Pthread_alloc_template<_Max_size>::_S_key_initialized = false;template <size_t _Max_size>pthread_mutex_t _Pthread_alloc_template<_Max_size>::_S_chunk_allocator_lock= PTHREAD_MUTEX_INITIALIZER;template <size_t _Max_size>char *_Pthread_alloc_template<_Max_size>::_S_start_free = 0;template <size_t _Max_size>char *_Pthread_alloc_template<_Max_size>::_S_end_free = 0;template <size_t _Max_size>size_t _Pthread_alloc_template<_Max_size>::_S_heap_size = 0;#ifdef __STL_USE_STD_ALLOCATORStemplate <class _Tp>class pthread_allocator {  typedef pthread_alloc _S_Alloc;          // The underlying allocator.public:  typedef size_t     size_type;  typedef ptrdiff_t  difference_type;  typedef _Tp*       pointer;  typedef const _Tp* const_pointer;  typedef _Tp&       reference;  typedef const _Tp& const_reference;  typedef _Tp        value_type;  template <class _NewType> struct rebind {    typedef pthread_allocator<_NewType> other;  };  pthread_allocator() __STL_NOTHROW {}  pthread_allocator(const pthread_allocator& a) __STL_NOTHROW {}  template <class _OtherType>	pthread_allocator(const pthread_allocator<_OtherType>&)		__STL_NOTHROW {}  ~pthread_allocator() __STL_NOTHROW {}  pointer address(reference __x) const { return &__x; }  const_pointer address(const_reference __x) const { return &__x; }  // __n is permitted to be 0.  The C++ standard says nothing about what  // the return value is when __n == 0.  _Tp* allocate(size_type __n, const void* = 0) {    return __n != 0 ? static_cast<_Tp*>(_S_Alloc::allocate(__n * sizeof(_Tp)))                    : 0;  }  // p is not permitted to be a null pointer.  void deallocate(pointer __p, size_type __n)    { _S_Alloc::deallocate(__p, __n * sizeof(_Tp)); }  size_type max_size() const __STL_NOTHROW     { return size_t(-1) / sizeof(_Tp); }  void construct(pointer __p, const _Tp& __val) { new(__p) _Tp(__val); }  void destroy(pointer _p) { _p->~_Tp(); }};template<>class pthread_allocator<void> {public:  typedef size_t      size_type;  typedef ptrdiff_t   difference_type;  typedef void*       pointer;  typedef const void* const_pointer;  typedef void        value_type;  template <class _NewType> struct rebind {    typedef pthread_allocator<_NewType> other;  };};template <size_t _Max_size>inline bool operator==(const _Pthread_alloc_template<_Max_size>&,                       const _Pthread_alloc_template<_Max_size>&){  return true;}template <class _T1, class _T2>inline bool operator==(const pthread_allocator<_T1>&,                       const pthread_allocator<_T2>& a2) {  return true;}template <class _T1, class _T2>inline bool operator!=(const pthread_allocator<_T1>&,                       const pthread_allocator<_T2>&){  return false;}template <class _Tp, size_t _Max_size>struct _Alloc_traits<_Tp, _Pthread_alloc_template<_Max_size> >{  static const bool _S_instanceless = true;  typedef simple_alloc<_Tp, _Pthread_alloc_template<_Max_size> > _Alloc_type;  typedef __allocator<_Tp, _Pthread_alloc_template<_Max_size> >           allocator_type;};template <class _Tp, class _Atype, size_t _Max>struct _Alloc_traits<_Tp, __allocator<_Atype, _Pthread_alloc_template<_Max> > >{  static const bool _S_instanceless = true;  typedef simple_alloc<_Tp, _Pthread_alloc_template<_Max> > _Alloc_type;  typedef __allocator<_Tp, _Pthread_alloc_template<_Max> > allocator_type;};template <class _Tp, class _Atype>struct _Alloc_traits<_Tp, pthread_allocator<_Atype> >{  static const bool _S_instanceless = true;  typedef simple_alloc<_Tp, _Pthread_alloc_template<> > _Alloc_type;  typedef pthread_allocator<_Tp> allocator_type;};#endif /* __STL_USE_STD_ALLOCATORS */__STL_END_NAMESPACE#endif /* __SGI_STL_PTHREAD_ALLOC */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -