/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (C) 2019, Google Inc. * * event_loop.cpp - cam - Event loop */ #include "event_loop.h" #include #include #include EventLoop *EventLoop::instance_ = nullptr; EventLoop::EventLoop() { assert(!instance_); evthread_use_pthreads(); base_ = event_base_new(); instance_ = this; } EventLoop::~EventLoop() { instance_ = nullptr; event_base_free(base_); libevent_global_shutdown(); } EventLoop *EventLoop::instance() { return instance_; } int EventLoop::exec() { exitCode_ = -1; event_base_loop(base_, EVLOOP_NO_EXIT_ON_EMPTY); return exitCode_; } void EventLoop::exit(int code) { exitCode_ = code; event_base_loopbreak(base_); } void EventLoop::callLater(const std::function &func) { { std::unique_lock locker(lock_); calls_.push_back(func); } event_base_once(base_, -1, EV_TIMEOUT, dispatchCallback, this, nullptr); } void EventLoop::dispatchCallback([[maybe_unused]] evutil_socket_t fd, [[maybe_unused]] short flags, void *param) { EventLoop *loop = static_cast(param); loop->dispatchCall(); } void EventLoop::dispatchCall() { std::function call; { std::unique_lock locker(lock_); if (calls_.empty()) return; call = calls_.front(); calls_.pop_front(); } call(); } a>logtreecommitdiff
blob: 91b11e43463df3038a65e052a3d94b7f259e376f (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101