Revert "Revert "Upgrade to 2.1.8-stable (2017-01-22)." and "Probably Mac build fix?""

This reverts commit 83a0c9c65a60a92d3ea5542596b3ba56db492c37.

Bug: 64543673
Test: make checkbuild
Test: Manual tombstoned test
Change-Id: I84bb128d1dec433195f2cbdbf70236ba17fa9955
diff --git a/evbuffer-internal.h b/evbuffer-internal.h
index f9dcc06..cf4bddc 100644
--- a/evbuffer-internal.h
+++ b/evbuffer-internal.h
@@ -24,15 +24,17 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
-#ifndef _EVBUFFER_INTERNAL_H_
-#define _EVBUFFER_INTERNAL_H_
+#ifndef EVBUFFER_INTERNAL_H_INCLUDED_
+#define EVBUFFER_INTERNAL_H_INCLUDED_
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include "event2/event-config.h"
+#include "evconfig-private.h"
 #include "event2/util.h"
+#include "event2/event_struct.h"
 #include "util-internal.h"
 #include "defer-internal.h"
 
@@ -41,7 +43,7 @@
  * arguments. */
 #define EVBUFFER_CB_NODEFER 2
 
-#ifdef WIN32
+#ifdef _WIN32
 #include <winsock2.h>
 #endif
 #include <sys/queue.h>
@@ -49,7 +51,7 @@
 /* Minimum allocation for a chain.  We define this so that we're burning no
  * more than 5% of each allocation on overhead.  It would be nice to lose even
  * less space, though. */
-#if _EVENT_SIZEOF_VOID_P < 8
+#if EVENT__SIZEOF_VOID_P < 8
 #define MIN_BUFFER_SIZE	512
 #else
 #define MIN_BUFFER_SIZE	1024
@@ -59,7 +61,7 @@
  * when bytes are added to or removed from the evbuffer. */
 struct evbuffer_cb_entry {
 	/** Structures to implement a doubly-linked queue of callbacks */
-	TAILQ_ENTRY(evbuffer_cb_entry) next;
+	LIST_ENTRY(evbuffer_cb_entry) next;
 	/** The callback function to invoke when this callback is called.
 	    If EVBUFFER_CB_OBSOLETE is set in flags, the cb_obsolete field is
 	    valid; otherwise, cb_func is valid. */
@@ -106,7 +108,7 @@
 	 * tried to invoke callbacks. */
 	size_t n_del_for_cb;
 
-#ifndef _EVENT_DISABLE_THREAD_SUPPORT
+#ifndef EVENT__DISABLE_THREAD_SUPPORT
 	/** A lock used to mediate access to this buffer. */
 	void *lock;
 #endif
@@ -125,7 +127,7 @@
 	 * overflows when we have mutually recursive callbacks, and for
 	 * serializing callbacks in a single thread. */
 	unsigned deferred_cbs : 1;
-#ifdef WIN32
+#ifdef _WIN32
 	/** True iff this buffer is set up for overlapped IO. */
 	unsigned is_overlapped : 1;
 #endif
@@ -133,7 +135,7 @@
 	ev_uint32_t flags;
 
 	/** Used to implement deferred callbacks. */
-	struct deferred_cb_queue *cb_queue;
+	struct event_base *cb_queue;
 
 	/** A reference count on this evbuffer.	 When the reference count
 	 * reaches 0, the buffer is destroyed.	Manipulated with
@@ -141,24 +143,24 @@
 	 * evbuffer_free. */
 	int refcnt;
 
-	/** A deferred_cb handle to make all of this buffer's callbacks
+	/** A struct event_callback handle to make all of this buffer's callbacks
 	 * invoked from the event loop. */
-	struct deferred_cb deferred;
+	struct event_callback deferred;
 
 	/** A doubly-linked-list of callback functions */
-	TAILQ_HEAD(evbuffer_cb_queue, evbuffer_cb_entry) callbacks;
+	LIST_HEAD(evbuffer_cb_queue, evbuffer_cb_entry) callbacks;
 
 	/** The parent bufferevent object this evbuffer belongs to.
 	 * NULL if the evbuffer stands alone. */
 	struct bufferevent *parent;
 };
 
