ipc/chromium/src/third_party/libevent/changelist-internal.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /*
michael@0 2 * Copyright (c) 2009-2012 Niels Provos and Nick Mathewson
michael@0 3 *
michael@0 4 * Redistribution and use in source and binary forms, with or without
michael@0 5 * modification, are permitted provided that the following conditions
michael@0 6 * are met:
michael@0 7 * 1. Redistributions of source code must retain the above copyright
michael@0 8 * notice, this list of conditions and the following disclaimer.
michael@0 9 * 2. Redistributions in binary form must reproduce the above copyright
michael@0 10 * notice, this list of conditions and the following disclaimer in the
michael@0 11 * documentation and/or other materials provided with the distribution.
michael@0 12 * 3. The name of the author may not be used to endorse or promote products
michael@0 13 * derived from this software without specific prior written permission.
michael@0 14 *
michael@0 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
michael@0 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
michael@0 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
michael@0 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
michael@0 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
michael@0 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
michael@0 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
michael@0 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
michael@0 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
michael@0 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
michael@0 25 */
michael@0 26 #ifndef _CHANGELIST_H_
michael@0 27 #define _CHANGELIST_H_
michael@0 28
michael@0 29 /*
michael@0 30 A "changelist" is a list of all the fd status changes that should be made
michael@0 31 between calls to the backend's dispatch function. There are a few reasons
michael@0 32 that a backend would want to queue changes like this rather than processing
michael@0 33 them immediately.
michael@0 34
michael@0 35 1) Sometimes applications will add and delete the same event more than
michael@0 36 once between calls to dispatch. Processing these changes immediately
michael@0 37 is needless, and potentially expensive (especially if we're on a system
michael@0 38 that makes one syscall per changed event).
michael@0 39
michael@0 40 2) Sometimes we can coalesce multiple changes on the same fd into a single
michael@0 41 syscall if we know about them in advance. For example, epoll can do an
michael@0 42 add and a delete at the same time, but only if we have found out about
michael@0 43 both of them before we tell epoll.
michael@0 44
michael@0 45 3) Sometimes adding an event that we immediately delete can cause
michael@0 46 unintended consequences: in kqueue, this makes pending events get
michael@0 47 reported spuriously.
michael@0 48 */
michael@0 49
michael@0 50 #include "event2/util.h"
michael@0 51
michael@0 52 /** Represents a */
michael@0 53 struct event_change {
michael@0 54 /** The fd or signal whose events are to be changed */
michael@0 55 evutil_socket_t fd;
michael@0 56 /* The events that were enabled on the fd before any of these changes
michael@0 57 were made. May include EV_READ or EV_WRITE. */
michael@0 58 short old_events;
michael@0 59
michael@0 60 /* The changes that we want to make in reading and writing on this fd.
michael@0 61 * If this is a signal, then read_change has EV_CHANGE_SIGNAL set,
michael@0 62 * and write_change is unused. */
michael@0 63 ev_uint8_t read_change;
michael@0 64 ev_uint8_t write_change;
michael@0 65 };
michael@0 66
michael@0 67 /* Flags for read_change and write_change. */
michael@0 68
michael@0 69 /* If set, add the event. */
michael@0 70 #define EV_CHANGE_ADD 0x01
michael@0 71 /* If set, delete the event. Exclusive with EV_CHANGE_ADD */
michael@0 72 #define EV_CHANGE_DEL 0x02
michael@0 73 /* If set, this event refers a signal, not an fd. */
michael@0 74 #define EV_CHANGE_SIGNAL EV_SIGNAL
michael@0 75 /* Set for persistent events. Currently not used. */
michael@0 76 #define EV_CHANGE_PERSIST EV_PERSIST
michael@0 77 /* Set for adding edge-triggered events. */
michael@0 78 #define EV_CHANGE_ET EV_ET
michael@0 79
michael@0 80 /* The value of fdinfo_size that a backend should use if it is letting
michael@0 81 * changelist handle its add and delete functions. */
michael@0 82 #define EVENT_CHANGELIST_FDINFO_SIZE sizeof(int)
michael@0 83
michael@0 84 /** Set up the data fields in a changelist. */
michael@0 85 void event_changelist_init(struct event_changelist *changelist);
michael@0 86 /** Remove every change in the changelist, and make corresponding changes
michael@0 87 * in the event maps in the base. This function is generally used right
michael@0 88 * after making all the changes in the changelist. */
michael@0 89 void event_changelist_remove_all(struct event_changelist *changelist,
michael@0 90 struct event_base *base);
michael@0 91 /** Free all memory held in a changelist. */
michael@0 92 void event_changelist_freemem(struct event_changelist *changelist);
michael@0 93
michael@0 94 /** Implementation of eventop_add that queues the event in a changelist. */
michael@0 95 int event_changelist_add(struct event_base *base, evutil_socket_t fd, short old, short events,
michael@0 96 void *p);
michael@0 97 /** Implementation of eventop_del that queues the event in a changelist. */
michael@0 98 int event_changelist_del(struct event_base *base, evutil_socket_t fd, short old, short events,
michael@0 99 void *p);
michael@0 100
michael@0 101 #endif

mercurial