mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-10 16:19:23 +00:00
* 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:
@@ -45,6 +45,9 @@ AC_LANG_POP(C++)
|
|||||||
AC_DEFINE(HAVE_CONFIG_H, 1, true if config.h was included)
|
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_DEFINE(USER_AGENT, [std::string(PACKAGE "/" VERSION "/") + torrent::version()], Http user agent)
|
||||||
|
|
||||||
|
AC_CHECK_FUNC(posix_memalign)
|
||||||
|
TORRENT_CHECK_CACHELINE()
|
||||||
|
|
||||||
CC_ATTRIBUTE_UNUSED(
|
CC_ATTRIBUTE_UNUSED(
|
||||||
AC_DEFINE([__UNUSED], [__attribute__((unused))], [Wrapper around unused attribute]),
|
AC_DEFINE([__UNUSED], [__attribute__((unused))], [Wrapper around unused attribute]),
|
||||||
AC_DEFINE([__UNUSED], [], [Null-wrapper if unused attribute is unsupported])
|
AC_DEFINE([__UNUSED], [], [Null-wrapper if unused attribute is unsupported])
|
||||||
|
|||||||
+8
-11
@@ -39,20 +39,21 @@
|
|||||||
#ifndef RAK_ALLOCATORS_H
|
#ifndef RAK_ALLOCATORS_H
|
||||||
#define RAK_ALLOCATORS_H
|
#define RAK_ALLOCATORS_H
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
namespace rak {
|
namespace rak {
|
||||||
|
|
||||||
template <class T = void*>
|
template <class T = void*>
|
||||||
class cacheline_allocator {
|
class cacheline_allocator {
|
||||||
public:
|
public:
|
||||||
typedef std::allocator<T> base_type;
|
|
||||||
|
|
||||||
typedef size_t size_type;
|
typedef size_t size_type;
|
||||||
typedef ptrdiff_t difference_type;
|
typedef ptrdiff_t difference_type;
|
||||||
typedef T* pointer;
|
typedef T* pointer;
|
||||||
typedef const T* const_pointer;
|
typedef const T* const_pointer;
|
||||||
|
typedef const void* const_void_pointer;
|
||||||
typedef T& reference;
|
typedef T& reference;
|
||||||
typedef const T& const_reference;
|
typedef const T& const_reference;
|
||||||
typedef T value_type;
|
typedef T value_type;
|
||||||
@@ -72,10 +73,11 @@ public:
|
|||||||
|
|
||||||
size_type max_size () const throw() { return std::numeric_limits<size_t>::max() / sizeof(T); }
|
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;
|
pointer ptr = NULL;
|
||||||
posix_memalign((void**)&ptr, L1_CACHE_BYTES, num*sizeof(T));
|
posix_memalign((void**)&ptr, LT_SMP_CACHE_BYTES, size);
|
||||||
|
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,11 +104,6 @@ bool operator!= (const cacheline_allocator<T1>&, const cacheline_allocator<T2>&)
|
|||||||
//
|
//
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void* operator new(size_t s, rak::cacheline_allocator<T> a) {
|
void* operator new(size_t s, rak::cacheline_allocator<T> a) { return a.alloc_size(s); }
|
||||||
typename rak::cacheline_allocator<T>::pointer ptr = NULL;
|
|
||||||
posix_memalign((void**)&ptr, L1_CACHE_BYTES, s);
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // namespace rak
|
#endif // namespace rak
|
||||||
|
|||||||
@@ -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_DEFUN([TORRENT_CHECK_EXECINFO], [
|
||||||
AC_MSG_CHECKING(for execinfo.h)
|
AC_MSG_CHECKING(for execinfo.h)
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <rak/allocators.h>
|
||||||
#include <torrent/exceptions.h>
|
#include <torrent/exceptions.h>
|
||||||
#include <torrent/poll_select.h>
|
#include <torrent/poll_select.h>
|
||||||
#include <torrent/torrent.h>
|
#include <torrent/torrent.h>
|
||||||
@@ -53,9 +54,7 @@ PollManagerSelect::PollManagerSelect(torrent::Poll* p) : PollManager(p) {
|
|||||||
#if defined USE_VARIABLE_FDSET
|
#if defined USE_VARIABLE_FDSET
|
||||||
m_setSize = (m_poll->open_max() + 7) / 8;
|
m_setSize = (m_poll->open_max() + 7) / 8;
|
||||||
|
|
||||||
char* buffer;
|
char* buffer = rak::cacheline_allocator<char>::alloc_size(3 * m_setSize);
|
||||||
posix_memalign((void**)&buffer, L1_CACHE_BYTES, 3 * m_setSize);
|
|
||||||
|
|
||||||
std::memset(buffer, 0, 3 * m_setSize);
|
std::memset(buffer, 0, 3 * m_setSize);
|
||||||
|
|
||||||
m_readSet = (fd_set*)buffer;
|
m_readSet = (fd_set*)buffer;
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ namespace torrent {
|
|||||||
|
|
||||||
namespace core {
|
namespace core {
|
||||||
|
|
||||||
class __cacheline_aligned PollManagerSelect : public PollManager {
|
class lt_cacheline_aligned PollManagerSelect : public PollManager {
|
||||||
public:
|
public:
|
||||||
static PollManagerSelect* create(int maxOpenSockets);
|
static PollManagerSelect* create(int maxOpenSockets);
|
||||||
~PollManagerSelect();
|
~PollManagerSelect();
|
||||||
|
|||||||
+2
-2
@@ -47,9 +47,9 @@
|
|||||||
|
|
||||||
// Temporarly injected into config.h.
|
// Temporarly injected into config.h.
|
||||||
/* temp hack */
|
/* 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:
|
public:
|
||||||
typedef ThreadBase::thread_base_func value_type;
|
typedef ThreadBase::thread_base_func value_type;
|
||||||
typedef ThreadBase::thread_base_func* iterator;
|
typedef ThreadBase::thread_base_func* iterator;
|
||||||
|
|||||||
+1
-1
@@ -42,7 +42,7 @@
|
|||||||
// Check if cacheline aligned with inheritance ends up taking two
|
// Check if cacheline aligned with inheritance ends up taking two
|
||||||
// cachelines.
|
// cachelines.
|
||||||
|
|
||||||
class __cacheline_aligned ThreadMain : public ThreadBase {
|
class lt_cacheline_aligned ThreadMain : public ThreadBase {
|
||||||
public:
|
public:
|
||||||
ThreadMain() {}
|
ThreadMain() {}
|
||||||
~ThreadMain();
|
~ThreadMain();
|
||||||
|
|||||||
+1
-1
@@ -44,7 +44,7 @@
|
|||||||
// Check if cacheline aligned with inheritance ends up taking two
|
// Check if cacheline aligned with inheritance ends up taking two
|
||||||
// cachelines.
|
// cachelines.
|
||||||
|
|
||||||
class __cacheline_aligned ThreadWorker : public ThreadBase {
|
class lt_cacheline_aligned ThreadWorker : public ThreadBase {
|
||||||
public:
|
public:
|
||||||
ThreadWorker();
|
ThreadWorker();
|
||||||
~ThreadWorker();
|
~ThreadWorker();
|
||||||
|
|||||||
Reference in New Issue
Block a user