-#if _EVENT_SIZEOF_OFF_T < _EVENT_SIZEOF_SIZE_T
+#if EVENT__SIZEOF_OFF_T < EVENT__SIZEOF_SIZE_T
 typedef ev_ssize_t ev_misalign_t;
 #define EVBUFFER_CHAIN_MAX ((size_t)EV_SSIZE_MAX)
 #else
 typedef ev_off_t ev_misalign_t;
-#if _EVENT_SIZEOF_OFF_T > _EVENT_SIZEOF_SIZE_T
+#if EVENT__SIZEOF_OFF_T > EVENT__SIZEOF_SIZE_T
 #define EVBUFFER_CHAIN_MAX EV_SIZE_MAX
 #else
 #define EVBUFFER_CHAIN_MAX ((size_t)EV_SSIZE_MAX)
@@ -184,8 +186,8 @@
 
 	/** Set if special handling is required for this chain */
 	unsigned flags;
-#define EVBUFFER_MMAP		0x0001	/**< memory in buffer is mmaped */
-#define EVBUFFER_SENDFILE	0x0002	/**< a chain used for sendfile */
+#define EVBUFFER_FILESEGMENT	0x0001  /**< A chain used for a file segment */
+#define EVBUFFER_SENDFILE	0x0002	/**< a chain used with sendfile */
 #define EVBUFFER_REFERENCE	0x0004	/**< a chain with a mem reference */
 #define EVBUFFER_IMMUTABLE	0x0008	/**< read-only chain */
 	/** a chain that mustn't be reallocated or freed, or have its contents
@@ -196,6 +198,11 @@
 	/** a chain that should be freed, but can't be freed until it is
 	 * un-pinned. */
 #define EVBUFFER_DANGLING	0x0040
+	/** a chain that is a referenced copy of another chain */
+#define EVBUFFER_MULTICAST	0x0080
+
+	/** number of references to this chain */
+	int refcnt;
 
 	/** Usually points to the read-write memory belonging to this
 	 * buffer allocated as part of the evbuffer_chain allocation.
@@ -206,21 +213,67 @@
 	unsigned char *buffer;
 };
 
-/* this is currently used by both mmap and sendfile */
-/* TODO(niels): something strange needs to happen for Windows here, I am not
- * sure what that is, but it needs to get looked into.
- */
-struct evbuffer_chain_fd {
-	int fd;	/**< the fd associated with this chain */
-};
-
-/** callback for a reference buffer; lets us know what to do with it when
- * we're done with it. */
+/** callback for a reference chain; lets us know what to do with it when
+ * we're done with it. Lives at the end of an evbuffer_chain with the
+ * EVBUFFER_REFERENCE flag set */
 struct evbuffer_chain_reference {
 	evbuffer_ref_cleanup_cb cleanupfn;
 	void *extra;
 };
 
+/** File segment for a file-segment chain.  Lives at the end of an
+ * evbuffer_chain with the EVBUFFER_FILESEGMENT flag set.  */
+struct evbuffer_chain_file_segment {
+	struct evbuffer_file_segment *segment;
+#ifdef _WIN32
+	/** If we're using CreateFileMapping, this is the handle to the view. */
+	HANDLE view_handle;
+#endif
+};
+
+/* Declared in event2/buffer.h; defined here. */
+struct evbuffer_file_segment {
+	void *lock; /**< lock prevent concurrent access to refcnt */
+	int refcnt; /**< Reference count for this file segment */
+	unsigned flags; /**< combination of EVBUF_FS_* flags  */
+
+	/** What kind of file segment is this? */
+	unsigned can_sendfile : 1;
+	unsigned is_mapping : 1;
+
+	/** The fd that we read the data from. */
+	int fd;
+	/** If we're using mmap, this is the raw mapped memory. */
+	void *mapping;
+#ifdef _WIN32
+	/** If we're using CreateFileMapping, this is the mapping */
+	HANDLE mapping_handle;
+#endif
+	/** If we're using mmap or IO, this is the content of the file
+	 * segment. */
+	char *contents;
+	/** Position of this segment within the file. */
+	ev_off_t file_offset;
+	/** If we're using mmap, this is the offset within 'mapping' where
+	 * this data segment begins. */
+	ev_off_t mmap_offset;
+	/** The length of this segment. */
+	ev_off_t length;
+	/** Cleanup callback function */
+	evbuffer_file_segment_cleanup_cb cleanup_cb;
+	/** Argument to be pass to cleanup callback function */
+	void *cleanup_cb_arg;
+};
+
+/** Information about the multicast parent of a chain.  Lives at the
+ * end of an evbuffer_chain with the EVBUFFER_MULTICAST flag set.  */
+struct evbuffer_multicast_parent {
+	/** source buffer the multicast parent belongs to */
+	struct evbuffer *source;
+	/** multicast parent for this chain */
+	struct evbuffer_chain *parent;
+};
+
 #define EVBUFFER_CHAIN_SIZE sizeof(struct evbuffer_chain)
 /** Return a pointer to extra data allocated along with an evbuffer. */
 #define EVBUFFER_CHAIN_EXTRA(t, c) (t *)((struct evbuffer_chain *)(c) + 1)
