11 @@ -74,17 +75,13 @@ public:
12 size_type max_size () const throw() { return std::numeric_limits<size_t>::max() / sizeof(T); }
14 pointer allocate(size_type num, const_void_pointer hint = 0) { return alloc_size(num*sizeof(T)); }
15 + void deallocate (pointer p, size_type num) { dealloc_size(p, num*sizeof(T)); }
17 - static pointer alloc_size(size_type size) {
19 - int __UNUSED result = posix_memalign((void**)&ptr, LT_SMP_CACHE_BYTES, size);
23 + static pointer alloc_size(size_type size);
24 + static void dealloc_size(pointer p, size_type size);
26 void construct (pointer p, const T& value) { new((void*)p)T(value); }
27 void destroy (pointer p) { p->~T(); }
28 - void deallocate (pointer p, size_type num) { ::operator delete((void*)p); }
32 @@ -98,6 +95,36 @@ bool operator!= (const cacheline_allocat
37 +inline typename cacheline_allocator<T>::pointer cacheline_allocator<T>::alloc_size(size_type size) {
40 +#if HAVE_POSIX_MEMALIGN
41 + if (posix_memalign((void**)&ptr, LT_SMP_CACHE_BYTES, size))
44 + char* org = (char*)malloc(size + sizeof(void*) + LT_SMP_CACHE_BYTES - 1);
48 + ptr = (pointer)((uintptr_t)(org + LT_SMP_CACHE_BYTES - 1) & ~(LT_SMP_CACHE_BYTES - 1));
50 + // store originally allocated pointer for later free() at the end of the allocated data
51 + *(void**)((char*)ptr + size) = org;
58 +inline void cacheline_allocator<T>::dealloc_size(pointer p, size_type size) {
59 +#if HAVE_POSIX_MEMALIGN
62 + free(*(void**)((char*)p + size));