summaryrefslogtreecommitdiffstats
path: root/src/sdeventplus/source/event.cpp
blob: c73f16c60865d4ada1409429c3c2a547ef431a32 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <sdeventplus/internal/sdevent.hpp>
#include <sdeventplus/source/event.hpp>
#include <utility>

namespace sdeventplus
{
namespace source
{

void EventBase::set_callback(Callback&& callback)
{
    this->callback = std::move(callback);
}

EventBase::EventBase(const char* name, CreateFunc create, const Event& event,
                     Callback&& callback) :
    Base(event, create_source(name, create, event), std::false_type()),
    callback(std::move(callback))
{
}

const EventBase::Callback& EventBase::get_callback() const
{
    return callback;
}

sd_event_source* EventBase::create_source(const char* name, CreateFunc create,
                                          const Event& event)
{
    sd_event_source* source;
    int r = (event.getSdEvent()->*create)(event.get(), &source, eventCallback,
                                          nullptr);
    if (r < 0)
    {
        throw SdEventError(-r, name);
    }
    return source;
}

int EventBase::eventCallback(sd_event_source* source, void* userdata)
{
    return sourceCallback<Callback, EventBase, &EventBase::get_callback>(
        "eventCallback", source, userdata);
}

Defer::Defer(const Event& event, Callback&& callback) :
    EventBase("sd_event_add_defer", &internal::SdEvent::sd_event_add_defer,
              event, std::move(callback))
{
}

Post::Post(const Event& event, Callback&& callback) :
    EventBase("sd_event_add_post", &internal::SdEvent::sd_event_add_post, event,
              std::move(callback))
{
}

Exit::Exit(const Event& event, Callback&& callback) :
    EventBase("sd_event_add_exit", &internal::SdEvent::sd_event_add_exit, event,
              std::move(callback))
{
}

} // namespace source
} // namespace sdeventplus
OpenPOWER on IntegriCloud