components/rtorrent/patches/rtorrent-02-event-ports.patch
author Tomas Klacko <tomas.klacko@oracle.com>
Mon, 16 Mar 2015 02:51:38 -0700
branchs11-update
changeset 3948 568dd7b9cf04
parent 248 3011f7a1ed77
permissions -rw-r--r--
20393612 silence debug info "Reallocating sreaddir buffer from 14 entries to 28 entries"

diff -urN rtorrent-0.8.2.orig/src/core/Makefile.am rtorrent-0.8.2/src/core/Makefile.am
--- 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 @@
 	poll_manager.h \
 	poll_manager_epoll.cc \
 	poll_manager_epoll.h \
+	poll_manager_ports.cc \
+	poll_manager_ports.h \
 	poll_manager_kqueue.cc \
 	poll_manager_kqueue.h \
 	poll_manager_select.cc \
diff -urN rtorrent-0.8.2.orig/src/core/manager.cc rtorrent-0.8.2/src/core/manager.cc
--- 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 <[email protected]>
+//
+//           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 <[email protected]>
+//
+//           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