From 6dfd2fe0cddd5683df8caea04ed4504930ab9dac Mon Sep 17 00:00:00 2001 From: Jari Sundell Date: Mon, 12 Dec 2011 01:46:09 +0900 Subject: [PATCH] Moved polling code to libtorrent. --- src/core/poll_manager_epoll.cc | 28 ++------------------ src/core/poll_manager_kqueue.cc | 28 ++------------------ src/core/poll_manager_select.cc | 47 ++------------------------------- src/core/poll_manager_select.h | 3 --- 4 files changed, 6 insertions(+), 100 deletions(-) diff --git a/src/core/poll_manager_epoll.cc b/src/core/poll_manager_epoll.cc index 8b7670db..f4b7b1f8 100644 --- a/src/core/poll_manager_epoll.cc +++ b/src/core/poll_manager_epoll.cc @@ -63,36 +63,12 @@ PollManagerEPoll::~PollManagerEPoll() { void PollManagerEPoll::poll(rak::timer timeout) { - // Add 1ms to ensure we don't idle loop due to the lack of - // resolution. - torrent::perform(); - timeout = std::min(timeout, rak::timer(torrent::next_timeout())) + 1000; - - ThreadBase::release_global_lock(); - ThreadBase::entering_main_polling(); - - int status = static_cast(m_poll)->poll((timeout.usec() + 999) / 1000); - - ThreadBase::leaving_main_polling(); - ThreadBase::acquire_global_lock(); - - if (status == -1) - return check_error(); - - torrent::perform(); - static_cast(m_poll)->perform(); + static_cast(m_poll)->do_poll(); } void PollManagerEPoll::poll_simple(rak::timer timeout) { - // Add 1ms to ensure we don't idle loop due to the lack of - // resolution. - timeout = timeout + 1000; - - if (static_cast(m_poll)->poll((timeout.usec() + 999) / 1000) == -1) - return check_error(); - - static_cast(m_poll)->perform(); + static_cast(m_poll)->do_poll(torrent::Poll::poll_worker_thread); } } diff --git a/src/core/poll_manager_kqueue.cc b/src/core/poll_manager_kqueue.cc index 5bf309e7..572f35e4 100644 --- a/src/core/poll_manager_kqueue.cc +++ b/src/core/poll_manager_kqueue.cc @@ -64,36 +64,12 @@ PollManagerKQueue::~PollManagerKQueue() { void PollManagerKQueue::poll(rak::timer timeout) { - // Add 1ms to ensure we don't idle loop due to the lack of - // resolution. - torrent::perform(); - timeout = std::min(timeout, rak::timer(torrent::next_timeout())) + 1000; - - ThreadBase::release_global_lock(); - ThreadBase::entering_main_polling(); - - int status = static_cast(m_poll)->poll((timeout.usec() + 999) / 1000); - - ThreadBase::leaving_main_polling(); - ThreadBase::acquire_global_lock(); - - if (status == -1) - return check_error(); - - torrent::perform(); - static_cast(m_poll)->perform(); + static_cast(m_poll)->do_poll(); } void PollManagerKQueue::poll_simple(rak::timer timeout) { - // Add 1ms to ensure we don't idle loop due to the lack of - // resolution. - timeout = std::min(timeout, rak::timer(torrent::next_timeout())) + 1000; - - if (static_cast(m_poll)->poll((timeout.usec() + 999) / 1000) == -1) - return check_error(); - - static_cast(m_poll)->perform(); + static_cast(m_poll)->do_poll(torrent::Poll::poll_worker_thread); } } diff --git a/src/core/poll_manager_select.cc b/src/core/poll_manager_select.cc index 70d9fd1d..6d4827b9 100644 --- a/src/core/poll_manager_select.cc +++ b/src/core/poll_manager_select.cc @@ -53,13 +53,6 @@ namespace core { PollManagerSelect::PollManagerSelect(torrent::Poll* p) : PollManager(p) { #if defined USE_VARIABLE_FDSET m_setSize = (m_poll->open_max() + 7) / 8; - - char* buffer = rak::cacheline_allocator::alloc_size(3 * m_setSize); - std::memset(buffer, 0, 3 * m_setSize); - - m_readSet = (fd_set*)buffer; - m_writeSet = (fd_set*)(buffer += m_setSize); - m_errorSet = (fd_set*)(buffer += m_setSize); #else #error Only variable fdset supported atm. #endif @@ -76,52 +69,16 @@ PollManagerSelect::create(int maxOpenSockets) { } PollManagerSelect::~PollManagerSelect() { - free(m_readSet); } void PollManagerSelect::poll(rak::timer timeout) { - torrent::perform(); - timeout = std::min(timeout, rak::timer(torrent::next_timeout())) + 1000; - - std::memset(m_readSet, 0, m_setSize); - std::memset(m_writeSet, 0, m_setSize); - std::memset(m_errorSet, 0, m_setSize); - - unsigned int maxFd = static_cast(m_poll)->fdset(m_readSet, m_writeSet, m_errorSet); - - timeval t = timeout.tval(); - - ThreadBase::entering_main_polling(); - ThreadBase::release_global_lock(); - - int status = select(maxFd + 1, m_readSet, m_writeSet, m_errorSet, &t); - - ThreadBase::leaving_main_polling(); - ThreadBase::acquire_global_lock(); - - if (status == -1) - return check_error(); - - torrent::perform(); - static_cast(m_poll)->perform(m_readSet, m_writeSet, m_errorSet); + static_cast(m_poll)->do_poll(); } void PollManagerSelect::poll_simple(rak::timer timeout) { - torrent::PollSelect* currentPoll = static_cast(m_poll); - - timeout = timeout + 1000; - std::memset(m_readSet, 0, 3 * m_setSize); - - unsigned int maxFd = currentPoll->fdset(m_readSet, m_writeSet, m_errorSet); - - timeval t = timeout.tval(); - - if (select(maxFd + 1, m_readSet, m_writeSet, m_errorSet, &t) == -1) - return check_error(); - - currentPoll->perform(m_readSet, m_writeSet, m_errorSet); + static_cast(m_poll)->do_poll(torrent::PollSelect::poll_worker_thread); } } diff --git a/src/core/poll_manager_select.h b/src/core/poll_manager_select.h index 8aa46e43..18082360 100644 --- a/src/core/poll_manager_select.h +++ b/src/core/poll_manager_select.h @@ -57,9 +57,6 @@ private: PollManagerSelect(torrent::Poll* p); unsigned int m_setSize; - fd_set* m_readSet; - fd_set* m_writeSet; - fd_set* m_errorSet; }; }