2011-12-22 15:19:25 +00:00
|
|
|
/*
|
|
|
|
* \brief Connection to timer service
|
|
|
|
* \author Norman Feske
|
|
|
|
* \date 2008-08-22
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2013-01-10 20:44:47 +00:00
|
|
|
* Copyright (C) 2008-2013 Genode Labs GmbH
|
2011-12-22 15:19:25 +00:00
|
|
|
*
|
|
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
|
|
* under the terms of the GNU General Public License version 2.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _INCLUDE__TIMER_SESSION__CONNECTION_H_
|
|
|
|
#define _INCLUDE__TIMER_SESSION__CONNECTION_H_
|
|
|
|
|
|
|
|
#include <timer_session/client.h>
|
|
|
|
#include <base/connection.h>
|
|
|
|
|
|
|
|
namespace Timer {
|
|
|
|
|
2012-10-29 20:05:32 +00:00
|
|
|
class Connection : public Genode::Connection<Session>, public Session_client
|
2011-12-22 15:19:25 +00:00
|
|
|
{
|
2012-10-29 20:05:32 +00:00
|
|
|
private:
|
|
|
|
|
|
|
|
Lock _lock;
|
|
|
|
Signal_receiver _sig_rec;
|
|
|
|
Signal_context _default_sigh_ctx;
|
|
|
|
Signal_context_capability _default_sigh_cap;
|
|
|
|
Signal_context_capability _custom_sigh_cap;
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
Connection()
|
|
|
|
:
|
|
|
|
Genode::Connection<Session>(session("ram_quota=8K")),
|
|
|
|
Session_client(cap()),
|
|
|
|
_default_sigh_cap(_sig_rec.manage(&_default_sigh_ctx))
|
|
|
|
{
|
|
|
|
/* register default signal handler */
|
2013-02-22 11:38:01 +00:00
|
|
|
Session_client::sigh(_default_sigh_cap);
|
2012-10-29 20:05:32 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
~Connection() { _sig_rec.dissolve(&_default_sigh_ctx); }
|
|
|
|
|
2011-12-22 15:19:25 +00:00
|
|
|
/*
|
2012-10-29 20:05:32 +00:00
|
|
|
* Intercept 'sigh' to keep track of customized signal handlers
|
2011-12-22 15:19:25 +00:00
|
|
|
*/
|
2012-10-29 20:05:32 +00:00
|
|
|
void sigh(Signal_context_capability sigh)
|
|
|
|
{
|
|
|
|
_custom_sigh_cap = sigh;
|
|
|
|
Session_client::sigh(_custom_sigh_cap);
|
|
|
|
}
|
|
|
|
|
|
|
|
void usleep(unsigned us)
|
|
|
|
{
|
|
|
|
/* serialize sleep calls issued by different threads */
|
|
|
|
Lock::Guard guard(_lock);
|
|
|
|
|
|
|
|
/* temporarily install to the default signal handler */
|
|
|
|
if (_custom_sigh_cap.valid())
|
2013-02-22 11:38:01 +00:00
|
|
|
Session_client::sigh(_default_sigh_cap);
|
2012-10-29 20:05:32 +00:00
|
|
|
|
|
|
|
/* trigger timeout at default signal handler */
|
|
|
|
trigger_once(us);
|
|
|
|
_sig_rec.wait_for_signal();
|
|
|
|
|
|
|
|
/* revert custom signal handler if registered */
|
|
|
|
if (_custom_sigh_cap.valid())
|
2013-02-22 11:38:01 +00:00
|
|
|
Session_client::sigh(_custom_sigh_cap);
|
2012-10-29 20:05:32 +00:00
|
|
|
}
|
2011-12-22 15:19:25 +00:00
|
|
|
|
2012-10-29 20:05:32 +00:00
|
|
|
void msleep(unsigned ms)
|
|
|
|
{
|
|
|
|
usleep(1000*ms);
|
|
|
|
}
|
2011-12-22 15:19:25 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* _INCLUDE__TIMER_SESSION__CONNECTION_H_ */
|