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