Moved code from ThreadBase to torrent::thread_base.

This commit is contained in:
Jari Sundell
2011-12-19 03:20:42 +09:00
parent 5b7a2b5e95
commit 007d83e904
2 changed files with 17 additions and 46 deletions
+14 -39
View File
@@ -117,55 +117,21 @@ ThreadBase::~ThreadBase() {
delete m_threadQueue;
}
void
ThreadBase::start_thread() {
if (m_state != STATE_INITIALIZED ||
pthread_create(&m_thread, NULL, (pthread_func)&ThreadBase::event_loop, this))
throw torrent::internal_error("Failed to create thread.");
}
// Move to libtorrent...
void
ThreadBase::stop_thread(ThreadBase* thread) {
if (!thread->m_taskShutdown.is_queued())
priority_queue_insert(&thread->m_taskScheduler, &thread->m_taskShutdown, cachedTime);
}
inline rak::timer
ThreadBase::client_next_timeout() {
int64_t
ThreadBase::next_timeout_usec() {
if (m_taskScheduler.empty())
return rak::timer::from_seconds(600);
return rak::timer::from_seconds(600).usec();
else if (m_taskScheduler.top()->time() <= cachedTime)
return 0;
else
return m_taskScheduler.top()->time() - cachedTime;
}
void*
ThreadBase::event_loop(ThreadBase* thread) {
thread->m_state = STATE_ACTIVE;
try {
while (true) {
// Check for new queued items set by other threads.
if (!thread->m_threadQueue->empty())
thread->call_queued_items();
rak::priority_queue_perform(&thread->m_taskScheduler, cachedTime);
thread->m_poll->do_poll(thread->client_next_timeout().usec(), torrent::Poll::poll_worker_thread);
}
} catch (torrent::shutdown_exception& e) {
acquire_global_lock();
lt_log_print(torrent::LOG_THREAD_NOTICE, "Shutting down thread.");
release_global_lock();
}
thread->m_state = STATE_INACTIVE;
__sync_synchronize();
return NULL;
return (m_taskScheduler.top()->time() - cachedTime).usec();
}
void
@@ -178,6 +144,15 @@ ThreadBase::call_queued_items() {
(*first++)(this);
}
void
ThreadBase::call_events() {
// Check for new queued items set by other threads.
if (!m_threadQueue->empty())
call_queued_items();
rak::priority_queue_perform(&m_taskScheduler, cachedTime);
}
void
ThreadBase::queue_item(thread_base_func newFunc) {
m_threadQueue->push_back(newFunc);
+3 -7
View File
@@ -54,16 +54,13 @@ class ThreadBase : public torrent::thread_base {
public:
typedef rak::priority_queue_default priority_queue;
typedef void (*thread_base_func)(ThreadBase*);
typedef void* (*pthread_func)(void*);
ThreadBase();
virtual ~ThreadBase();
priority_queue& task_scheduler() { return m_taskScheduler; }
virtual void init_thread() = 0;
void start_thread();
// Throw torrent::shutdown_exception to stop the thread.
static void stop_thread(ThreadBase* thread);
// ATM, only interaction with a thread's allowed by other threads is
@@ -71,8 +68,6 @@ public:
void queue_item(thread_base_func newFunc);
static void* event_loop(ThreadBase* thread);
// Only call this when global lock has been acquired, as it checks
// ThreadBase::is_main_polling() which is only guaranteed to remain
// 'false' if global lock keeps main thread from entering polling
@@ -82,9 +77,10 @@ public:
static void interrupt_main_polling();
protected:
inline rak::timer client_next_timeout();
int64_t next_timeout_usec();
void call_queued_items();
virtual void call_events();
// TODO: Add thread name.