1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * libwebsockets - small server side websockets and web server implementation
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Copyright (C) 2010 - 2021 Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker *
6*1c60b9acSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy
7*1c60b9acSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to
8*1c60b9acSAndroid Build Coastguard Worker * deal in the Software without restriction, including without limitation the
9*1c60b9acSAndroid Build Coastguard Worker * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*1c60b9acSAndroid Build Coastguard Worker * sell copies of the Software, and to permit persons to whom the Software is
11*1c60b9acSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions:
12*1c60b9acSAndroid Build Coastguard Worker *
13*1c60b9acSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in
14*1c60b9acSAndroid Build Coastguard Worker * all copies or substantial portions of the Software.
15*1c60b9acSAndroid Build Coastguard Worker *
16*1c60b9acSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*1c60b9acSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*1c60b9acSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*1c60b9acSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*1c60b9acSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*1c60b9acSAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*1c60b9acSAndroid Build Coastguard Worker * IN THE SOFTWARE.
23*1c60b9acSAndroid Build Coastguard Worker */
24*1c60b9acSAndroid Build Coastguard Worker
25*1c60b9acSAndroid Build Coastguard Worker #include "private-lib-core.h"
26*1c60b9acSAndroid Build Coastguard Worker #include "private-lib-event-libs-uloop.h"
27*1c60b9acSAndroid Build Coastguard Worker
28*1c60b9acSAndroid Build Coastguard Worker #define pt_to_priv_uloop(_pt) ((struct lws_pt_eventlibs_uloop *)(_pt)->evlib_pt)
29*1c60b9acSAndroid Build Coastguard Worker #define wsi_to_priv_uloop(_w) ((struct lws_wsi_eventlibs_uloop *)(_w)->evlib_wsi)
30*1c60b9acSAndroid Build Coastguard Worker
31*1c60b9acSAndroid Build Coastguard Worker static void
lws_uloop_hrtimer_cb(struct uloop_timeout * ti)32*1c60b9acSAndroid Build Coastguard Worker lws_uloop_hrtimer_cb(struct uloop_timeout *ti)
33*1c60b9acSAndroid Build Coastguard Worker {
34*1c60b9acSAndroid Build Coastguard Worker struct lws_pt_eventlibs_uloop *upt = lws_container_of(ti,
35*1c60b9acSAndroid Build Coastguard Worker struct lws_pt_eventlibs_uloop, hrtimer);
36*1c60b9acSAndroid Build Coastguard Worker struct lws_context_per_thread *pt = upt->pt;
37*1c60b9acSAndroid Build Coastguard Worker lws_usec_t us;
38*1c60b9acSAndroid Build Coastguard Worker
39*1c60b9acSAndroid Build Coastguard Worker lws_pt_lock(pt, __func__);
40*1c60b9acSAndroid Build Coastguard Worker us = __lws_sul_service_ripe(pt->pt_sul_owner, LWS_COUNT_PT_SUL_OWNERS,
41*1c60b9acSAndroid Build Coastguard Worker lws_now_usecs());
42*1c60b9acSAndroid Build Coastguard Worker if (us)
43*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_set(ti, us < 1000 ? 1 : (int)(us / 1000));
44*1c60b9acSAndroid Build Coastguard Worker
45*1c60b9acSAndroid Build Coastguard Worker lws_pt_unlock(pt);
46*1c60b9acSAndroid Build Coastguard Worker }
47*1c60b9acSAndroid Build Coastguard Worker
48*1c60b9acSAndroid Build Coastguard Worker static void
lws_uloop_idle_timer_cb(struct uloop_timeout * ti)49*1c60b9acSAndroid Build Coastguard Worker lws_uloop_idle_timer_cb(struct uloop_timeout *ti)
50*1c60b9acSAndroid Build Coastguard Worker {
51*1c60b9acSAndroid Build Coastguard Worker struct lws_pt_eventlibs_uloop *upt = lws_container_of(ti,
52*1c60b9acSAndroid Build Coastguard Worker struct lws_pt_eventlibs_uloop,
53*1c60b9acSAndroid Build Coastguard Worker idle_timer);
54*1c60b9acSAndroid Build Coastguard Worker struct lws_context_per_thread *pt = upt->pt;
55*1c60b9acSAndroid Build Coastguard Worker lws_usec_t us;
56*1c60b9acSAndroid Build Coastguard Worker
57*1c60b9acSAndroid Build Coastguard Worker if (pt->is_destroyed)
58*1c60b9acSAndroid Build Coastguard Worker return;
59*1c60b9acSAndroid Build Coastguard Worker
60*1c60b9acSAndroid Build Coastguard Worker lws_service_do_ripe_rxflow(pt);
61*1c60b9acSAndroid Build Coastguard Worker
62*1c60b9acSAndroid Build Coastguard Worker /*
63*1c60b9acSAndroid Build Coastguard Worker * is there anybody with pending stuff that needs service forcing?
64*1c60b9acSAndroid Build Coastguard Worker */
65*1c60b9acSAndroid Build Coastguard Worker if (!lws_service_adjust_timeout(pt->context, 1, pt->tid)) {
66*1c60b9acSAndroid Build Coastguard Worker /* -1 timeout means just do forced service */
67*1c60b9acSAndroid Build Coastguard Worker _lws_plat_service_forced_tsi(pt->context, pt->tid);
68*1c60b9acSAndroid Build Coastguard Worker /* still somebody left who wants forced service? */
69*1c60b9acSAndroid Build Coastguard Worker if (!lws_service_adjust_timeout(pt->context, 1, pt->tid)) {
70*1c60b9acSAndroid Build Coastguard Worker /* yes... come back again later */
71*1c60b9acSAndroid Build Coastguard Worker
72*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_set(ti, 1 /* 1ms */);
73*1c60b9acSAndroid Build Coastguard Worker
74*1c60b9acSAndroid Build Coastguard Worker return;
75*1c60b9acSAndroid Build Coastguard Worker }
76*1c60b9acSAndroid Build Coastguard Worker }
77*1c60b9acSAndroid Build Coastguard Worker
78*1c60b9acSAndroid Build Coastguard Worker /* account for hrtimer */
79*1c60b9acSAndroid Build Coastguard Worker
80*1c60b9acSAndroid Build Coastguard Worker lws_pt_lock(pt, __func__);
81*1c60b9acSAndroid Build Coastguard Worker us = __lws_sul_service_ripe(pt->pt_sul_owner, LWS_COUNT_PT_SUL_OWNERS,
82*1c60b9acSAndroid Build Coastguard Worker lws_now_usecs());
83*1c60b9acSAndroid Build Coastguard Worker if (us) {
84*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_cancel(&upt->hrtimer);
85*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_set(&upt->hrtimer,
86*1c60b9acSAndroid Build Coastguard Worker us < 1000 ? 1 : (int)(us / 1000));
87*1c60b9acSAndroid Build Coastguard Worker }
88*1c60b9acSAndroid Build Coastguard Worker
89*1c60b9acSAndroid Build Coastguard Worker lws_pt_unlock(pt);
90*1c60b9acSAndroid Build Coastguard Worker
91*1c60b9acSAndroid Build Coastguard Worker if (pt->destroy_self)
92*1c60b9acSAndroid Build Coastguard Worker lws_context_destroy(pt->context);
93*1c60b9acSAndroid Build Coastguard Worker }
94*1c60b9acSAndroid Build Coastguard Worker
95*1c60b9acSAndroid Build Coastguard Worker static void
lws_uloop_cb(struct uloop_fd * ufd,unsigned int revents)96*1c60b9acSAndroid Build Coastguard Worker lws_uloop_cb(struct uloop_fd *ufd, unsigned int revents)
97*1c60b9acSAndroid Build Coastguard Worker {
98*1c60b9acSAndroid Build Coastguard Worker struct lws_wsi_eventlibs_uloop *wu = lws_container_of(ufd,
99*1c60b9acSAndroid Build Coastguard Worker struct lws_wsi_eventlibs_uloop, fd);
100*1c60b9acSAndroid Build Coastguard Worker struct lws_context *context = wu->wsi->a.context;
101*1c60b9acSAndroid Build Coastguard Worker struct lws_context_per_thread *pt;
102*1c60b9acSAndroid Build Coastguard Worker struct lws_pollfd eventfd;
103*1c60b9acSAndroid Build Coastguard Worker
104*1c60b9acSAndroid Build Coastguard Worker eventfd.fd = wu->wsi->desc.sockfd;
105*1c60b9acSAndroid Build Coastguard Worker eventfd.events = 0;
106*1c60b9acSAndroid Build Coastguard Worker eventfd.revents = 0;
107*1c60b9acSAndroid Build Coastguard Worker
108*1c60b9acSAndroid Build Coastguard Worker if (revents & ULOOP_READ) {
109*1c60b9acSAndroid Build Coastguard Worker eventfd.events = LWS_POLLIN;
110*1c60b9acSAndroid Build Coastguard Worker eventfd.revents = LWS_POLLIN;
111*1c60b9acSAndroid Build Coastguard Worker }
112*1c60b9acSAndroid Build Coastguard Worker if (revents & ULOOP_WRITE) {
113*1c60b9acSAndroid Build Coastguard Worker eventfd.events |= LWS_POLLOUT;
114*1c60b9acSAndroid Build Coastguard Worker eventfd.revents |= LWS_POLLOUT;
115*1c60b9acSAndroid Build Coastguard Worker }
116*1c60b9acSAndroid Build Coastguard Worker
117*1c60b9acSAndroid Build Coastguard Worker pt = &context->pt[(int)wu->wsi->tsi];
118*1c60b9acSAndroid Build Coastguard Worker if (pt->is_destroyed)
119*1c60b9acSAndroid Build Coastguard Worker return;
120*1c60b9acSAndroid Build Coastguard Worker
121*1c60b9acSAndroid Build Coastguard Worker lws_service_fd_tsi(context, &eventfd, wu->wsi->tsi);
122*1c60b9acSAndroid Build Coastguard Worker
123*1c60b9acSAndroid Build Coastguard Worker if (pt->destroy_self) {
124*1c60b9acSAndroid Build Coastguard Worker lwsl_cx_notice(context, "pt destroy self coming true");
125*1c60b9acSAndroid Build Coastguard Worker lws_context_destroy(pt->context);
126*1c60b9acSAndroid Build Coastguard Worker return;
127*1c60b9acSAndroid Build Coastguard Worker }
128*1c60b9acSAndroid Build Coastguard Worker
129*1c60b9acSAndroid Build Coastguard Worker /* set the idle timer for 1ms ahead */
130*1c60b9acSAndroid Build Coastguard Worker
131*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_cancel(&pt_to_priv_uloop(pt)->idle_timer);
132*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_set(&pt_to_priv_uloop(pt)->idle_timer, 1);
133*1c60b9acSAndroid Build Coastguard Worker }
134*1c60b9acSAndroid Build Coastguard Worker
135*1c60b9acSAndroid Build Coastguard Worker static int
elops_listen_init_uloop(struct lws_dll2 * d,void * user)136*1c60b9acSAndroid Build Coastguard Worker elops_listen_init_uloop(struct lws_dll2 *d, void *user)
137*1c60b9acSAndroid Build Coastguard Worker {
138*1c60b9acSAndroid Build Coastguard Worker struct lws *wsi = lws_container_of(d, struct lws, listen_list);
139*1c60b9acSAndroid Build Coastguard Worker struct lws_wsi_eventlibs_uloop *wu = wsi_to_priv_uloop(wsi);
140*1c60b9acSAndroid Build Coastguard Worker
141*1c60b9acSAndroid Build Coastguard Worker wu->wsi = wsi;
142*1c60b9acSAndroid Build Coastguard Worker wu->fd.fd = wsi->desc.sockfd;
143*1c60b9acSAndroid Build Coastguard Worker wu->fd.cb = lws_uloop_cb;
144*1c60b9acSAndroid Build Coastguard Worker uloop_fd_add(&wu->fd, ULOOP_READ);
145*1c60b9acSAndroid Build Coastguard Worker wu->actual_events = ULOOP_READ;
146*1c60b9acSAndroid Build Coastguard Worker
147*1c60b9acSAndroid Build Coastguard Worker return 0;
148*1c60b9acSAndroid Build Coastguard Worker }
149*1c60b9acSAndroid Build Coastguard Worker
150*1c60b9acSAndroid Build Coastguard Worker static int
elops_init_pt_uloop(struct lws_context * context,void * v,int tsi)151*1c60b9acSAndroid Build Coastguard Worker elops_init_pt_uloop(struct lws_context *context, void *v, int tsi)
152*1c60b9acSAndroid Build Coastguard Worker {
153*1c60b9acSAndroid Build Coastguard Worker struct lws_context_per_thread *pt = &context->pt[tsi];
154*1c60b9acSAndroid Build Coastguard Worker struct lws_pt_eventlibs_uloop *ptpr = pt_to_priv_uloop(pt);
155*1c60b9acSAndroid Build Coastguard Worker
156*1c60b9acSAndroid Build Coastguard Worker ptpr->pt = pt;
157*1c60b9acSAndroid Build Coastguard Worker
158*1c60b9acSAndroid Build Coastguard Worker lws_vhost_foreach_listen_wsi(context, NULL, elops_listen_init_uloop);
159*1c60b9acSAndroid Build Coastguard Worker
160*1c60b9acSAndroid Build Coastguard Worker /* static event loop objects */
161*1c60b9acSAndroid Build Coastguard Worker
162*1c60b9acSAndroid Build Coastguard Worker ptpr->hrtimer.cb = lws_uloop_hrtimer_cb;
163*1c60b9acSAndroid Build Coastguard Worker ptpr->idle_timer.cb = lws_uloop_idle_timer_cb;
164*1c60b9acSAndroid Build Coastguard Worker
165*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_add(&ptpr->hrtimer);
166*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_add(&ptpr->idle_timer);
167*1c60b9acSAndroid Build Coastguard Worker
168*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_set(&ptpr->hrtimer, 1);
169*1c60b9acSAndroid Build Coastguard Worker
170*1c60b9acSAndroid Build Coastguard Worker return 0;
171*1c60b9acSAndroid Build Coastguard Worker }
172*1c60b9acSAndroid Build Coastguard Worker
173*1c60b9acSAndroid Build Coastguard Worker static int
elops_accept_uloop(struct lws * wsi)174*1c60b9acSAndroid Build Coastguard Worker elops_accept_uloop(struct lws *wsi)
175*1c60b9acSAndroid Build Coastguard Worker {
176*1c60b9acSAndroid Build Coastguard Worker struct lws_wsi_eventlibs_uloop *wu = wsi_to_priv_uloop(wsi);
177*1c60b9acSAndroid Build Coastguard Worker
178*1c60b9acSAndroid Build Coastguard Worker wu->wsi = wsi;
179*1c60b9acSAndroid Build Coastguard Worker wu->fd.fd = wsi->desc.sockfd;
180*1c60b9acSAndroid Build Coastguard Worker wu->fd.cb = lws_uloop_cb;
181*1c60b9acSAndroid Build Coastguard Worker uloop_fd_add(&wu->fd, ULOOP_READ);
182*1c60b9acSAndroid Build Coastguard Worker wu->actual_events = ULOOP_READ;
183*1c60b9acSAndroid Build Coastguard Worker
184*1c60b9acSAndroid Build Coastguard Worker return 0;
185*1c60b9acSAndroid Build Coastguard Worker }
186*1c60b9acSAndroid Build Coastguard Worker
187*1c60b9acSAndroid Build Coastguard Worker static void
elops_io_uloop(struct lws * wsi,unsigned int flags)188*1c60b9acSAndroid Build Coastguard Worker elops_io_uloop(struct lws *wsi, unsigned int flags)
189*1c60b9acSAndroid Build Coastguard Worker {
190*1c60b9acSAndroid Build Coastguard Worker struct lws_context_per_thread *pt = &wsi->a.context->pt[(int)wsi->tsi];
191*1c60b9acSAndroid Build Coastguard Worker struct lws_wsi_eventlibs_uloop *wu = wsi_to_priv_uloop(wsi);
192*1c60b9acSAndroid Build Coastguard Worker unsigned int ulf = (unsigned int)(((flags & LWS_EV_WRITE) ? ULOOP_WRITE : 0) |
193*1c60b9acSAndroid Build Coastguard Worker ((flags & LWS_EV_READ) ? ULOOP_READ : 0)), u;
194*1c60b9acSAndroid Build Coastguard Worker
195*1c60b9acSAndroid Build Coastguard Worker if (wsi->a.context->being_destroyed || pt->is_destroyed)
196*1c60b9acSAndroid Build Coastguard Worker return;
197*1c60b9acSAndroid Build Coastguard Worker
198*1c60b9acSAndroid Build Coastguard Worker assert((flags & (LWS_EV_START | LWS_EV_STOP)) &&
199*1c60b9acSAndroid Build Coastguard Worker (flags & (LWS_EV_READ | LWS_EV_WRITE)));
200*1c60b9acSAndroid Build Coastguard Worker
201*1c60b9acSAndroid Build Coastguard Worker u = wu->actual_events;
202*1c60b9acSAndroid Build Coastguard Worker if (flags & LWS_EV_START)
203*1c60b9acSAndroid Build Coastguard Worker u |= ulf;
204*1c60b9acSAndroid Build Coastguard Worker if (flags & LWS_EV_STOP)
205*1c60b9acSAndroid Build Coastguard Worker u &= ~ulf;
206*1c60b9acSAndroid Build Coastguard Worker
207*1c60b9acSAndroid Build Coastguard Worker uloop_fd_add(&wu->fd, u);
208*1c60b9acSAndroid Build Coastguard Worker wu->actual_events = u;
209*1c60b9acSAndroid Build Coastguard Worker }
210*1c60b9acSAndroid Build Coastguard Worker
211*1c60b9acSAndroid Build Coastguard Worker static void
elops_run_pt_uloop(struct lws_context * context,int tsi)212*1c60b9acSAndroid Build Coastguard Worker elops_run_pt_uloop(struct lws_context *context, int tsi)
213*1c60b9acSAndroid Build Coastguard Worker {
214*1c60b9acSAndroid Build Coastguard Worker uloop_run();
215*1c60b9acSAndroid Build Coastguard Worker }
216*1c60b9acSAndroid Build Coastguard Worker
217*1c60b9acSAndroid Build Coastguard Worker static int
elops_listen_destroy_uloop(struct lws_dll2 * d,void * user)218*1c60b9acSAndroid Build Coastguard Worker elops_listen_destroy_uloop(struct lws_dll2 *d, void *user)
219*1c60b9acSAndroid Build Coastguard Worker {
220*1c60b9acSAndroid Build Coastguard Worker struct lws *wsi = lws_container_of(d, struct lws, listen_list);
221*1c60b9acSAndroid Build Coastguard Worker struct lws_wsi_eventlibs_uloop *wu = wsi_to_priv_uloop(wsi);
222*1c60b9acSAndroid Build Coastguard Worker
223*1c60b9acSAndroid Build Coastguard Worker uloop_fd_delete(&wu->fd);
224*1c60b9acSAndroid Build Coastguard Worker
225*1c60b9acSAndroid Build Coastguard Worker return 0;
226*1c60b9acSAndroid Build Coastguard Worker }
227*1c60b9acSAndroid Build Coastguard Worker
228*1c60b9acSAndroid Build Coastguard Worker static void
elops_destroy_pt_uloop(struct lws_context * context,int tsi)229*1c60b9acSAndroid Build Coastguard Worker elops_destroy_pt_uloop(struct lws_context *context, int tsi)
230*1c60b9acSAndroid Build Coastguard Worker {
231*1c60b9acSAndroid Build Coastguard Worker struct lws_context_per_thread *pt = &context->pt[tsi];
232*1c60b9acSAndroid Build Coastguard Worker struct lws_pt_eventlibs_uloop *ptpr = pt_to_priv_uloop(pt);
233*1c60b9acSAndroid Build Coastguard Worker
234*1c60b9acSAndroid Build Coastguard Worker lws_vhost_foreach_listen_wsi(context, NULL, elops_listen_destroy_uloop);
235*1c60b9acSAndroid Build Coastguard Worker
236*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_cancel(&ptpr->hrtimer);
237*1c60b9acSAndroid Build Coastguard Worker uloop_timeout_cancel(&ptpr->idle_timer);
238*1c60b9acSAndroid Build Coastguard Worker }
239*1c60b9acSAndroid Build Coastguard Worker
240*1c60b9acSAndroid Build Coastguard Worker static void
elops_destroy_wsi_uloop(struct lws * wsi)241*1c60b9acSAndroid Build Coastguard Worker elops_destroy_wsi_uloop(struct lws *wsi)
242*1c60b9acSAndroid Build Coastguard Worker {
243*1c60b9acSAndroid Build Coastguard Worker struct lws_context_per_thread *pt;
244*1c60b9acSAndroid Build Coastguard Worker
245*1c60b9acSAndroid Build Coastguard Worker if (!wsi)
246*1c60b9acSAndroid Build Coastguard Worker return;
247*1c60b9acSAndroid Build Coastguard Worker
248*1c60b9acSAndroid Build Coastguard Worker pt = &wsi->a.context->pt[(int)wsi->tsi];
249*1c60b9acSAndroid Build Coastguard Worker if (pt->is_destroyed)
250*1c60b9acSAndroid Build Coastguard Worker return;
251*1c60b9acSAndroid Build Coastguard Worker
252*1c60b9acSAndroid Build Coastguard Worker uloop_fd_delete(&wsi_to_priv_uloop(wsi)->fd);
253*1c60b9acSAndroid Build Coastguard Worker }
254*1c60b9acSAndroid Build Coastguard Worker
255*1c60b9acSAndroid Build Coastguard Worker static int
elops_wsi_logical_close_uloop(struct lws * wsi)256*1c60b9acSAndroid Build Coastguard Worker elops_wsi_logical_close_uloop(struct lws *wsi)
257*1c60b9acSAndroid Build Coastguard Worker {
258*1c60b9acSAndroid Build Coastguard Worker elops_destroy_wsi_uloop(wsi);
259*1c60b9acSAndroid Build Coastguard Worker
260*1c60b9acSAndroid Build Coastguard Worker return 0;
261*1c60b9acSAndroid Build Coastguard Worker }
262*1c60b9acSAndroid Build Coastguard Worker
263*1c60b9acSAndroid Build Coastguard Worker static int
elops_init_vhost_listen_wsi_uloop(struct lws * wsi)264*1c60b9acSAndroid Build Coastguard Worker elops_init_vhost_listen_wsi_uloop(struct lws *wsi)
265*1c60b9acSAndroid Build Coastguard Worker {
266*1c60b9acSAndroid Build Coastguard Worker struct lws_wsi_eventlibs_uloop *wu;
267*1c60b9acSAndroid Build Coastguard Worker
268*1c60b9acSAndroid Build Coastguard Worker if (!wsi) {
269*1c60b9acSAndroid Build Coastguard Worker assert(0);
270*1c60b9acSAndroid Build Coastguard Worker return 0;
271*1c60b9acSAndroid Build Coastguard Worker }
272*1c60b9acSAndroid Build Coastguard Worker
273*1c60b9acSAndroid Build Coastguard Worker wu = wsi_to_priv_uloop(wsi);
274*1c60b9acSAndroid Build Coastguard Worker wu->wsi = wsi;
275*1c60b9acSAndroid Build Coastguard Worker wu->fd.fd = wsi->desc.sockfd;
276*1c60b9acSAndroid Build Coastguard Worker wu->fd.cb = lws_uloop_cb;
277*1c60b9acSAndroid Build Coastguard Worker uloop_fd_add(&wu->fd, ULOOP_READ);
278*1c60b9acSAndroid Build Coastguard Worker
279*1c60b9acSAndroid Build Coastguard Worker wu->actual_events = ULOOP_READ;
280*1c60b9acSAndroid Build Coastguard Worker
281*1c60b9acSAndroid Build Coastguard Worker return 0;
282*1c60b9acSAndroid Build Coastguard Worker }
283*1c60b9acSAndroid Build Coastguard Worker
284*1c60b9acSAndroid Build Coastguard Worker static const struct lws_event_loop_ops event_loop_ops_uloop = {
285*1c60b9acSAndroid Build Coastguard Worker /* name */ "uloop",
286*1c60b9acSAndroid Build Coastguard Worker /* init_context */ NULL,
287*1c60b9acSAndroid Build Coastguard Worker /* destroy_context1 */ NULL,
288*1c60b9acSAndroid Build Coastguard Worker /* destroy_context2 */ NULL,
289*1c60b9acSAndroid Build Coastguard Worker /* init_vhost_listen_wsi */ elops_init_vhost_listen_wsi_uloop,
290*1c60b9acSAndroid Build Coastguard Worker /* init_pt */ elops_init_pt_uloop,
291*1c60b9acSAndroid Build Coastguard Worker /* wsi_logical_close */ elops_wsi_logical_close_uloop,
292*1c60b9acSAndroid Build Coastguard Worker /* check_client_connect_ok */ NULL,
293*1c60b9acSAndroid Build Coastguard Worker /* close_handle_manually */ NULL,
294*1c60b9acSAndroid Build Coastguard Worker /* accept */ elops_accept_uloop,
295*1c60b9acSAndroid Build Coastguard Worker /* io */ elops_io_uloop,
296*1c60b9acSAndroid Build Coastguard Worker /* run_pt */ elops_run_pt_uloop,
297*1c60b9acSAndroid Build Coastguard Worker /* destroy_pt */ elops_destroy_pt_uloop,
298*1c60b9acSAndroid Build Coastguard Worker /* destroy wsi */ elops_destroy_wsi_uloop,
299*1c60b9acSAndroid Build Coastguard Worker /* foreign_thread */ NULL,
300*1c60b9acSAndroid Build Coastguard Worker
301*1c60b9acSAndroid Build Coastguard Worker /* flags */ 0,
302*1c60b9acSAndroid Build Coastguard Worker
303*1c60b9acSAndroid Build Coastguard Worker /* evlib_size_ctx */ 0,
304*1c60b9acSAndroid Build Coastguard Worker /* evlib_size_pt */ sizeof(struct lws_pt_eventlibs_uloop),
305*1c60b9acSAndroid Build Coastguard Worker /* evlib_size_vh */ 0,
306*1c60b9acSAndroid Build Coastguard Worker /* evlib_size_wsi */ sizeof(struct lws_wsi_eventlibs_uloop),
307*1c60b9acSAndroid Build Coastguard Worker };
308*1c60b9acSAndroid Build Coastguard Worker
309*1c60b9acSAndroid Build Coastguard Worker #if defined(LWS_WITH_EVLIB_PLUGINS)
310*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE
311*1c60b9acSAndroid Build Coastguard Worker #endif
312*1c60b9acSAndroid Build Coastguard Worker const lws_plugin_evlib_t evlib_uloop = {
313*1c60b9acSAndroid Build Coastguard Worker .hdr = {
314*1c60b9acSAndroid Build Coastguard Worker "uloop event loop",
315*1c60b9acSAndroid Build Coastguard Worker "lws_evlib_plugin",
316*1c60b9acSAndroid Build Coastguard Worker LWS_BUILD_HASH,
317*1c60b9acSAndroid Build Coastguard Worker LWS_PLUGIN_API_MAGIC
318*1c60b9acSAndroid Build Coastguard Worker },
319*1c60b9acSAndroid Build Coastguard Worker
320*1c60b9acSAndroid Build Coastguard Worker .ops = &event_loop_ops_uloop
321*1c60b9acSAndroid Build Coastguard Worker };
322