@@ -247,21 +300,21 @@
 	} while (0)
 
 /** Increase the reference count of buf by one. */
-void _evbuffer_incref(struct evbuffer *buf);
+void evbuffer_incref_(struct evbuffer *buf);
 /** Increase the reference count of buf by one and acquire the lock. */
-void _evbuffer_incref_and_lock(struct evbuffer *buf);
+void evbuffer_incref_and_lock_(struct evbuffer *buf);
 /** Pin a single buffer chain using a given flag. A pinned chunk may not be
  * moved or freed until it is unpinned. */
-void _evbuffer_chain_pin(struct evbuffer_chain *chain, unsigned flag);
+void evbuffer_chain_pin_(struct evbuffer_chain *chain, unsigned flag);
 /** Unpin a single buffer chain using a given flag. */
-void _evbuffer_chain_unpin(struct evbuffer_chain *chain, unsigned flag);
+void evbuffer_chain_unpin_(struct evbuffer_chain *chain, unsigned flag);
 /** As evbuffer_free, but requires that we hold a lock on the buffer, and
  * releases the lock before freeing it and the buffer. */
-void _evbuffer_decref_and_unlock(struct evbuffer *buffer);
+void evbuffer_decref_and_unlock_(struct evbuffer *buffer);
 
 /** As evbuffer_expand, but does not guarantee that the newly allocated memory
  * is contiguous.  Instead, it may be split across two or more chunks. */
-int _evbuffer_expand_fast(struct evbuffer *, size_t, int);
+int evbuffer_expand_fast_(struct evbuffer *, size_t, int);
 
 /** Helper: prepares for a readv/WSARecv call by expanding the buffer to
  * hold enough memory to read 'howmuch' bytes in possibly noncontiguous memory.
@@ -269,7 +322,7 @@
  * extent, and *chainp to point to the first chain that we'll try to read into.
  * Returns the number of vecs used.
  */
-int _evbuffer_read_setup_vecs(struct evbuffer *buf, ev_ssize_t howmuch,
+int evbuffer_read_setup_vecs_(struct evbuffer *buf, ev_ssize_t howmuch,
     struct evbuffer_iovec *vecs, int n_vecs, struct evbuffer_chain ***chainp,
     int exact);
 
@@ -282,12 +335,17 @@
  * See note in buffer_iocp's launch_write function */
 
 /** Set the parent bufferevent object for buf to bev */
-void evbuffer_set_parent(struct evbuffer *buf, struct bufferevent *bev);
+void evbuffer_set_parent_(struct evbuffer *buf, struct bufferevent *bev);
 
-void evbuffer_invoke_callbacks(struct evbuffer *buf);
+void evbuffer_invoke_callbacks_(struct evbuffer *buf);
+
+
+int evbuffer_get_callbacks_(struct evbuffer *buffer,
+    struct event_callback **cbs,
+    int max_cbs);
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* _EVBUFFER_INTERNAL_H_ */
+#endif /* EVBUFFER_INTERNAL_H_INCLUDED_ */