7 #ifndef _FCITX_UTILS_EVENT_LIBUV_H_ 8 #define _FCITX_UTILS_EVENT_LIBUV_H_ 10 #include <sys/types.h> 16 #include <fcitx-utils/eventloopinterface.h> 18 #include <fcitx-utils/macros.h> 29 UVLoop() { uv_loop_init(&loop_); }
33 operator uv_loop_t *() {
return &loop_; }
38 enum class LibUVSourceEnableState { Disabled = 0, Oneshot = 1, Enabled = 2 };
49 auto *handle = handle_;
50 handle_->data =
nullptr;
52 uv_close(handle, [](uv_handle_t *handle) { free(handle); });
55 virtual void init(uv_loop_t *loop) = 0;
59 if (state_ == LibUVSourceEnableState::Disabled) {
62 auto loop = loop_.lock();
70 void setState(LibUVSourceEnableState state) {
71 if (state_ != state) {
77 std::weak_ptr<UVLoop> loop_;
78 uv_handle_t *handle_ =
nullptr;
79 LibUVSourceEnableState state_ = LibUVSourceEnableState::Disabled;
82 template <
typename Interface,
typename HandleType>
88 bool isEnabled()
const override {
89 return state_ != LibUVSourceEnableState::Disabled;
91 void setEnabled(
bool enabled)
override {
92 auto newState = enabled ? LibUVSourceEnableState::Enabled
93 : LibUVSourceEnableState::Disabled;
97 void setOneShot()
override { setState(LibUVSourceEnableState::Oneshot); }
99 bool isOneShot()
const override {
100 return state_ == LibUVSourceEnableState::Oneshot;
103 HandleType *handle() {
return reinterpret_cast<HandleType *
>(handle_); }
105 void init(uv_loop_t *loop)
override {
106 handle_ =
static_cast<uv_handle_t *
>(calloc(1,
sizeof(HandleType)));
108 if (!setup(loop, handle())) {
114 virtual bool setup(uv_loop_t *loop, HandleType *handle) = 0;
119 LibUVSourceIO(IOCallback _callback, std::shared_ptr<UVLoop> loop,
int fd,
121 :
LibUVSource(std::move(loop)), fd_(fd), flags_(flags),
122 callback_(std::make_shared<IOCallback>(std::move(_callback))) {
126 virtual int fd()
const override {
return fd_; }
128 virtual void setFd(
int fd)
override {
135 virtual IOEventFlags events()
const override {
return flags_; }
138 if (flags_ != flags) {
144 IOEventFlags revents()
const override {
return revents_; }
146 bool setup(uv_loop_t *loop, uv_poll_t *poll)
override;
151 std::shared_ptr<IOCallback> callback_;
157 uint64_t time, clockid_t clockid, uint64_t accuracy)
158 :
LibUVSource(std::move(loop)), time_(time), clock_(clockid),
160 callback_(std::make_shared<TimeCallback>(std::move(_callback))) {
164 uint64_t time()
const override {
return time_; }
166 void setTime(uint64_t time)
override {
171 uint64_t accuracy()
const override {
return accuracy_; }
173 void setAccuracy(uint64_t time)
override { accuracy_ = time; }
175 void setClock(clockid_t clockid) {
180 clockid_t clock()
const override {
return clock_; }
182 bool setup(uv_loop_t *loop, uv_timer_t *timer)
override;
187 std::shared_ptr<TimeCallback> callback_;
194 callback_(std::make_shared<EventCallback>(std::move(callback))) {
198 bool setup(uv_loop_t *loop, uv_prepare_t *prepare)
override;
200 std::shared_ptr<EventCallback> callback_;
206 : callback_(std::move(_callback)) {}
208 bool isOneShot()
const override {
209 return state_ == LibUVSourceEnableState::Oneshot;
211 bool isEnabled()
const override {
212 return state_ != LibUVSourceEnableState::Disabled;
214 void setEnabled(
bool enabled)
override {
215 state_ = enabled ? LibUVSourceEnableState::Enabled
216 : LibUVSourceEnableState::Disabled;
219 void setOneShot()
override { state_ = LibUVSourceEnableState::Oneshot; }
221 LibUVSourceEnableState state_ = LibUVSourceEnableState::Oneshot;
222 EventCallback callback_;
226 :
public LibUVSource<EventSourceAsync, uv_async_t>,
230 callback_(std::make_shared<EventCallback>(std::move(callback))) {
234 bool setup(uv_loop_t *loop, uv_async_t *async)
override;
236 void send()
override;
238 std::shared_ptr<EventCallback> callback_;
244 bool exec()
override;
245 void exit()
override;
246 const char *implementation()
const override;
247 void *nativeHandle()
override;
249 FCITX_NODISCARD std::unique_ptr<EventSourceIO>
250 addIOEvent(
int fd,
IOEventFlags flags, IOCallback callback)
override;
251 FCITX_NODISCARD std::unique_ptr<EventSourceTime>
252 addTimeEvent(clockid_t clock, uint64_t usec, uint64_t accuracy,
253 TimeCallback callback)
override;
254 FCITX_NODISCARD std::unique_ptr<EventSource>
255 addExitEvent(EventCallback callback)
override;
256 FCITX_NODISCARD std::unique_ptr<EventSource>
257 addDeferEvent(EventCallback callback)
override;
258 FCITX_NODISCARD std::unique_ptr<EventSource>
259 addPostEvent(EventCallback callback)
override;
260 FCITX_NODISCARD std::unique_ptr<EventSourceAsync>
261 addAsyncEvent(EventCallback callback)
override;
264 std::shared_ptr<UVLoop> loop_;
265 std::vector<TrackableObjectReference<LibUVSourceExit>> exitEvents_;
270 #endif // _FCITX_UTILS_EVENT_LIBUV_H_
Utitliy classes for statically tracking the life of a object.
Helper class to be used with TrackableObjectReference.