7 #ifndef _FCITX_UTILS_EVENT_LIBUV_H_ 8 #define _FCITX_UTILS_EVENT_LIBUV_H_ 15 #include <fcitx-utils/eventloopinterface.h> 17 #include <fcitx-utils/macros.h> 24 UVLoop() { uv_loop_init(&loop_); }
28 operator uv_loop_t *() {
return &loop_; }
33 enum class LibUVSourceEnableState { Disabled = 0, Oneshot = 1, Enabled = 2 };
44 auto *handle = handle_;
45 handle_->data =
nullptr;
47 uv_close(handle, [](uv_handle_t *handle) { free(handle); });
50 virtual void init(uv_loop_t *loop) = 0;
54 if (state_ == LibUVSourceEnableState::Disabled) {
57 auto loop = loop_.lock();
65 void setState(LibUVSourceEnableState state) {
66 if (state_ != state) {
72 std::weak_ptr<UVLoop> loop_;
73 uv_handle_t *handle_ =
nullptr;
74 LibUVSourceEnableState state_ = LibUVSourceEnableState::Disabled;
77 template <
typename Interface,
typename HandleType>
83 bool isEnabled()
const override {
84 return state_ != LibUVSourceEnableState::Disabled;
86 void setEnabled(
bool enabled)
override {
87 auto newState = enabled ? LibUVSourceEnableState::Enabled
88 : LibUVSourceEnableState::Disabled;
92 void setOneShot()
override { setState(LibUVSourceEnableState::Oneshot); }
94 bool isOneShot()
const override {
95 return state_ == LibUVSourceEnableState::Oneshot;
98 inline HandleType *handle() {
99 return reinterpret_cast<HandleType *
>(handle_);
102 void init(uv_loop_t *loop)
override {
103 handle_ =
static_cast<uv_handle_t *
>(calloc(1,
sizeof(HandleType)));
105 if (!setup(loop, handle())) {
111 virtual bool setup(uv_loop_t *loop, HandleType *handle) = 0;
116 LibUVSourceIO(IOCallback _callback, std::shared_ptr<UVLoop> loop,
int fd,
118 :
LibUVSource(std::move(loop)), fd_(fd), flags_(flags),
119 callback_(std::make_shared<IOCallback>(std::move(_callback))) {
123 virtual int fd()
const override {
return fd_; }
125 virtual void setFd(
int fd)
override {
132 virtual IOEventFlags events()
const override {
return flags_; }
135 if (flags_ != flags) {
141 IOEventFlags revents()
const override {
return revents_; }
143 bool setup(uv_loop_t *loop, uv_poll_t *poll)
override;
148 std::shared_ptr<IOCallback> callback_;
154 uint64_t time, clockid_t clockid, uint64_t accuracy)
155 :
LibUVSource(std::move(loop)), time_(time), clock_(clockid),
157 callback_(std::make_shared<TimeCallback>(std::move(_callback))) {
161 uint64_t time()
const override {
return time_; }
163 void setTime(uint64_t time)
override {
168 uint64_t accuracy()
const override {
return accuracy_; }
170 void setAccuracy(uint64_t time)
override { accuracy_ = time; }
172 void setClock(clockid_t clockid) {
177 clockid_t clock()
const override {
return clock_; }
179 bool setup(uv_loop_t *loop, uv_timer_t *timer)
override;
184 std::shared_ptr<TimeCallback> callback_;
191 callback_(std::make_shared<EventCallback>(std::move(callback))) {
195 bool setup(uv_loop_t *loop, uv_prepare_t *prepare)
override;
197 std::shared_ptr<EventCallback> callback_;
203 : callback_(std::move(_callback)) {}
205 bool isOneShot()
const override {
206 return state_ == LibUVSourceEnableState::Oneshot;
208 bool isEnabled()
const override {
209 return state_ != LibUVSourceEnableState::Disabled;
211 void setEnabled(
bool enabled)
override {
212 state_ = enabled ? LibUVSourceEnableState::Enabled
213 : LibUVSourceEnableState::Disabled;
216 void setOneShot()
override { state_ = LibUVSourceEnableState::Oneshot; }
218 LibUVSourceEnableState state_ = LibUVSourceEnableState::Oneshot;
219 EventCallback callback_;
223 :
public LibUVSource<EventSourceAsync, uv_async_t>,
227 callback_(std::make_shared<EventCallback>(std::move(callback))) {
231 bool setup(uv_loop_t *loop, uv_async_t *async)
override;
233 void send()
override;
235 std::shared_ptr<EventCallback> callback_;
241 bool exec()
override;
242 void exit()
override;
243 const char *implementation()
const override;
244 void *nativeHandle()
override;
246 FCITX_NODISCARD std::unique_ptr<EventSourceIO>
247 addIOEvent(
int fd,
IOEventFlags flags, IOCallback callback)
override;
248 FCITX_NODISCARD std::unique_ptr<EventSourceTime>
249 addTimeEvent(clockid_t clock, uint64_t usec, uint64_t accuracy,
250 TimeCallback callback)
override;
251 FCITX_NODISCARD std::unique_ptr<EventSource>
252 addExitEvent(EventCallback callback)
override;
253 FCITX_NODISCARD std::unique_ptr<EventSource>
254 addDeferEvent(EventCallback callback)
override;
255 FCITX_NODISCARD std::unique_ptr<EventSource>
256 addPostEvent(EventCallback callback)
override;
257 FCITX_NODISCARD std::unique_ptr<EventSourceAsync>
258 addAsyncEvent(EventCallback callback)
override;
261 std::shared_ptr<UVLoop> loop_;
262 std::vector<TrackableObjectReference<LibUVSourceExit>> exitEvents_;
267 #endif // _FCITX_UTILS_EVENT_LIBUV_H_
Utitliy classes for statically tracking the life of a object.
Helper class to be used with TrackableObjectReference.