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