--- rtorrent-0.8.2.orig/src/core/Makefile.am 2008-05-07 08:19:11.000000000 -0400
+++ rtorrent-0.8.2/src/core/Makefile.am 2008-05-24 04:58:48.995508910 -0400
@@ -26,6 +26,8 @@
--- rtorrent-0.8.2.orig/src/core/manager.cc 2008-05-07 08:19:11.000000000 -0400
+++ rtorrent-0.8.2/src/core/manager.cc 2008-05-24 04:58:48.996596707 -0400
@@ -69,6 +69,7 @@
#include "manager.h"
#include "poll_manager_epoll.h"
#include "poll_manager_kqueue.h"
+#include "poll_manager_ports.h"
#include "poll_manager_select.h"
#include "view.h"
@@ -189,6 +190,9 @@
if ((m_pollManager = PollManagerEPoll::create(sysconf(_SC_OPEN_MAX))) != NULL)
m_logImportant.push_front("Using 'epoll' based polling.");
+ else if ((m_pollManager = PollManagerPorts::create(sysconf(_SC_OPEN_MAX))) != NULL)
+ m_logImportant.push_front("Using 'ports' based polling.");
+
else if ((m_pollManager = PollManagerKQueue::create(sysconf(_SC_OPEN_MAX))) != NULL)
m_logImportant.push_front("Using 'kqueue' based polling.");
diff -urN rtorrent-0.8.2.orig/src/core/poll_manager_ports.cc rtorrent-0.8.2/src/core/poll_manager_ports.cc
--- rtorrent-0.8.2.orig/src/core/poll_manager_ports.cc 1969-12-31 19:00:00.000000000 -0500
+++ rtorrent-0.8.2/src/core/poll_manager_ports.cc 2008-05-10 19:04:07.000000000 -0400
@@ -0,0 +1,118 @@
+// rTorrent - BitTorrent client
+// Copyright (C) 2005-2007, Jari Sundell
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// In addition, as a special exception, the copyright holders give
+// permission to link the code of portions of this program with the
+// OpenSSL library under certain conditions as described in each
+// individual source file, and distribute linked combinations
+// including the two.
+//
+// You must obey the GNU General Public License in all respects for
+// all of the code used other than OpenSSL. If you modify file(s)
+// with this exception, you may extend this exception to your version
+// of the file(s), but you are not obligated to do so. If you do not
+// wish to do so, delete this exception statement from your version.
+// If you delete this exception statement from all source files in the
+// program, then also delete it here.
+//
+// Contact: Jari Sundell <jaris@ifi.uio.no>
+//
+// Skomakerveien 33
+// 3185 Skoppum, NORWAY
+
+#include "config.h"
+
+#include <cstring>
+#include <iostream>
+#include <stdexcept>
+#include <unistd.h>
+#include <sys/time.h>
+#include <torrent/poll_ports.h>
+#include <torrent/torrent.h>
+
+#include "poll_manager_ports.h"
+
+namespace core {
+
+PollManagerPorts*
+PollManagerPorts::create(int maxOpenSockets) {
+ torrent::PollPorts* p = torrent::PollPorts::create(maxOpenSockets);
+
+ if (p == NULL)
+ return NULL;
+ else
+ return new PollManagerPorts(p);
+}
+
+PollManagerPorts::~PollManagerPorts() {
+}
+
+void
+PollManagerPorts::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;
+
+ if (!m_httpStack.empty()) {
+ // When we're using libcurl we need to use select, but as this is
+ // inefficient we try avoiding it whenever possible.
+#if defined USE_VARIABLE_FDSET
+ std::memset(m_readSet, 0, m_setSize);
+ std::memset(m_writeSet, 0, m_setSize);
+ std::memset(m_errorSet, 0, m_setSize);
+#else
+ FD_ZERO(m_readSet);
+ FD_ZERO(m_writeSet);
+ FD_ZERO(m_errorSet);
+#endif
+ FD_SET(static_cast<torrent::PollPorts*>(m_poll)->file_descriptor(), m_readSet);
+
+ unsigned int maxFd = std::max((unsigned int)static_cast<torrent::PollPorts*>(m_poll)->file_descriptor(),
+ m_httpStack.fdset(m_readSet, m_writeSet, m_errorSet));
+
+ timeval t = timeout.tval();
+
+ if (select(maxFd + 1, m_readSet, m_writeSet, m_errorSet, &t) == -1) {
+ std::cerr << "error from select\n";
+ return check_error();
+ }
+ m_httpStack.perform();
+
+ if (!FD_ISSET(static_cast<torrent::PollPorts*>(m_poll)->file_descriptor(), m_readSet)) {
+ // Need to call perform here so that scheduled task get done
+ // even if there's no socket events outside of the http stuff.
+ torrent::perform();
+ return;
+ }
+
+ // Clear the timeout since we've already used it in the select call.
+ timeout = rak::timer();
+ }
+
+ // Yes, below is how much code really *should* have been in this
+ // function. ;)
+
+ if (static_cast<torrent::PollPorts*>(m_poll)->poll((timeout.usec() + 999) / 1000) == -1) {
+ std::cerr << "error from ports poll\n";
+ return check_error();
+ }
+ torrent::perform();
+ static_cast<torrent::PollPorts*>(m_poll)->perform();
+}
+
+}
diff -urN rtorrent-0.8.2.orig/src/core/poll_manager_ports.h rtorrent-0.8.2/src/core/poll_manager_ports.h
--- rtorrent-0.8.2.orig/src/core/poll_manager_ports.h 1969-12-31 19:00:00.000000000 -0500
+++ rtorrent-0.8.2/src/core/poll_manager_ports.h 2008-05-10 19:04:07.000000000 -0400
@@ -0,0 +1,63 @@
+// rTorrent - BitTorrent client
+// Copyright (C) 2005-2007, Jari Sundell
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// In addition, as a special exception, the copyright holders give
+// permission to link the code of portions of this program with the
+// OpenSSL library under certain conditions as described in each
+// individual source file, and distribute linked combinations
+// including the two.
+//
+// You must obey the GNU General Public License in all respects for
+// all of the code used other than OpenSSL. If you modify file(s)
+// with this exception, you may extend this exception to your version
+// of the file(s), but you are not obligated to do so. If you do not
+// wish to do so, delete this exception statement from your version.
+// If you delete this exception statement from all source files in the
+// program, then also delete it here.
+//
+// Contact: Jari Sundell <jaris@ifi.uio.no>
+//
+// Skomakerveien 33
+// 3185 Skoppum, NORWAY
+
+#ifndef RTORRENT_CORE_POLL_MANAGER_PORTS_H
+#define RTORRENT_CORE_POLL_MANAGER_PORTS_H
+
+#include "poll_manager.h"
+
+namespace torrent {
+ class PollPorts;
+}
+
+namespace core {
+
+class PollManagerPorts : public PollManager {
+public:
+ static PollManagerPorts* create(int maxOpenSockets);
+ ~PollManagerPorts();
+
+ torrent::Poll* get_torrent_poll();
+
+ void poll(rak::timer timeout);
+
+private:
+ PollManagerPorts(torrent::Poll* p) : PollManager(p) {}
+};
+
+}
+
+#endif