📄 pthread_alloc
字号:
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 + -