* Added autoconf support for cacheline_aligned and SMP_CACHE_BYTES.

git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1115 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
rakshasa
2009-12-18 21:56:14 +00:00
parent 2304983f4f
commit 5470e50ffb
8 changed files with 38 additions and 19 deletions
+3
View File
@@ -45,6 +45,9 @@ AC_LANG_POP(C++)
AC_DEFINE(HAVE_CONFIG_H, 1, true if config.h was included)
AC_DEFINE(USER_AGENT, [std::string(PACKAGE "/" VERSION "/") + torrent::version()], Http user agent)
AC_CHECK_FUNC(posix_memalign)
TORRENT_CHECK_CACHELINE()
CC_ATTRIBUTE_UNUSED(
AC_DEFINE([__UNUSED], [__attribute__((unused))], [Wrapper around unused attribute]),
AC_DEFINE([__UNUSED], [], [Null-wrapper if unused attribute is unsupported])
+8 -11
View File
@@ -39,20 +39,21 @@
#ifndef RAK_ALLOCATORS_H
#define RAK_ALLOCATORS_H
#include <cstddef>
#include <limits>
#include <stdlib.h>
#include <sys/types.h>
namespace rak {
template <class T = void*>
class cacheline_allocator {
public:
typedef std::allocator<T> base_type;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef const void* const_void_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
@@ -72,10 +73,11 @@ public:
size_type max_size () const throw() { return std::numeric_limits<size_t>::max() / sizeof(T); }
pointer allocate(size_type num, std::allocator<void>::const_pointer hint = 0) {
pointer allocate(size_type num, const_void_pointer hint = 0) { return alloc_size(num*sizeof(T)); }
static pointer alloc_size(size_type size) {
pointer ptr = NULL;
posix_memalign((void**)&ptr, L1_CACHE_BYTES, num*sizeof(T));
posix_memalign((void**)&ptr, LT_SMP_CACHE_BYTES, size);
return ptr;
}
@@ -102,11 +104,6 @@ bool operator!= (const cacheline_allocator<T1>&, const cacheline_allocator<T2>&)
//
template <typename T>
void* operator new(size_t s, rak::cacheline_allocator<T> a) {
typename rak::cacheline_allocator<T>::pointer ptr = NULL;
posix_memalign((void**)&ptr, L1_CACHE_BYTES, s);
return ptr;
}
void* operator new(size_t s, rak::cacheline_allocator<T> a) { return a.alloc_size(s); }
#endif // namespace rak
+20
View File
@@ -181,6 +181,26 @@ AC_DEFUN([TORRENT_CHECK_MADVISE], [
])
])
AC_DEFUN([TORRENT_CHECK_CACHELINE], [
AC_MSG_CHECKING(for cacheline)
AC_COMPILE_IFELSE(
[[#include <stdlib.h>
#include <linux/cache.h>
void* vptr __cacheline_aligned;
void f() { posix_memalign(&vptr, SMP_CACHE_BYTES, 42); }
]],
[
AC_MSG_RESULT(found builtin)
AC_DEFINE(LT_SMP_CACHE_BYTES, SMP_CACHE_BYTES, Largest L1 cache size we know of, should work on all archs.)
AC_DEFINE(lt_cacheline_aligned, __cacheline_aligned, LibTorrent defined cacheline aligned.)
], [
AC_MSG_RESULT(using default 128 bytes)
AC_DEFINE(LT_SMP_CACHE_BYTES, 128, Largest L1 cache size we know of, should work on all archs.)
AC_DEFINE(lt_cacheline_aligned, __attribute__((__aligned__(LT_SMP_CACHE_BYTES))), LibTorrent defined cacheline aligned.)
])
])
AC_DEFUN([TORRENT_CHECK_EXECINFO], [
AC_MSG_CHECKING(for execinfo.h)
+2 -3
View File
@@ -40,6 +40,7 @@
#include <stdexcept>
#include <unistd.h>
#include <sys/time.h>
#include <rak/allocators.h>
#include <torrent/exceptions.h>
#include <torrent/poll_select.h>
#include <torrent/torrent.h>
@@ -53,9 +54,7 @@ PollManagerSelect::PollManagerSelect(torrent::Poll* p) : PollManager(p) {
#if defined USE_VARIABLE_FDSET
m_setSize = (m_poll->open_max() + 7) / 8;
char* buffer;
posix_memalign((void**)&buffer, L1_CACHE_BYTES, 3 * m_setSize);
char* buffer = rak::cacheline_allocator<char>::alloc_size(3 * m_setSize);
std::memset(buffer, 0, 3 * m_setSize);
m_readSet = (fd_set*)buffer;
+1 -1
View File
@@ -45,7 +45,7 @@ namespace torrent {
namespace core {
class __cacheline_aligned PollManagerSelect : public PollManager {
class lt_cacheline_aligned PollManagerSelect : public PollManager {
public:
static PollManagerSelect* create(int maxOpenSockets);
~PollManagerSelect();
+2 -2
View File
@@ -47,9 +47,9 @@
// Temporarly injected into config.h.
/* temp hack */
//#define __cacheline_aligned __attribute__((__aligned__(128)))
//#define lt_cacheline_aligned __attribute__((__aligned__(128)))
class __cacheline_aligned thread_queue_hack {
class lt_cacheline_aligned thread_queue_hack {
public:
typedef ThreadBase::thread_base_func value_type;
typedef ThreadBase::thread_base_func* iterator;
+1 -1
View File
@@ -42,7 +42,7 @@
// Check if cacheline aligned with inheritance ends up taking two
// cachelines.
class __cacheline_aligned ThreadMain : public ThreadBase {
class lt_cacheline_aligned ThreadMain : public ThreadBase {
public:
ThreadMain() {}
~ThreadMain();
+1 -1
View File
@@ -44,7 +44,7 @@
// Check if cacheline aligned with inheritance ends up taking two
// cachelines.
class __cacheline_aligned ThreadWorker : public ThreadBase {
class lt_cacheline_aligned ThreadWorker : public ThreadBase {
public:
ThreadWorker();
~ThreadWorker();