blob: 98b1a0523c1e07c7591a961ce1aabd4531ad66e9 [file] [log] [blame]
#include <sdeventplus/exception.hpp>
#include <sdeventplus/source/signal.hpp>
#include <type_traits>
#include <utility>
namespace sdeventplus
{
namespace source
{
Signal::Signal(const Event& event, int sig, Callback&& callback) :
Base(event, create_source(event, sig), std::false_type()),
callback(std::move(callback))
{
}
void Signal::set_callback(Callback&& callback)
{
this->callback = std::move(callback);
}
int Signal::get_signal() const
{
int r = event.getSdEvent()->sd_event_source_get_signal(source.get());
if (r < 0)
{
throw SdEventError(-r, "sd_event_source_get_signal");
}
return r;
}
const Signal::Callback& Signal::get_callback() const
{
return callback;
}
sd_event_source* Signal::create_source(const Event& event, int sig)
{
sd_event_source* source;
int r = event.getSdEvent()->sd_event_add_signal(event.get(), &source, sig,
signalCallback, nullptr);
if (r < 0)
{
throw SdEventError(-r, "sd_event_add_signal");
}
return source;
}
int Signal::signalCallback(sd_event_source* source,
const struct signalfd_siginfo* si, void* userdata)
{
return sourceCallback<Callback, Signal, &Signal::get_callback>(
"signalCallback", source, userdata, si);
}
} // namespace source
} // namespace sdeventplus