// $Id$
//
-// Copyright (C) 2008
+// Copyright (C) 2008
// Fraunhofer Institute for Open Communication Systems (FOKUS)
// Competence Center NETwork research (NET), St. Augustin, GERMANY
// Stefan Bund <g0dil@berlios.de>
#include <senf/Utils/Exception.hh>
#include <senf/Utils/senfassert.hh>
#include <senf/Utils/ScopeExit.hh>
-#include <execinfo.h>
+#ifdef SENF_DEBUG
+ #include <execinfo.h>
+#endif
#include <senf/config.hh>
#include <stdint.h>
+#include <stdio.h>
+#include "senf/Utils/IgnoreValue.hh"
//#include "FIFORunner.mpp"
#define prefix_
///////////////////////////////cc.p////////////////////////////////////////
prefix_ senf::scheduler::detail::FIFORunner::FIFORunner()
- : tasks_ (), next_ (tasks_.end()), watchdogRunning_ (false), watchdogMs_ (1000),
+ : tasks_ (), next_ (tasks_.end()), watchdogRunning_ (false), watchdogMs_ (1000),
watchdogAbort_ (false), watchdogCount_(0), hangCount_ (0), yield_ (false)
{
struct sigevent ev;
timer.it_interval.tv_nsec = (watchdogMs_ % 1000) * 1000000ul;
timer.it_value.tv_sec = timer.it_interval.tv_sec;
timer.it_value.tv_nsec = timer.it_interval.tv_nsec;
-
+
if (timer_settime(watchdogId_, 0, &timer, 0) < 0)
SENF_THROW_SYSTEM_EXCEPTION("timer_settime()");
f = l; ++f;
l = TaskList::current(normalPriorityEnd_);
- run(f, l);
+ run(f, l);
if (yield_) {
yield_ = false;
continue;
}
-
+
f = l; ++f;
l = tasks_.end();
run(f, l);
using namespace boost::lambda;
ScopeExit atExit ((
- var(watchdogCount_) = 0,
+ var(watchdogCount_) = 0,
var(next_) = l
));
-
+
while (next_ != end) {
TaskInfo & task (*next_);
if (task.runnable_) {
senf::scheduler::detail::FIFORunner::priorityEnd(TaskInfo::Priority p)
{
switch (p) {
- case senf::scheduler::detail::FIFORunner::TaskInfo::PRIORITY_LOW :
+ case senf::scheduler::detail::FIFORunner::TaskInfo::PRIORITY_LOW :
return tasks_.end();
- case senf::scheduler::detail::FIFORunner::TaskInfo::PRIORITY_NORMAL :
+ case senf::scheduler::detail::FIFORunner::TaskInfo::PRIORITY_NORMAL :
return TaskList::current(normalPriorityEnd_);
- case senf::scheduler::detail::FIFORunner::TaskInfo::PRIORITY_HIGH :
+ case senf::scheduler::detail::FIFORunner::TaskInfo::PRIORITY_HIGH :
return TaskList::current(highPriorityEnd_);
}
return tasks_.begin();
static char const hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
static void * entries[SENF_DEBUG_BACKTRACE_NUMCALLERS];
-
- write(1, "\n\n*** Scheduler task hanging (pid ",34);
+
+ // We don't care if the write commands below fail, we just give our best to inform the user
+ senf::IGNORE( write(1, "\n\n*** Scheduler task hanging (pid ",34) );
static char pid[7];
::snprintf(pid, 7, "%6d", ::getpid());
pid[6] = 0;
- write(1, pid, 6);
- write(1, "): ", 3);
- write(1, runningName_.c_str(), runningName_.size());
- write(1, " at\n ", 3);
-
+ senf::IGNORE( write(1, pid, 6) );
+ senf::IGNORE( write(1, "): ", 3) );
+ senf::IGNORE( write(1, runningName_.c_str(), runningName_.size()) );
+ senf::IGNORE( write(1, " at\n ", 3) );
+#ifdef SENF_DEBUG
unsigned nEntries( ::backtrace(entries, SENF_DEBUG_BACKTRACE_NUMCALLERS) );
for (unsigned i (0); i < nEntries; ++i) {
- write(1, " 0x", 3);
+ senf::IGNORE( write(1, " 0x", 3) );
for (unsigned j (sizeof(void*)); j > 0; --j) {
uintptr_t v ( reinterpret_cast<uintptr_t>(entries[i]) >> (8*(j-1)) );
- write(1, &(hex[ (v >> 4) & 0x0f ]), 1);
- write(1, &(hex[ (v ) & 0x0f ]), 1);
+ senf::IGNORE( write(1, &(hex[ (v >> 4) & 0x0f ]), 1) );
+ senf::IGNORE( write(1, &(hex[ (v ) & 0x0f ]), 1) );
}
}
- write(1, "\n", 1);
-
+#endif
+ senf::IGNORE( write(1, "\n", 1) );
+
#ifdef SENF_DEBUG
- write(1, "Task was initialized at\n", 24);
- write(1, runningBacktrace_.c_str(), runningBacktrace_.size());
+ senf::IGNORE( write(1, "Task was initialized at\n", 24) );
+ senf::IGNORE( write(1, runningBacktrace_.c_str(), runningBacktrace_.size()) );
#endif
- write(1, "\n", 1);
+ senf::IGNORE( write(1, "\n", 1) );
if (watchdogAbort_)
assert(false);
}
#undef prefix_
//#include "FIFORunner.mpp"
-\f
+
// Local Variables:
// mode: c++
// fill-column: 100