Libevent Code Doxygen document
evbuffer-internal.h
1 /*
2  * Copyright (c) 2000-2007 Niels Provos <provos@citi.umich.edu>
3  * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. The name of the author may not be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 #ifndef EVBUFFER_INTERNAL_H_INCLUDED_
28 #define EVBUFFER_INTERNAL_H_INCLUDED_
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 #include "event2/event-config.h"
35 #include "evconfig-private.h"
36 #include "event2/util.h"
37 #include "event2/event_struct.h"
38 #include "util-internal.h"
39 #include "defer-internal.h"
40 
41 /* Experimental cb flag: "never deferred." Implementation note:
42  * these callbacks may get an inaccurate view of n_del/n_added in their
43  * arguments. */
44 #define EVBUFFER_CB_NODEFER 2
45 
46 #ifdef _WIN32
47 #include <winsock2.h>
48 #endif
49 #include <sys/queue.h>
50 
51 /* Minimum allocation for a chain. We define this so that we're burning no
52  * more than 5% of each allocation on overhead. It would be nice to lose even
53  * less space, though. */
54 #if EVENT__SIZEOF_VOID_P < 8
55 #define MIN_BUFFER_SIZE 512
56 #else
57 #define MIN_BUFFER_SIZE 1024
58 #endif
59 
68  union {
69  evbuffer_cb_func cb_func;
70  evbuffer_cb cb_obsolete;
71  } cb;
73  void *cbarg;
75  ev_uint32_t flags;
76 };
77 
78 struct bufferevent;
79 struct evbuffer_chain;
80 struct evbuffer {
85 
100 
102  size_t total_len;
103 
106  size_t n_add_for_cb;
109  size_t n_del_for_cb;
110 
111 #ifndef EVENT__DISABLE_THREAD_SUPPORT
113  void *lock;
114 #endif
117  unsigned own_lock : 1;
120  unsigned freeze_start : 1;
123  unsigned freeze_end : 1;
129  unsigned deferred_cbs : 1;
130 #ifdef _WIN32
132  unsigned is_overlapped : 1;
133 #endif
135  ev_uint32_t flags;
136 
139 
144  int refcnt;
145 
148  struct event_callback deferred;
149 
151  LIST_HEAD(evbuffer_cb_queue, evbuffer_cb_entry) callbacks;
152 
156 };
157 
158 #if EVENT__SIZEOF_OFF_T < EVENT__SIZEOF_SIZE_T
159 typedef ev_ssize_t ev_misalign_t;
160 #define EVBUFFER_CHAIN_MAX ((size_t)EV_SSIZE_MAX)
161 #else
162 typedef ev_off_t ev_misalign_t;
163 #if EVENT__SIZEOF_OFF_T > EVENT__SIZEOF_SIZE_T
164 #define EVBUFFER_CHAIN_MAX EV_SIZE_MAX
165 #else
166 #define EVBUFFER_CHAIN_MAX ((size_t)EV_SSIZE_MAX)
167 #endif
168 #endif
169 
174 
176  size_t buffer_len;
177 
180  ev_misalign_t misalign;
181 
185  size_t off;
186 
188  unsigned flags;
189 #define EVBUFFER_FILESEGMENT 0x0001
190 #define EVBUFFER_SENDFILE 0x0002
191 #define EVBUFFER_REFERENCE 0x0004
192 #define EVBUFFER_IMMUTABLE 0x0008
195 #define EVBUFFER_MEM_PINNED_R 0x0010
196 #define EVBUFFER_MEM_PINNED_W 0x0020
197 #define EVBUFFER_MEM_PINNED_ANY (EVBUFFER_MEM_PINNED_R|EVBUFFER_MEM_PINNED_W)
200 #define EVBUFFER_DANGLING 0x0040
202 #define EVBUFFER_MULTICAST 0x0080
203 
205  int refcnt;
206 
213  unsigned char *buffer;
214 };
215 
220  evbuffer_ref_cleanup_cb cleanupfn;
221  void *extra;
222 };
223 
227  struct evbuffer_file_segment *segment;
228 #ifdef _WIN32
230  HANDLE view_handle;
231 #endif
232 };
233 
234 /* Declared in event2/buffer.h; defined here. */
236  void *lock;
237  int refcnt;
238  unsigned flags;
241  unsigned can_sendfile : 1;
242  unsigned is_mapping : 1;
243 
245  int fd;
247  void *mapping;
248 #ifdef _WIN32
250  HANDLE mapping_handle;
251 #endif
254  char *contents;
256  ev_off_t file_offset;
259  ev_off_t mmap_offset;
261  ev_off_t length;
266 };
267 
272  struct evbuffer *source;
275 };
276 
277 #define EVBUFFER_CHAIN_SIZE sizeof(struct evbuffer_chain)
279 #define EVBUFFER_CHAIN_EXTRA(t, c) (t *)((struct evbuffer_chain *)(c) + 1)
280 
282 #define ASSERT_EVBUFFER_LOCKED(buffer) \
283  EVLOCK_ASSERT_LOCKED((buffer)->lock)
284 
285 #define EVBUFFER_LOCK(buffer) \
286  do { \
287  EVLOCK_LOCK((buffer)->lock, 0); \
288  } while (0)
289 #define EVBUFFER_UNLOCK(buffer) \
290  do { \
291  EVLOCK_UNLOCK((buffer)->lock, 0); \
292  } while (0)
293 #define EVBUFFER_LOCK2(buffer1, buffer2) \
294  do { \
295  EVLOCK_LOCK2((buffer1)->lock, (buffer2)->lock, 0, 0); \
296  } while (0)
297 #define EVBUFFER_UNLOCK2(buffer1, buffer2) \
298  do { \
299  EVLOCK_UNLOCK2((buffer1)->lock, (buffer2)->lock, 0, 0); \
300  } while (0)
301 
303 void evbuffer_incref_(struct evbuffer *buf);
305 void evbuffer_incref_and_lock_(struct evbuffer *buf);
308 void evbuffer_chain_pin_(struct evbuffer_chain *chain, unsigned flag);
310 void evbuffer_chain_unpin_(struct evbuffer_chain *chain, unsigned flag);
313 void evbuffer_decref_and_unlock_(struct evbuffer *buffer);
314 
317 int evbuffer_expand_fast_(struct evbuffer *, size_t, int);
318 
325 int evbuffer_read_setup_vecs_(struct evbuffer *buf, ev_ssize_t howmuch,
326  struct evbuffer_iovec *vecs, int n_vecs, struct evbuffer_chain ***chainp,
327  int exact);
328 
329 /* Helper macro: copies an evbuffer_iovec in ei to a win32 WSABUF in i. */
330 #define WSABUF_FROM_EVBUFFER_IOV(i,ei) do { \
331  (i)->buf = (ei)->iov_base; \
332  (i)->len = (unsigned long)(ei)->iov_len; \
333  } while (0)
334 /* XXXX the cast above is safe for now, but not if we allow mmaps on win64.
335  * See note in buffer_iocp's launch_write function */
336 
338 void evbuffer_set_parent_(struct evbuffer *buf, struct bufferevent *bev);
339 
340 void evbuffer_invoke_callbacks_(struct evbuffer *buf);
341 
342 
343 int evbuffer_get_callbacks_(struct evbuffer *buffer,
344  struct event_callback **cbs,
345  int max_cbs);
346 
347 #ifdef __cplusplus
348 }
349 #endif
350 
351 #endif /* EVBUFFER_INTERNAL_H_INCLUDED_ */
void(* evbuffer_ref_cleanup_cb)(const void *data, size_t datalen, void *extra)
Definition: buffer.h:475
void(* evbuffer_cb_func)(struct evbuffer *buffer, const struct evbuffer_cb_info *info, void *arg)
Definition: buffer.h:888
void(* evbuffer_file_segment_cleanup_cb)(struct evbuffer_file_segment const *seg, int flags, void *arg)
Definition: buffer.h:569
void(* evbuffer_cb)(struct evbuffer *buffer, size_t old_len, size_t new_len, void *arg)
Definition: buffer_compat.h:73
Definition: bufferevent_struct.h:70
Definition: evbuffer-internal.h:62
union evbuffer_cb_entry::@1 cb
LIST_ENTRY(evbuffer_cb_entry) next
ev_uint32_t flags
Definition: evbuffer-internal.h:75
void * cbarg
Definition: evbuffer-internal.h:73
Definition: evbuffer-internal.h:226
Definition: evbuffer-internal.h:219
Definition: evbuffer-internal.h:171
struct evbuffer_chain * next
Definition: evbuffer-internal.h:173
ev_misalign_t misalign
Definition: evbuffer-internal.h:180
size_t buffer_len
Definition: evbuffer-internal.h:176
unsigned flags
Definition: evbuffer-internal.h:188
unsigned char * buffer
Definition: evbuffer-internal.h:213
size_t off
Definition: evbuffer-internal.h:185
int refcnt
Definition: evbuffer-internal.h:205
Definition: evbuffer-internal.h:235
unsigned can_sendfile
Definition: evbuffer-internal.h:241
int refcnt
Definition: evbuffer-internal.h:237
evbuffer_file_segment_cleanup_cb cleanup_cb
Definition: evbuffer-internal.h:263
void * lock
Definition: evbuffer-internal.h:236
ev_off_t mmap_offset
Definition: evbuffer-internal.h:259
ev_off_t length
Definition: evbuffer-internal.h:261
unsigned flags
Definition: evbuffer-internal.h:238
void * mapping
Definition: evbuffer-internal.h:247
int fd
Definition: evbuffer-internal.h:245
ev_off_t file_offset
Definition: evbuffer-internal.h:256
void * cleanup_cb_arg
Definition: evbuffer-internal.h:265
char * contents
Definition: evbuffer-internal.h:254
Definition: buffer.h:133
Definition: evbuffer-internal.h:270
struct evbuffer * source
Definition: evbuffer-internal.h:272
struct evbuffer_chain * parent
Definition: evbuffer-internal.h:274
Definition: evbuffer-internal.h:80
unsigned freeze_start
Definition: evbuffer-internal.h:120
unsigned own_lock
Definition: evbuffer-internal.h:117
struct event_callback deferred
Definition: evbuffer-internal.h:148
void * lock
Definition: evbuffer-internal.h:113
ev_uint32_t flags
Definition: evbuffer-internal.h:135
struct evbuffer_chain * first
Definition: evbuffer-internal.h:82
size_t n_del_for_cb
Definition: evbuffer-internal.h:109
unsigned deferred_cbs
Definition: evbuffer-internal.h:129
unsigned freeze_end
Definition: evbuffer-internal.h:123
LIST_HEAD(evbuffer_cb_queue, evbuffer_cb_entry) callbacks
struct event_base * cb_queue
Definition: evbuffer-internal.h:138
int refcnt
Definition: evbuffer-internal.h:144
struct evbuffer_chain ** last_with_datap
Definition: evbuffer-internal.h:99
struct evbuffer_chain * last
Definition: evbuffer-internal.h:84
size_t n_add_for_cb
Definition: evbuffer-internal.h:106
struct bufferevent * parent
Definition: evbuffer-internal.h:155
size_t total_len
Definition: evbuffer-internal.h:102
Definition: event-internal.h:208
Definition: event_struct.h:107