xref: /aosp_15_r20/external/libwebsockets/lib/event-libs/uloop/uloop.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
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