Files
rtorrent/src/core/poll.cc
T
rakshasa ef3a8fcd83 Task Scheduler, log viewer pops up and disapperes. good good
git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@308 e378c898-3ddf-0310-93e7-cc216c733640
2005-02-26 21:58:59 +00:00

75 lines
1.4 KiB
C++

#include "config.h"
#include <errno.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(utils::Timer timeout) {
FD_ZERO(m_readSet);
FD_ZERO(m_writeSet);
FD_ZERO(m_exceptSet);
FD_SET(0, m_readSet);
torrent::mark(m_readSet, m_writeSet, m_exceptSet, &m_maxFd);
if (m_curlStack.is_busy()) {
int n;
m_curlStack.fdset(m_readSet, m_writeSet, m_exceptSet, &n);
m_maxFd = std::max(m_maxFd, n);
}
timeout = std::min(timeout, utils::Timer(torrent::get(torrent::TIME_SELECT)));
timeval t = timeout.tval();
errno = 0;
m_maxFd = select(m_maxFd + 1, m_readSet, m_writeSet, m_exceptSet, &t);
if (m_maxFd >= 0) {
work();
} else if (errno == EINTR) {
m_slotSelectInterrupted();
work_input();
} else if (errno < 0) {
throw std::runtime_error("Poll::work(): select error");
}
}
void
Poll::work() {
if (FD_ISSET(0, m_readSet))
work_input();
if (m_curlStack.is_busy())
m_curlStack.perform();
torrent::work(m_readSet, m_writeSet, m_exceptSet, m_maxFd);
}
void
Poll::work_input() {
int key;
while ((key = getch()) != ERR)
m_slotReadStdin(key);
}
Poll::SlotFactory
Poll::get_http_factory() {
return sigc::bind(sigc::ptr_fun(&core::CurlGet::new_object), &m_curlStack);
}
}