fix bug in event-scheduler
diff --git a/include/event-scheduler.h b/include/event-scheduler.h
index 2055598..4eb6d6c 100644
--- a/include/event-scheduler.h
+++ b/include/event-scheduler.h
@@ -5,6 +5,8 @@
#include <event2/event.h>
#include <event2/thread.h>
+#include <event2/event-config.h>
+#include <event2/util.h>
#include <boost/function.hpp>
#include <boost/shared_ptr.hpp>
@@ -197,6 +199,7 @@
typedef boost::shared_lock<Mutex> ReadLock;
TaskMap m_taskMap;
Mutex m_mutex;
+ bool m_running;
event_base *m_base;
boost::thread m_thread;
};
diff --git a/src/event-scheduler.cpp b/src/event-scheduler.cpp
index be67aad..33697a5 100644
--- a/src/event-scheduler.cpp
+++ b/src/event-scheduler.cpp
@@ -14,6 +14,11 @@
task = NULL;
}
+void errorCallback(int err)
+{
+ cout << "Fatal error: " << err << endl;
+}
+
Task::Task(const Callback &callback, const Tag &tag, const SchedulerPtr &scheduler)
: m_callback(callback)
, m_tag(tag)
@@ -130,8 +135,9 @@
return interval;
}
-Scheduler::Scheduler()
+Scheduler::Scheduler() : m_running(false)
{
+ event_set_fatal_callback(errorCallback);
evthread_use_pthreads();
m_base = event_base_new();
}
@@ -144,19 +150,40 @@
void
Scheduler::eventLoop()
{
- event_base_loop(m_base, EVLOOP_NO_EXIT_ON_EMPTY);
+ while(true)
+ {
+ if (event_base_loop(m_base, EVLOOP_NO_EXIT_ON_EMPTY) < 0)
+ {
+ cout << "scheduler loop break error" << endl;
+ }
+ ReadLock(m_mutex);
+ if (!m_running)
+ {
+ cout << "scheduler loop break normal" << endl;
+ break;
+ }
+ }
}
void
Scheduler::start()
{
+ {
+ WriteLock(m_mutex);
+ m_running = true;
+ }
m_thread = boost::thread(&Scheduler::eventLoop, this);
}
void
Scheduler::shutdown()
{
+ {
+ WriteLock(m_mutex);
+ m_running = false;
+ }
event_base_loopbreak(m_base);
+ cout << "shutdown, calling loop break" << endl;
m_thread.join();
}
@@ -168,9 +195,17 @@
if (addToMap(newTask))
{
newTask->reset();
- evtimer_add(newTask->ev(), newTask->tv());
+ int res = evtimer_add(newTask->ev(), newTask->tv());
+ if (res < 0)
+ {
+ cout << "evtimer_add failed for " << task->tag() << endl;
+ }
return true;
}
+ else
+ {
+ cout << "fail to add task: " << task->tag() << endl;
+ }
return false;
}
@@ -184,7 +219,11 @@
{
TaskPtr task = it->second;
task->reset();
- evtimer_add(task->ev(), task->tv());
+ int res = evtimer_add(task->ev(), task->tv());
+ if (res < 0)
+ {
+ cout << "evtimer_add failed for " << task->tag() << endl;
+ }
}
}
diff --git a/test/test-event-scheduler.cc b/test/test-event-scheduler.cc
index 4642d95..41ae4e0 100644
--- a/test/test-event-scheduler.cc
+++ b/test/test-event-scheduler.cc
@@ -71,7 +71,6 @@
BOOST_CHECK_EQUAL(scheduler->size(), 1);
usleep(1000000);
- scheduler->shutdown();
int hello = 0, world = 0, period = 0;
@@ -99,6 +98,7 @@
// invoked every 0.2 seconds before deleted by matcher
BOOST_CHECK_EQUAL(period, static_cast<int>((0.6 + 0.6 + 0.4 + 0.2 + 0.1) / 0.2));
+ scheduler->shutdown();
}
BOOST_AUTO_TEST_CASE(GeneratorTest)