--- /dev/null
+Index: rtorrent/rak/allocators.h
+===================================================================
+--- rtorrent/rak/allocators.h (revision 1121)
++++ rtorrent/rak/allocators.h (working copy)
+@@ -74,17 +74,13 @@
+ size_type max_size () const throw() { return std::numeric_limits<size_t>::max() / sizeof(T); }
+
+ pointer allocate(size_type num, const_void_pointer hint = 0) { return alloc_size(num*sizeof(T)); }
++ void deallocate (pointer p, size_type num) { dealloc_size(p, num*sizeof(T)); }
+
+- static pointer alloc_size(size_type size) {
+- pointer ptr = NULL;
+- int __UNUSED result = posix_memalign((void**)&ptr, LT_SMP_CACHE_BYTES, size);
++ static pointer alloc_size(size_type size);
++ static void dealloc_size(pointer p, size_type size);
+
+- return ptr;
+- }
+-
+ void construct (pointer p, const T& value) { new((void*)p)T(value); }
+ void destroy (pointer p) { p->~T(); }
+- void deallocate (pointer p, size_type num) { ::operator delete((void*)p); }
+ };
+
+
+@@ -98,8 +94,38 @@
+ return false;
+ }
+
++template <class T>
++inline typename cacheline_allocator<T>::pointer cacheline_allocator<T>::alloc_size(size_type size) {
++ pointer ptr;
++
++#if HAVE_POSIX_MEMALIGN
++ if (posix_memalign((void**)&ptr, LT_SMP_CACHE_BYTES, size))
++ return NULL;
++#else
++ char* org = (char*)malloc(size + sizeof(void*) + LT_SMP_CACHE_BYTES - 1);
++ if (org == NULL)
++ return NULL;
++
++ ptr = (pointer)((uintptr_t)(org + LT_SMP_CACHE_BYTES - 1) & ~(LT_SMP_CACHE_BYTES - 1));
++
++ // store originally allocated pointer for later free() at the end of the allocated data
++ *(void**)((char*)ptr + size) = org;
++#endif
++
++ return ptr;
+ }
+
++template <class T>
++inline void cacheline_allocator<T>::dealloc_size(pointer p, size_type size) {
++#if HAVE_POSIX_MEMALIGN
++ free(p);
++#else
++ free(*(void**)((char*)p + size));
++#endif
++}
++
++}
++
+ //
+ // Operator new with custom allocators:
+ //
--- /dev/null
+--- a/src/thread_base.cc 2010-01-26 09:40:34.000000000 +0300
++++ b/src/thread_base.cc 2010-01-31 18:38:25.000000000 +0300
+@@ -191,5 +191,5 @@
+ void
+ ThreadBase::queue_item(thread_base_func newFunc) {
+ m_threadQueue->push_back(newFunc);
+- pthread_kill(m_thread, SIGUSR1);
++ if(m_thread != NULL) pthread_kill(m_thread, SIGUSR1);
+ }