| 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 | /* optional: custom implementation for faking POLLIN for buffered. |
| 71 | * return nonzero if any wsi faked */ |
| 72 | int (*fake_POLLIN_override)(struct lws_context *context, int tsi); |
| 73 | |
| 74 | uint8_t flags; |
| 75 | |
| 76 | uint16_t evlib_size_ctx; |
| 77 | uint16_t evlib_size_pt; |
| 78 | uint16_t evlib_size_vh; |
| 79 | uint16_t evlib_size_wsi; |
| 80 | }; |
| 81 | |
| 82 | LWS_VISIBLE LWS_EXTERN void * |
| 83 | lws_evlib_wsi_to_evlib_pt(struct lws *wsi); |
| 84 | |
| 85 | LWS_VISIBLE LWS_EXTERN void * |
| 86 | lws_evlib_tsi_to_evlib_pt(struct lws_context *ctx, int tsi); |
| 87 | |
| 88 | /* |
| 89 | * You should consider these opaque for normal user code. |
| 90 | */ |
| 91 | |
| 92 | LWS_VISIBLE LWS_EXTERN void * |
| 93 | lws_realloc(void *ptr, size_t size, const char *reason); |
| 94 | |
| 95 | LWS_VISIBLE LWS_EXTERN void |
| 96 | lws_vhost_destroy1(struct lws_vhost *vh); |
| 97 | |
| 98 | LWS_VISIBLE LWS_EXTERN void |
| 99 | lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, |
| 100 | const char *caller); |
| 101 | |
| 102 | LWS_VISIBLE LWS_EXTERN int |
| 103 | lws_vhost_foreach_listen_wsi(struct lws_context *cx, void *arg, |
| 104 | lws_dll2_foreach_cb_t cb); |
| 105 | |
| 106 | struct lws_context_per_thread; |
| 107 | LWS_VISIBLE LWS_EXTERN void |
| 108 | lws_service_do_ripe_rxflow(struct lws_context_per_thread *pt); |
| 109 | |
| 110 | #if !defined(wsi_from_fd) && !defined(WIN32) && !defined(_WIN32) |
| 111 | struct lws_context; |
| 112 | LWS_VISIBLE LWS_EXTERN struct lws * |
| 113 | wsi_from_fd(const struct lws_context *context, int fd); |
| 114 | #endif |
| 115 | |
| 116 | LWS_VISIBLE LWS_EXTERN int |
| 117 | _lws_plat_service_forced_tsi(struct lws_context *context, int tsi); |
| 118 | |
| 119 | LWS_VISIBLE LWS_EXTERN void |
| 120 | lws_context_destroy2(struct lws_context *context); |
| 121 | |
| 122 | LWS_VISIBLE LWS_EXTERN void |
| 123 | lws_destroy_event_pipe(struct lws *wsi); |
| 124 | |
| 125 | LWS_VISIBLE LWS_EXTERN void |
| 126 | __lws_close_free_wsi_final(struct lws *wsi); |
| 127 | |
| 128 | #if LWS_MAX_SMP > 1 |
| 129 | |
| 130 | struct lws_mutex_refcount { |
| 131 | pthread_mutex_t lock; |
| 132 | pthread_t lock_owner; |
| 133 | const char *last_lock_reason; |
| 134 | char lock_depth; |
| 135 | char metadata; |
| 136 | }; |
| 137 | |
| 138 | LWS_VISIBLE LWS_EXTERN void |
| 139 | lws_mutex_refcount_assert_held(struct lws_mutex_refcount *mr); |
| 140 | |
| 141 | LWS_VISIBLE LWS_EXTERN void |
| 142 | lws_mutex_refcount_init(struct lws_mutex_refcount *mr); |
| 143 | |
| 144 | LWS_VISIBLE LWS_EXTERN void |
| 145 | lws_mutex_refcount_destroy(struct lws_mutex_refcount *mr); |
| 146 | |
| 147 | LWS_VISIBLE LWS_EXTERN void |
| 148 | lws_mutex_refcount_lock(struct lws_mutex_refcount *mr, const char *reason); |
| 149 | |
| 150 | LWS_VISIBLE LWS_EXTERN void |
| 151 | lws_mutex_refcount_unlock(struct lws_mutex_refcount *mr); |
| 152 | |
| 153 | #endif |
| 154 | |