Module Name: src Committed By: christos Date: Sun Dec 18 22:34:06 UTC 2011
Modified Files: src/external/bsd/atf/dist/atf-run: timer.cpp timer.hpp Log Message: Don't use antiquated BSD API's that require global variable, use posix timers instead. To generate a diff of this commit: cvs rdiff -u -r1.1.1.2 -r1.2 src/external/bsd/atf/dist/atf-run/timer.cpp \ src/external/bsd/atf/dist/atf-run/timer.hpp Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/bsd/atf/dist/atf-run/timer.cpp diff -u src/external/bsd/atf/dist/atf-run/timer.cpp:1.1.1.2 src/external/bsd/atf/dist/atf-run/timer.cpp:1.2 --- src/external/bsd/atf/dist/atf-run/timer.cpp:1.1.1.2 Wed Oct 20 05:14:23 2010 +++ src/external/bsd/atf/dist/atf-run/timer.cpp Sun Dec 18 17:34:06 2011 @@ -27,9 +27,7 @@ // IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // -extern "C" { -#include <signal.h> -} +#include <csignal> #include <cerrno> @@ -46,56 +44,69 @@ namespace impl = atf::atf_run; // Auxiliary functions. // ------------------------------------------------------------------------ -namespace sigalrm { - -bool m_fired = false; -impl::timer* m_timer = NULL; - +static void -handler(const int signo) +handler(int signo, siginfo_t *si, void *uc) { - PRE(signo == SIGALRM); + impl::timer *timer = static_cast<impl::timer *>(si->si_value.sival_ptr); - m_fired = true; - m_timer->timeout_callback(); + timer->setfired(); + timer->timeout_callback(); } -} // anonymous namespace - // ------------------------------------------------------------------------ // The "timer" class. // ------------------------------------------------------------------------ -impl::timer::timer(const unsigned int seconds) +impl::timer::timer(const unsigned int seconds) : m_fired(false) { - sigalrm::m_fired = false; - sigalrm::m_timer = this; - m_sigalrm.reset(new signal_programmer(SIGALRM, sigalrm::handler)); - - ::itimerval timeval; - timeval.it_interval.tv_sec = 0; - timeval.it_interval.tv_usec = 0; - timeval.it_value.tv_sec = seconds; - timeval.it_value.tv_usec = 0; + struct sigaction sa; + ::sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = ::handler; + if (::sigaction(SIGALRM, &sa, &m_old_sa) == -1) + throw system_error(IMPL_NAME "::timer::timer", + "Failed to set signal handler", errno); + + + ::sigevent se; + se.sigev_notify = SIGEV_SIGNAL; + se.sigev_signo = SIGALRM; + se.sigev_value.sival_ptr = static_cast<void *>(this); + se.sigev_notify_function = NULL; + se.sigev_notify_attributes = NULL; + if (::timer_create(CLOCK_MONOTONIC, &se, &m_timer) == -1) { + ::sigaction(SIGALRM, &m_old_sa, NULL); + throw system_error(IMPL_NAME "::timer::timer", + "Failed to create timer", errno); + } - if (::setitimer(ITIMER_REAL, &timeval, &m_old_timeval) == -1) + ::itimerspec it; + it.it_interval.tv_sec = 0; + it.it_interval.tv_nsec = 0; + it.it_value.tv_sec = seconds; + it.it_value.tv_nsec = 0; + if (::timer_settime(m_timer, 0, &it, &m_old_it) == -1) { + ::sigaction(SIGALRM, &m_old_sa, NULL); + ::timer_delete(m_timer); throw system_error(IMPL_NAME "::timer::timer", "Failed to program timer", errno); + } } impl::timer::~timer(void) { - const int ret = ::setitimer(ITIMER_REAL, &m_old_timeval, NULL); + int ret = ::timer_delete(m_timer); + INV(ret != -1); + ret = ::sigaction(SIGALRM, &m_old_sa, NULL); INV(ret != -1); - sigalrm::m_timer = NULL; - sigalrm::m_fired = false; } bool impl::timer::fired(void) const { - return sigalrm::m_fired; + return m_fired; } // ------------------------------------------------------------------------ @@ -121,5 +132,5 @@ impl::child_timer::timeout_callback(void // Should use killpg(2) but, according to signal(7), using this system // call in a signal handler context is not safe. - ::kill(m_pid, SIGKILL); + ::killpg(-m_pid, SIGKILL); } Index: src/external/bsd/atf/dist/atf-run/timer.hpp diff -u src/external/bsd/atf/dist/atf-run/timer.hpp:1.1.1.2 src/external/bsd/atf/dist/atf-run/timer.hpp:1.2 --- src/external/bsd/atf/dist/atf-run/timer.hpp:1.1.1.2 Wed Oct 20 05:14:23 2010 +++ src/external/bsd/atf/dist/atf-run/timer.hpp Sun Dec 18 17:34:06 2011 @@ -30,12 +30,8 @@ #if !defined(_ATF_RUN_ALARM_HPP_) #define _ATF_RUN_ALARM_HPP_ -extern "C" { -#include <sys/time.h> -#include <sys/types.h> -} - -#include <memory> +#include <ctime> +#include <csignal> #include "atf-c++/utils.hpp" @@ -49,14 +45,17 @@ class signal_programmer; // ------------------------------------------------------------------------ class timer : utils::noncopyable { - ::itimerval m_old_timeval; - std::auto_ptr< signal_programmer > m_sigalrm; + ::timer_t m_timer; + ::itimerspec m_old_it; + struct sigaction m_old_sa; + bool m_fired; public: timer(const unsigned int); virtual ~timer(void); bool fired(void) const; + void setfired(void) { m_fired = true; } virtual void timeout_callback(void) = 0; };