blob: 64dc7ee7696893e32b53df8232f81b4ef3213d84 [file] [log] [blame]
#include <functional>
#include <sdeventplus/event.hpp>
#include <sdeventplus/exception.hpp>
#include <sdeventplus/internal/sdevent.hpp>
#include <systemd/sd-event.h>
#include <type_traits>
namespace sdeventplus
{
Event::Event(sd_event* event, const internal::SdEvent* sdevent) :
sdevent(sdevent), event(event, &internal::SdEvent::sd_event_ref,
&internal::SdEvent::sd_event_unref, sdevent)
{
}
Event::Event(sd_event* event, std::false_type,
const internal::SdEvent* sdevent) :
sdevent(sdevent),
event(event, &internal::SdEvent::sd_event_ref,
&internal::SdEvent::sd_event_unref, std::false_type(), sdevent)
{
}
Event Event::get_new(const internal::SdEvent* sdevent)
{
sd_event* event = nullptr;
int r = sdevent->sd_event_new(&event);
if (r < 0)
{
throw SdEventError(-r, "sd_event_new");
}
return Event(event, std::false_type(), sdevent);
}
Event Event::get_default(const internal::SdEvent* sdevent)
{
sd_event* event = nullptr;
int r = sdevent->sd_event_default(&event);
if (r < 0)
{
throw SdEventError(-r, "sd_event_default");
}
return Event(event, std::false_type(), sdevent);
}
sd_event* Event::get() const
{
return event.get();
}
const internal::SdEvent* Event::getSdEvent() const
{
return sdevent;
}
int Event::prepare() const
{
int r = sdevent->sd_event_prepare(event.get());
if (r < 0)
{
throw SdEventError(-r, "sd_event_prepare");
}
return r;
}
int Event::wait(MaybeTimeout timeout) const
{
// An unsigned -1 timeout value means infinity in sd_event
uint64_t timeout_usec = timeout ? timeout->count() : -1;
int r = sdevent->sd_event_wait(event.get(), timeout_usec);
if (r < 0)
{
throw SdEventError(-r, "sd_event_wait");
}
return r;
}
int Event::dispatch() const
{
int r = sdevent->sd_event_dispatch(event.get());
if (r < 0)
{
throw SdEventError(-r, "sd_event_dispatch");
}
return r;
}
int Event::run(MaybeTimeout timeout) const
{
// An unsigned -1 timeout value means infinity in sd_event
uint64_t timeout_usec = timeout ? timeout->count() : -1;
int r = sdevent->sd_event_run(event.get(), timeout_usec);
if (r < 0)
{
throw SdEventError(-r, "sd_event_run");
}
return r;
}
int Event::loop() const
{
int r = sdevent->sd_event_loop(event.get());
if (r < 0)
{
throw SdEventError(-r, "sd_event_loop");
}
return r;
}
void Event::exit(int code) const
{
int r = sdevent->sd_event_exit(event.get(), code);
if (r < 0)
{
throw SdEventError(-r, "sd_event_exit");
}
}
int Event::get_exit_code() const
{
int code;
int r = sdevent->sd_event_get_exit_code(event.get(), &code);
if (r < 0)
{
throw SdEventError(-r, "sd_event_get_exit_code");
}
return code;
}
bool Event::get_watchdog() const
{
int r = sdevent->sd_event_get_watchdog(event.get());
if (r < 0)
{
throw SdEventError(-r, "sd_event_get_watchdog");
}
return r;
}
bool Event::set_watchdog(bool b) const
{
int r = sdevent->sd_event_set_watchdog(event.get(), b);
if (r < 0)
{
throw SdEventError(-r, "sd_event_set_watchdog");
}
return r;
}
} // namespace sdeventplus