moved page_aligned_allocator to its own file and uses it in set_piece_hashes to not pass in unaligned buffers to storage read
This commit is contained in:
parent
9edfd93603
commit
113d1f3557
|
@ -3,6 +3,7 @@ project(libtorrent)
|
||||||
|
|
||||||
set(sources
|
set(sources
|
||||||
alert
|
alert
|
||||||
|
allocator
|
||||||
assert
|
assert
|
||||||
connection_queue
|
connection_queue
|
||||||
create_torrent
|
create_torrent
|
||||||
|
|
1
Jamfile
1
Jamfile
|
@ -302,6 +302,7 @@ lib ws2_32 : : <name>ws2_32 ;
|
||||||
|
|
||||||
SOURCES =
|
SOURCES =
|
||||||
alert
|
alert
|
||||||
|
allocator
|
||||||
assert
|
assert
|
||||||
connection_queue
|
connection_queue
|
||||||
create_torrent
|
create_torrent
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
nobase_include_HEADERS = libtorrent/alert.hpp \
|
nobase_include_HEADERS = libtorrent/alert.hpp \
|
||||||
|
libtorrent/allocator.hpp \
|
||||||
libtorrent/alert_types.hpp \
|
libtorrent/alert_types.hpp \
|
||||||
libtorrent/assert.hpp \
|
libtorrent/assert.hpp \
|
||||||
libtorrent/alloca.hpp \
|
libtorrent/alloca.hpp \
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2009, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
|
||||||
|
struct page_aligned_allocator
|
||||||
|
{
|
||||||
|
typedef std::size_t size_type;
|
||||||
|
typedef std::ptrdiff_t difference_type;
|
||||||
|
|
||||||
|
static char* malloc(const size_type bytes);
|
||||||
|
static void free(char* const block);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/storage.hpp"
|
#include "libtorrent/storage.hpp"
|
||||||
#include "libtorrent/hasher.hpp"
|
#include "libtorrent/hasher.hpp"
|
||||||
#include "libtorrent/utf8.hpp"
|
#include "libtorrent/utf8.hpp"
|
||||||
|
#include "libtorrent/allocator.hpp"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -207,6 +208,15 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct piece_holder
|
||||||
|
{
|
||||||
|
piece_holder(int bytes): m_piece(page_aligned_allocator::malloc(bytes)) {}
|
||||||
|
~piece_holder() { page_aligned_allocator::free(m_piece); }
|
||||||
|
char* bytes() { return m_piece; }
|
||||||
|
private:
|
||||||
|
char* m_piece;
|
||||||
|
};
|
||||||
|
|
||||||
template <class Fun>
|
template <class Fun>
|
||||||
void set_piece_hashes(create_torrent& t, boost::filesystem::path const& p, Fun f)
|
void set_piece_hashes(create_torrent& t, boost::filesystem::path const& p, Fun f)
|
||||||
{
|
{
|
||||||
|
@ -216,13 +226,13 @@ namespace libtorrent
|
||||||
|
|
||||||
// calculate the hash for all pieces
|
// calculate the hash for all pieces
|
||||||
int num = t.num_pieces();
|
int num = t.num_pieces();
|
||||||
std::vector<char> buf(t.piece_length());
|
piece_holder buf(t.piece_length());
|
||||||
for (int i = 0; i < num; ++i)
|
for (int i = 0; i < num; ++i)
|
||||||
{
|
{
|
||||||
// read hits the disk and will block. Progress should
|
// read hits the disk and will block. Progress should
|
||||||
// be updated in between reads
|
// be updated in between reads
|
||||||
st->read(&buf[0], i, 0, t.piece_size(i));
|
st->read(buf.bytes(), i, 0, t.piece_size(i));
|
||||||
hasher h(&buf[0], t.piece_size(i));
|
hasher h(buf.bytes(), t.piece_size(i));
|
||||||
t.set_hash(i, h.final());
|
t.set_hash(i, h.final());
|
||||||
f(i);
|
f(i);
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "libtorrent/storage.hpp"
|
#include "libtorrent/storage.hpp"
|
||||||
|
#include "libtorrent/allocator.hpp"
|
||||||
#include <boost/thread/thread.hpp>
|
#include <boost/thread/thread.hpp>
|
||||||
#include <boost/thread/mutex.hpp>
|
#include <boost/thread/mutex.hpp>
|
||||||
#include <boost/thread/condition.hpp>
|
#include <boost/thread/condition.hpp>
|
||||||
|
@ -53,15 +54,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
struct page_aligned_allocator
|
|
||||||
{
|
|
||||||
typedef std::size_t size_type;
|
|
||||||
typedef std::ptrdiff_t difference_type;
|
|
||||||
|
|
||||||
static char* malloc(const size_type bytes);
|
|
||||||
static void free(char* const block);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct cached_piece_info
|
struct cached_piece_info
|
||||||
{
|
{
|
||||||
int piece;
|
int piece;
|
||||||
|
|
|
@ -25,10 +25,13 @@ logger.cpp file_pool.cpp ut_pex.cpp lsd.cpp upnp.cpp instantiate_connection.cpp
|
||||||
socks5_stream.cpp socks4_stream.cpp http_stream.cpp connection_queue.cpp \
|
socks5_stream.cpp socks4_stream.cpp http_stream.cpp connection_queue.cpp \
|
||||||
disk_io_thread.cpp ut_metadata.cpp lt_trackers.cpp magnet_uri.cpp udp_socket.cpp smart_ban.cpp \
|
disk_io_thread.cpp ut_metadata.cpp lt_trackers.cpp magnet_uri.cpp udp_socket.cpp smart_ban.cpp \
|
||||||
http_parser.cpp gzip.cpp disk_buffer_holder.cpp create_torrent.cpp GeoIP.c \
|
http_parser.cpp gzip.cpp disk_buffer_holder.cpp create_torrent.cpp GeoIP.c \
|
||||||
parse_url.cpp file_storage.cpp error_code.cpp ConvertUTF.cpp $(kademlia_sources)
|
parse_url.cpp file_storage.cpp error_code.cpp ConvertUTF.cpp \
|
||||||
|
allocator.cpp \
|
||||||
|
$(kademlia_sources)
|
||||||
|
|
||||||
noinst_HEADERS = \
|
noinst_HEADERS = \
|
||||||
$(top_srcdir)/include/libtorrent/alert.hpp \
|
$(top_srcdir)/include/libtorrent/alert.hpp \
|
||||||
|
$(top_srcdir)/include/libtorrent/allocator.hpp \
|
||||||
$(top_srcdir)/include/libtorrent/alert_types.hpp \
|
$(top_srcdir)/include/libtorrent/alert_types.hpp \
|
||||||
$(top_srcdir)/include/libtorrent/assert.hpp \
|
$(top_srcdir)/include/libtorrent/assert.hpp \
|
||||||
$(top_srcdir)/include/libtorrent/alloca.hpp \
|
$(top_srcdir)/include/libtorrent/alloca.hpp \
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
/*
|
||||||
|
|
||||||
|
Copyright (c) 2009, Arvid Norberg
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer in
|
||||||
|
the documentation and/or other materials provided with the distribution.
|
||||||
|
* Neither the name of the author nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "libtorrent/allocator.hpp"
|
||||||
|
#include "libtorrent/config.hpp"
|
||||||
|
|
||||||
|
#ifdef TORRENT_WINDOWS
|
||||||
|
#include <Windows.h>
|
||||||
|
#else
|
||||||
|
#include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
namespace libtorrent
|
||||||
|
{
|
||||||
|
char* page_aligned_allocator::malloc(const size_type bytes)
|
||||||
|
{
|
||||||
|
#ifdef TORRENT_WINDOWS
|
||||||
|
return reinterpret_cast<char*>(VirtualAlloc(0, bytes, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
|
||||||
|
#else
|
||||||
|
return reinterpret_cast<char*>(valloc(bytes));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void page_aligned_allocator::free(char* const block)
|
||||||
|
{
|
||||||
|
#ifdef TORRENT_WINDOWS
|
||||||
|
VirtualFree(block, 0, MEM_RELEASE);
|
||||||
|
#else
|
||||||
|
free(block);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -38,12 +38,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/invariant_check.hpp"
|
#include "libtorrent/invariant_check.hpp"
|
||||||
#include <boost/scoped_array.hpp>
|
#include <boost/scoped_array.hpp>
|
||||||
|
|
||||||
#ifdef TORRENT_WINDOWS
|
|
||||||
#include <Windows.h>
|
|
||||||
#else
|
|
||||||
#include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TORRENT_DISK_STATS
|
#ifdef TORRENT_DISK_STATS
|
||||||
#include "libtorrent/time.hpp"
|
#include "libtorrent/time.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
@ -51,24 +45,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace libtorrent
|
namespace libtorrent
|
||||||
{
|
{
|
||||||
|
|
||||||
char* page_aligned_allocator::malloc(const size_type bytes)
|
|
||||||
{
|
|
||||||
#ifdef TORRENT_WINDOWS
|
|
||||||
return reinterpret_cast<char*>(VirtualAlloc(0, bytes, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
|
|
||||||
#else
|
|
||||||
return reinterpret_cast<char*>(valloc(bytes));
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void page_aligned_allocator::free(char* const block)
|
|
||||||
{
|
|
||||||
#ifdef TORRENT_WINDOWS
|
|
||||||
VirtualFree(block, 0, MEM_RELEASE);
|
|
||||||
#else
|
|
||||||
std::free(block);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
disk_io_thread::disk_io_thread(asio::io_service& ios, int block_size)
|
disk_io_thread::disk_io_thread(asio::io_service& ios, int block_size)
|
||||||
: m_abort(false)
|
: m_abort(false)
|
||||||
, m_queue_buffer_size(0)
|
, m_queue_buffer_size(0)
|
||||||
|
|
Loading…
Reference in New Issue