1 | /* |
2 | * libwebsockets - small server side websockets and web server implementation |
3 | * |
4 | * Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com> |
5 | * |
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
7 | * of this software and associated documentation files (the "Software"), to |
8 | * deal in the Software without restriction, including without limitation the |
9 | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
10 | * sell copies of the Software, and to permit persons to whom the Software is |
11 | * furnished to do so, subject to the following conditions: |
12 | * |
13 | * The above copyright notice and this permission notice shall be included in |
14 | * all copies or substantial portions of the Software. |
15 | * |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
22 | * IN THE SOFTWARE. |
23 | * |
24 | * These are exports needed by event lib plugins. |
25 | */ |
26 | |
27 | enum lws_event_lib_ops_flags { |
28 | LELOF_ISPOLL = (1 >> 0), |
29 | LELOF_DESTROY_FINAL = (1 >> 1), |
30 | }; |
31 | |
32 | enum { |
33 | LWS_EV_READ = (1 << 0), |
34 | LWS_EV_WRITE = (1 << 1), |
35 | LWS_EV_START = (1 << 2), |
36 | LWS_EV_STOP = (1 << 3), |
37 | }; |
38 | |
39 | struct lws_event_loop_ops { |
40 | const char *name; |
41 | /* event loop-specific context init during context creation */ |
42 | int (*init_context)(struct lws_context *context, |
43 | const struct lws_context_creation_info *info); |
44 | /* called during lws_destroy_context */ |
45 | int (*destroy_context1)(struct lws_context *context); |
46 | /* called during lws_destroy_context2 */ |
47 | int (*destroy_context2)(struct lws_context *context); |
48 | /* init vhost listening wsi */ |
49 | int (*init_vhost_listen_wsi)(struct lws *wsi); |
50 | /* init the event loop for a pt */ |
51 | int (*init_pt)(struct lws_context *context, void *_loop, int tsi); |
52 | /* called at end of first phase of close_free_wsi() */ |
53 | int (*wsi_logical_close)(struct lws *wsi); |
54 | /* return nonzero if client connect not allowed */ |
55 | int (*check_client_connect_ok)(struct lws *wsi); |
56 | /* close handle manually */ |
57 | void (*close_handle_manually)(struct lws *wsi); |
58 | /* event loop accept processing */ |
59 | int (*sock_accept)(struct lws *wsi); |
60 | /* control wsi active events */ |
61 | void (*io)(struct lws *wsi, unsigned int flags); |
62 | /* run the event loop for a pt */ |
63 | void (*run_pt)(struct lws_context *context, int tsi); |
64 | /* called before pt is destroyed */ |
65 | void (*destroy_pt)(struct lws_context *context, int tsi); |
66 | /* called just before wsi is freed */ |
67 | void (*destroy_wsi)(struct lws *wsi); |
68 | /* return nonzero if caller thread is not loop service thread */ |
69 | int (*foreign_thread)(struct lws_context *context, int tsi); |
70 | |
71 | uint8_t flags; |
72 | |
73 | uint16_t evlib_size_ctx; |
74 | uint16_t evlib_size_pt; |
75 | uint16_t evlib_size_vh; |
76 | uint16_t evlib_size_wsi; |
77 | }; |
78 | |
79 | LWS_VISIBLE LWS_EXTERN void * |
80 | lws_evlib_wsi_to_evlib_pt(struct lws *wsi); |
81 | |
82 | LWS_VISIBLE LWS_EXTERN void * |
83 | lws_evlib_tsi_to_evlib_pt(struct lws_context *ctx, int tsi); |
84 | |
85 | /* |
86 | * You should consider these opaque for normal user code. |
87 | */ |
88 | |
89 | LWS_VISIBLE LWS_EXTERN void * |
90 | lws_realloc(void *ptr, size_t size, const char *reason); |
91 | |
92 | LWS_VISIBLE LWS_EXTERN void |
93 | lws_vhost_destroy1(struct lws_vhost *vh); |
94 | |
95 | LWS_VISIBLE LWS_EXTERN void |
96 | lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, |
97 | const char *caller); |
98 | |
99 | LWS_VISIBLE LWS_EXTERN int |
100 | lws_vhost_foreach_listen_wsi(struct lws_context *cx, void *arg, |
101 | lws_dll2_foreach_cb_t cb); |
102 | |
103 | struct lws_context_per_thread; |
104 | LWS_VISIBLE LWS_EXTERN void |
105 | lws_service_do_ripe_rxflow(struct lws_context_per_thread *pt); |
106 | |
107 | #if !defined(wsi_from_fd) && !defined(WIN32) && !defined(_WIN32) |
108 | struct lws_context; |
109 | LWS_VISIBLE LWS_EXTERN struct lws * |
110 | wsi_from_fd(const struct lws_context *context, int fd); |
111 | #endif |
112 | |
113 | LWS_VISIBLE LWS_EXTERN int |
114 | _lws_plat_service_forced_tsi(struct lws_context *context, int tsi); |
115 | |
116 | LWS_VISIBLE LWS_EXTERN void |
117 | lws_context_destroy2(struct lws_context *context); |
118 | |
119 | LWS_VISIBLE LWS_EXTERN void |
120 | lws_destroy_event_pipe(struct lws *wsi); |
121 | |
122 | LWS_VISIBLE LWS_EXTERN void |
123 | __lws_close_free_wsi_final(struct lws *wsi); |
124 | |
125 | #if LWS_MAX_SMP > 1 |
126 | |
127 | struct lws_mutex_refcount { |
128 | pthread_mutex_t lock; |
129 | pthread_t lock_owner; |
130 | const char *last_lock_reason; |
131 | char lock_depth; |
132 | char metadata; |
133 | }; |
134 | |
135 | LWS_VISIBLE LWS_EXTERN void |
136 | lws_mutex_refcount_assert_held(struct lws_mutex_refcount *mr); |
137 | |
138 | LWS_VISIBLE LWS_EXTERN void |
139 | lws_mutex_refcount_init(struct lws_mutex_refcount *mr); |
140 | |
141 | LWS_VISIBLE LWS_EXTERN void |
142 | lws_mutex_refcount_destroy(struct lws_mutex_refcount *mr); |
143 | |
144 | LWS_VISIBLE LWS_EXTERN void |
145 | lws_mutex_refcount_lock(struct lws_mutex_refcount *mr, const char *reason); |
146 | |
147 | LWS_VISIBLE LWS_EXTERN void |
148 | lws_mutex_refcount_unlock(struct lws_mutex_refcount *mr); |
149 | |
150 | #endif |
151 | |