iocp-internal.h revision 1.1.1.3 1 1.1 christos /* $NetBSD: iocp-internal.h,v 1.1.1.3 2021/04/07 02:43:12 christos Exp $ */
2 1.1 christos /*
3 1.1 christos * Copyright (c) 2009-2012 Niels Provos and Nick Mathewson
4 1.1 christos *
5 1.1 christos * Redistribution and use in source and binary forms, with or without
6 1.1 christos * modification, are permitted provided that the following conditions
7 1.1 christos * are met:
8 1.1 christos * 1. Redistributions of source code must retain the above copyright
9 1.1 christos * notice, this list of conditions and the following disclaimer.
10 1.1 christos * 2. Redistributions in binary form must reproduce the above copyright
11 1.1 christos * notice, this list of conditions and the following disclaimer in the
12 1.1 christos * documentation and/or other materials provided with the distribution.
13 1.1 christos * 3. The name of the author may not be used to endorse or promote products
14 1.1 christos * derived from this software without specific prior written permission.
15 1.1 christos *
16 1.1 christos * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 1.1 christos * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 1.1 christos * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 1.1 christos * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 1.1 christos * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 1.1 christos * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 1.1 christos * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 1.1 christos * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 1.1 christos * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 1.1 christos * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 1.1 christos */
27 1.1 christos
28 1.1.1.2 christos #ifndef IOCP_INTERNAL_H_INCLUDED_
29 1.1.1.2 christos #define IOCP_INTERNAL_H_INCLUDED_
30 1.1 christos
31 1.1 christos #ifdef __cplusplus
32 1.1 christos extern "C" {
33 1.1 christos #endif
34 1.1 christos
35 1.1 christos struct event_overlapped;
36 1.1 christos struct event_iocp_port;
37 1.1 christos struct evbuffer;
38 1.1 christos typedef void (*iocp_callback)(struct event_overlapped *, ev_uintptr_t, ev_ssize_t, int success);
39 1.1 christos
40 1.1 christos /* This whole file is actually win32 only. We wrap the structures in a win32
41 1.1 christos * ifdef so that we can test-compile code that uses these interfaces on
42 1.1 christos * non-win32 platforms. */
43 1.1.1.2 christos #ifdef _WIN32
44 1.1 christos
45 1.1 christos /**
46 1.1 christos Internal use only. Wraps an OVERLAPPED that we're using for libevent
47 1.1 christos functionality. Whenever an event_iocp_port gets an event for a given
48 1.1 christos OVERLAPPED*, it upcasts the pointer to an event_overlapped, and calls the
49 1.1 christos iocp_callback function with the event_overlapped, the iocp key, and the
50 1.1 christos number of bytes transferred as arguments.
51 1.1 christos */
52 1.1 christos struct event_overlapped {
53 1.1 christos OVERLAPPED overlapped;
54 1.1 christos iocp_callback cb;
55 1.1 christos };
56 1.1 christos
57 1.1 christos /* Mingw's headers don't define LPFN_ACCEPTEX. */
58 1.1 christos
59 1.1 christos typedef BOOL (WINAPI *AcceptExPtr)(SOCKET, SOCKET, PVOID, DWORD, DWORD, DWORD, LPDWORD, LPOVERLAPPED);
60 1.1 christos typedef BOOL (WINAPI *ConnectExPtr)(SOCKET, const struct sockaddr *, int, PVOID, DWORD, LPDWORD, LPOVERLAPPED);
61 1.1 christos typedef void (WINAPI *GetAcceptExSockaddrsPtr)(PVOID, DWORD, DWORD, DWORD, LPSOCKADDR *, LPINT, LPSOCKADDR *, LPINT);
62 1.1 christos
63 1.1 christos /** Internal use only. Holds pointers to functions that only some versions of
64 1.1 christos Windows provide.
65 1.1 christos */
66 1.1 christos struct win32_extension_fns {
67 1.1 christos AcceptExPtr AcceptEx;
68 1.1 christos ConnectExPtr ConnectEx;
69 1.1 christos GetAcceptExSockaddrsPtr GetAcceptExSockaddrs;
70 1.1 christos };
71 1.1 christos
72 1.1 christos /**
73 1.1 christos Internal use only. Stores a Windows IO Completion port, along with
74 1.1 christos related data.
75 1.1 christos */
76 1.1 christos struct event_iocp_port {
77 1.1 christos /** The port itself */
78 1.1 christos HANDLE port;
79 1.1 christos /* A lock to cover internal structures. */
80 1.1 christos CRITICAL_SECTION lock;
81 1.1 christos /** Number of threads ever open on the port. */
82 1.1 christos short n_threads;
83 1.1 christos /** True iff we're shutting down all the threads on this port */
84 1.1 christos short shutdown;
85 1.1 christos /** How often the threads on this port check for shutdown and other
86 1.1 christos * conditions */
87 1.1 christos long ms;
88 1.1 christos /* The threads that are waiting for events. */
89 1.1 christos HANDLE *threads;
90 1.1 christos /** Number of threads currently open on this port. */
91 1.1 christos short n_live_threads;
92 1.1 christos /** A semaphore to signal when we are done shutting down. */
93 1.1 christos HANDLE *shutdownSemaphore;
94 1.1 christos };
95 1.1 christos
96 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
97 1.1.1.2 christos const struct win32_extension_fns *event_get_win32_extension_fns_(void);
98 1.1 christos #else
99 1.1 christos /* Dummy definition so we can test-compile more things on unix. */
100 1.1 christos struct event_overlapped {
101 1.1 christos iocp_callback cb;
102 1.1 christos };
103 1.1 christos #endif
104 1.1 christos
105 1.1 christos /** Initialize the fields in an event_overlapped.
106 1.1 christos
107 1.1 christos @param overlapped The struct event_overlapped to initialize
108 1.1 christos @param cb The callback that should be invoked once the IO operation has
109 1.1 christos finished.
110 1.1 christos */
111 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
112 1.1.1.2 christos void event_overlapped_init_(struct event_overlapped *, iocp_callback cb);
113 1.1 christos
114 1.1 christos /** Allocate and return a new evbuffer that supports overlapped IO on a given
115 1.1 christos socket. The socket must be associated with an IO completion port using
116 1.1.1.2 christos event_iocp_port_associate_.
117 1.1 christos */
118 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
119 1.1.1.2 christos struct evbuffer *evbuffer_overlapped_new_(evutil_socket_t fd);
120 1.1 christos
121 1.1 christos /** XXXX Document (nickm) */
122 1.1.1.2 christos evutil_socket_t evbuffer_overlapped_get_fd_(struct evbuffer *buf);
123 1.1 christos
124 1.1.1.2 christos void evbuffer_overlapped_set_fd_(struct evbuffer *buf, evutil_socket_t fd);
125 1.1 christos
126 1.1 christos /** Start reading data onto the end of an overlapped evbuffer.
127 1.1 christos
128 1.1 christos An evbuffer can only have one read pending at a time. While the read
129 1.1 christos is in progress, no other data may be added to the end of the buffer.
130 1.1.1.2 christos The buffer must be created with event_overlapped_init_().
131 1.1.1.2 christos evbuffer_commit_read_() must be called in the completion callback.
132 1.1 christos
133 1.1 christos @param buf The buffer to read onto
134 1.1 christos @param n The number of bytes to try to read.
135 1.1 christos @param ol Overlapped object with associated completion callback.
136 1.1 christos @return 0 on success, -1 on error.
137 1.1 christos */
138 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
139 1.1.1.2 christos int evbuffer_launch_read_(struct evbuffer *buf, size_t n, struct event_overlapped *ol);
140 1.1 christos
141 1.1 christos /** Start writing data from the start of an evbuffer.
142 1.1 christos
143 1.1 christos An evbuffer can only have one write pending at a time. While the write is
144 1.1 christos in progress, no other data may be removed from the front of the buffer.
145 1.1.1.2 christos The buffer must be created with event_overlapped_init_().
146 1.1.1.2 christos evbuffer_commit_write_() must be called in the completion callback.
147 1.1 christos
148 1.1 christos @param buf The buffer to read onto
149 1.1 christos @param n The number of bytes to try to read.
150 1.1 christos @param ol Overlapped object with associated completion callback.
151 1.1 christos @return 0 on success, -1 on error.
152 1.1 christos */
153 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
154 1.1.1.2 christos int evbuffer_launch_write_(struct evbuffer *buf, ev_ssize_t n, struct event_overlapped *ol);
155 1.1 christos
156 1.1 christos /** XXX document */
157 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
158 1.1.1.2 christos void evbuffer_commit_read_(struct evbuffer *, ev_ssize_t);
159 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
160 1.1.1.2 christos void evbuffer_commit_write_(struct evbuffer *, ev_ssize_t);
161 1.1 christos
162 1.1 christos /** Create an IOCP, and launch its worker threads. Internal use only.
163 1.1 christos
164 1.1 christos This interface is unstable, and will change.
165 1.1 christos */
166 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
167 1.1.1.2 christos struct event_iocp_port *event_iocp_port_launch_(int n_cpus);
168 1.1 christos
169 1.1 christos /** Associate a file descriptor with an iocp, such that overlapped IO on the
170 1.1 christos fd will happen on one of the iocp's worker threads.
171 1.1 christos */
172 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
173 1.1.1.2 christos int event_iocp_port_associate_(struct event_iocp_port *port, evutil_socket_t fd,
174 1.1 christos ev_uintptr_t key);
175 1.1 christos
176 1.1 christos /** Tell all threads serving an iocp to stop. Wait for up to waitMsec for all
177 1.1 christos the threads to finish whatever they're doing. If waitMsec is -1, wait
178 1.1 christos as long as required. If all the threads are done, free the port and return
179 1.1 christos 0. Otherwise, return -1. If you get a -1 return value, it is safe to call
180 1.1 christos this function again.
181 1.1 christos */
182 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
183 1.1.1.2 christos int event_iocp_shutdown_(struct event_iocp_port *port, long waitMsec);
184 1.1 christos
185 1.1 christos /* FIXME document. */
186 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
187 1.1.1.2 christos int event_iocp_activate_overlapped_(struct event_iocp_port *port,
188 1.1 christos struct event_overlapped *o,
189 1.1 christos ev_uintptr_t key, ev_uint32_t n_bytes);
190 1.1 christos
191 1.1 christos struct event_base;
192 1.1 christos /* FIXME document. */
193 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
194 1.1.1.2 christos struct event_iocp_port *event_base_get_iocp_(struct event_base *base);
195 1.1 christos
196 1.1 christos /* FIXME document. */
197 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
198 1.1.1.2 christos int event_base_start_iocp_(struct event_base *base, int n_cpus);
199 1.1.1.2 christos void event_base_stop_iocp_(struct event_base *base);
200 1.1 christos
201 1.1 christos /* FIXME document. */
202 1.1.1.3 christos EVENT2_EXPORT_SYMBOL
203 1.1.1.2 christos struct bufferevent *bufferevent_async_new_(struct event_base *base,
204 1.1 christos evutil_socket_t fd, int options);
205 1.1 christos
206 1.1 christos /* FIXME document. */
207 1.1.1.2 christos void bufferevent_async_set_connected_(struct bufferevent *bev);
208 1.1.1.2 christos int bufferevent_async_can_connect_(struct bufferevent *bev);
209 1.1.1.2 christos int bufferevent_async_connect_(struct bufferevent *bev, evutil_socket_t fd,
210 1.1 christos const struct sockaddr *sa, int socklen);
211 1.1 christos
212 1.1 christos #ifdef __cplusplus
213 1.1 christos }
214 1.1 christos #endif
215 1.1 christos
216 1.1 christos #endif
217