mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-08-09 19:52:31 +00:00
bd7849199c
git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@252 e378c898-3ddf-0310-93e7-cc216c733640
69 lines
1.3 KiB
C++
69 lines
1.3 KiB
C++
#include "config.h"
|
|
|
|
#include <stdexcept>
|
|
#include <sstream>
|
|
#include <ncurses.h>
|
|
#include <sigc++/bind.h>
|
|
#include <torrent/torrent.h>
|
|
|
|
#include "poll.h"
|
|
#include "curl_get.h"
|
|
|
|
namespace core {
|
|
|
|
void
|
|
Poll::poll() {
|
|
FD_ZERO(&m_readSet);
|
|
FD_ZERO(&m_writeSet);
|
|
FD_ZERO(&m_exceptSet);
|
|
|
|
torrent::mark(&m_readSet, &m_writeSet, &m_exceptSet, &m_maxFd);
|
|
|
|
m_maxFd = std::max(m_maxFd, 1);
|
|
|
|
FD_SET(0, &m_readSet);
|
|
|
|
if (m_curlStack.is_busy())
|
|
m_curlStack.fdset(&m_readSet, &m_writeSet, &m_exceptSet, &m_maxFd);
|
|
|
|
uint64_t t = torrent::get(torrent::TIME_SELECT);
|
|
|
|
if (t > 10000000)
|
|
t = 10000000;
|
|
|
|
timeval timeout = {t / 1000000, t % 1000000};
|
|
|
|
m_maxFd = select(m_maxFd + 1, &m_readSet, &m_writeSet, &m_exceptSet, &timeout);
|
|
|
|
if (m_maxFd >= 0)
|
|
work();
|
|
|
|
else if (errno == EINTR)
|
|
m_slotSelectInterrupted();
|
|
|
|
else if (errno < 0)
|
|
throw std::runtime_error("Poll::work(): select error");
|
|
}
|
|
|
|
void
|
|
Poll::work() {
|
|
if (FD_ISSET(0, &m_readSet)) {
|
|
int key;
|
|
|
|
while ((key = getch()) >= 0)
|
|
m_slotReadStdin(key);
|
|
}
|
|
|
|
if (m_curlStack.is_busy())
|
|
m_curlStack.perform();
|
|
|
|
torrent::work(&m_readSet, &m_writeSet, &m_exceptSet, m_maxFd);
|
|
}
|
|
|
|
void
|
|
Poll::register_http() {
|
|
torrent::Http::set_factory(sigc::bind(sigc::ptr_fun(&core::CurlGet::new_object), &m_curlStack));
|
|
}
|
|
|
|
}
|