mirror of
https://github.com/rakshasa/rtorrent.git
synced 2026-10-22 09:06:18 +00:00
* Allow interrupting a thread's polling through SIGUSR1. Used to signal events across threads.
git-svn-id: svn://rakshasa.no/libtorrent/trunk/rtorrent@1121 e378c898-3ddf-0310-93e7-cc216c733640
This commit is contained in:
@@ -76,6 +76,8 @@ void do_panic(int signum);
|
|||||||
void print_help();
|
void print_help();
|
||||||
void initialize_commands();
|
void initialize_commands();
|
||||||
|
|
||||||
|
void do_nothing() {}
|
||||||
|
|
||||||
int
|
int
|
||||||
parse_options(Control* c, int argc, char** argv) {
|
parse_options(Control* c, int argc, char** argv) {
|
||||||
try {
|
try {
|
||||||
@@ -174,6 +176,10 @@ main(int argc, char** argv) {
|
|||||||
SignalHandler::set_handler(SIGBUS, sigc::bind(sigc::ptr_fun(&do_panic), SIGBUS));
|
SignalHandler::set_handler(SIGBUS, sigc::bind(sigc::ptr_fun(&do_panic), SIGBUS));
|
||||||
SignalHandler::set_handler(SIGFPE, sigc::bind(sigc::ptr_fun(&do_panic), SIGFPE));
|
SignalHandler::set_handler(SIGFPE, sigc::bind(sigc::ptr_fun(&do_panic), SIGFPE));
|
||||||
|
|
||||||
|
// SIGUSR1 is used for interrupting polling, forcing that thread
|
||||||
|
// to process new non-socket events.
|
||||||
|
SignalHandler::set_handler(SIGUSR1, sigc::ptr_fun(&do_nothing));
|
||||||
|
|
||||||
torrent::initialize(main_thread->poll());
|
torrent::initialize(main_thread->poll());
|
||||||
|
|
||||||
// Initialize option handlers after libtorrent to ensure
|
// Initialize option handlers after libtorrent to ensure
|
||||||
|
|||||||
+4
-4
@@ -42,6 +42,8 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <rak/error_number.h>
|
||||||
#include <torrent/exceptions.h>
|
#include <torrent/exceptions.h>
|
||||||
|
|
||||||
#include "globals.h"
|
#include "globals.h"
|
||||||
@@ -135,7 +137,7 @@ ThreadBase::stop_thread(ThreadBase* thread) {
|
|||||||
inline rak::timer
|
inline rak::timer
|
||||||
ThreadBase::client_next_timeout() {
|
ThreadBase::client_next_timeout() {
|
||||||
if (m_taskScheduler.empty())
|
if (m_taskScheduler.empty())
|
||||||
return rak::timer::from_seconds(2);
|
return rak::timer::from_seconds(600);
|
||||||
else if (m_taskScheduler.top()->time() <= cachedTime)
|
else if (m_taskScheduler.top()->time() <= cachedTime)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
@@ -189,7 +191,5 @@ ThreadBase::call_queued_items() {
|
|||||||
void
|
void
|
||||||
ThreadBase::queue_item(thread_base_func newFunc) {
|
ThreadBase::queue_item(thread_base_func newFunc) {
|
||||||
m_threadQueue->push_back(newFunc);
|
m_threadQueue->push_back(newFunc);
|
||||||
|
pthread_kill(m_thread, SIGUSR1);
|
||||||
// TODO: Need to send a signal that interrupts polling so as to
|
|
||||||
// ensure we react immediately.
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user