Lines Matching +full:close +full:- +full:nonexistent +full:- +full:disable +full:- +full:issues
2 * Copyright (c) 2002-2007 Niels Provos <provos@citi.umich.edu>
3 * Copyright (c) 2007-2012 Niels Provos and Nick Mathewson
28 #include "event2/event-config.h"
29 #include "evconfig-private.h"
39 * stdio.h. This comes from evconfig-private.h.
92 #include "log-internal.h"
93 #include "mm-internal.h"
94 #include "util-internal.h"
95 #include "evthread-internal.h"
96 #include "evbuffer-internal.h"
97 #include "bufferevent-internal.h"
98 #include "event-internal.h"
102 #define MAP_FAILED ((void *)-1)
120 /* Mask of user-selectable callback flags. */
122 /* Mask of all internal-use-only flags. */
129 #define CHAIN_SPACE_PTR(ch) ((ch)->buffer + (ch)->misalign + (ch)->off)
130 #define CHAIN_SPACE_LEN(ch) ((ch)->flags & EVBUFFER_IMMUTABLE ? \
131 0 : (ch)->buffer_len - ((ch)->misalign + (ch)->off))
133 #define CHAIN_PINNED(ch) (((ch)->flags & EVBUFFER_MEM_PINNED_ANY) != 0)
134 #define CHAIN_PINNED_R(ch) (((ch)->flags & EVBUFFER_MEM_PINNED_R) != 0)
138 (ptr)->pos = -1; \
139 (ptr)->internal_.chain = NULL; \
140 (ptr)->internal_.pos_in_chain = 0; \
162 if (size > EVBUFFER_CHAIN_MAX - EVBUFFER_CHAIN_SIZE) in evbuffer_chain_new()
183 chain->buffer_len = to_alloc - EVBUFFER_CHAIN_SIZE; in evbuffer_chain_new()
188 chain->buffer = EVBUFFER_CHAIN_EXTRA(unsigned char, chain); in evbuffer_chain_new()
190 chain->refcnt = 1; in evbuffer_chain_new()
198 EVUTIL_ASSERT(chain->refcnt > 0); in evbuffer_chain_free()
199 if (--chain->refcnt > 0) { in evbuffer_chain_free()
206 chain->refcnt++; in evbuffer_chain_free()
207 chain->flags |= EVBUFFER_DANGLING; in evbuffer_chain_free()
213 if (chain->flags & EVBUFFER_REFERENCE) { in evbuffer_chain_free()
218 if (info->cleanupfn) in evbuffer_chain_free()
219 (*info->cleanupfn)(chain->buffer, in evbuffer_chain_free()
220 chain->buffer_len, in evbuffer_chain_free()
221 info->extra); in evbuffer_chain_free()
223 if (chain->flags & EVBUFFER_FILESEGMENT) { in evbuffer_chain_free()
228 if (info->segment) { in evbuffer_chain_free()
230 if (info->segment->is_mapping) in evbuffer_chain_free()
231 UnmapViewOfFile(chain->buffer); in evbuffer_chain_free()
233 evbuffer_file_segment_free(info->segment); in evbuffer_chain_free()
236 if (chain->flags & EVBUFFER_MULTICAST) { in evbuffer_chain_free()
245 EVUTIL_ASSERT(info->source != NULL); in evbuffer_chain_free()
246 EVUTIL_ASSERT(info->parent != NULL); in evbuffer_chain_free()
247 EVBUFFER_LOCK(info->source); in evbuffer_chain_free()
248 evbuffer_chain_free(info->parent); in evbuffer_chain_free()
249 evbuffer_decref_and_unlock_(info->source); in evbuffer_chain_free()
260 next = chain->next; in evbuffer_free_all_chains()
269 for (; chain; chain = chain->next) { in evbuffer_chains_all_empty()
270 if (chain->off) in evbuffer_chains_all_empty()
287 * Internal; requires lock. The caller must fix up buf->last and buf->first
293 struct evbuffer_chain **ch = buf->last_with_datap; in evbuffer_free_trailing_empty_chains()
295 while ((*ch) && ((*ch)->off != 0 || CHAIN_PINNED(*ch))) in evbuffer_free_trailing_empty_chains()
296 ch = &(*ch)->next; in evbuffer_free_trailing_empty_chains()
313 if (*buf->last_with_datap == NULL) { in evbuffer_chain_insert()
315 EVUTIL_ASSERT(buf->last_with_datap == &buf->first); in evbuffer_chain_insert()
316 EVUTIL_ASSERT(buf->first == NULL); in evbuffer_chain_insert()
317 buf->first = buf->last = chain; in evbuffer_chain_insert()
322 if (chain->off) in evbuffer_chain_insert()
323 buf->last_with_datap = chp; in evbuffer_chain_insert()
324 buf->last = chain; in evbuffer_chain_insert()
326 buf->total_len += chain->off; in evbuffer_chain_insert()
342 EVUTIL_ASSERT((chain->flags & flag) == 0); in evbuffer_chain_pin_()
343 chain->flags |= flag; in evbuffer_chain_pin_()
349 EVUTIL_ASSERT((chain->flags & flag) != 0); in evbuffer_chain_unpin_()
350 chain->flags &= ~flag; in evbuffer_chain_unpin_()
351 if (chain->flags & EVBUFFER_DANGLING) in evbuffer_chain_unpin_()
358 ++chain->refcnt; in evbuffer_chain_incref()
370 LIST_INIT(&buffer->callbacks); in evbuffer_new()
371 buffer->refcnt = 1; in evbuffer_new()
372 buffer->last_with_datap = &buffer->first; in evbuffer_new()
381 buf->flags |= (ev_uint32_t)flags; in evbuffer_set_flags()
390 buf->flags &= ~(ev_uint32_t)flags; in evbuffer_clear_flags()
399 ++buf->refcnt; in evbuffer_incref_()
407 ++buf->refcnt; in evbuffer_incref_and_lock_()
414 buffer->cb_queue = base; in evbuffer_defer_callbacks()
415 buffer->deferred_cbs = 1; in evbuffer_defer_callbacks()
416 event_deferred_cb_init_(&buffer->deferred, in evbuffer_defer_callbacks()
427 return -1; in evbuffer_enable_locking()
429 if (buf->lock) in evbuffer_enable_locking()
430 return -1; in evbuffer_enable_locking()
435 return -1; in evbuffer_enable_locking()
436 buf->lock = lock; in evbuffer_enable_locking()
437 buf->own_lock = 1; in evbuffer_enable_locking()
439 buf->lock = lock; in evbuffer_enable_locking()
440 buf->own_lock = 0; in evbuffer_enable_locking()
451 buf->parent = bev; in evbuffer_set_parent_()
467 } else if (buffer->deferred_cbs) { in evbuffer_run_callbacks()
470 /* Don't zero-out n_add/n_del, since the deferred callbacks in evbuffer_run_callbacks()
480 if (LIST_EMPTY(&buffer->callbacks)) { in evbuffer_run_callbacks()
481 buffer->n_add_for_cb = buffer->n_del_for_cb = 0; in evbuffer_run_callbacks()
484 if (buffer->n_add_for_cb == 0 && buffer->n_del_for_cb == 0) in evbuffer_run_callbacks()
487 new_size = buffer->total_len; in evbuffer_run_callbacks()
488 info.orig_size = new_size + buffer->n_del_for_cb - buffer->n_add_for_cb; in evbuffer_run_callbacks()
489 info.n_added = buffer->n_add_for_cb; in evbuffer_run_callbacks()
490 info.n_deleted = buffer->n_del_for_cb; in evbuffer_run_callbacks()
492 buffer->n_add_for_cb = 0; in evbuffer_run_callbacks()
493 buffer->n_del_for_cb = 0; in evbuffer_run_callbacks()
495 for (cbent = LIST_FIRST(&buffer->callbacks); in evbuffer_run_callbacks()
496 cbent != LIST_END(&buffer->callbacks); in evbuffer_run_callbacks()
502 if ((cbent->flags & mask) != masked_val) in evbuffer_run_callbacks()
505 if ((cbent->flags & EVBUFFER_CB_OBSOLETE)) in evbuffer_run_callbacks()
506 cbent->cb.cb_obsolete(buffer, in evbuffer_run_callbacks()
507 info.orig_size, new_size, cbent->cbarg); in evbuffer_run_callbacks()
509 cbent->cb.cb_func(buffer, &info, cbent->cbarg); in evbuffer_run_callbacks()
516 if (LIST_EMPTY(&buffer->callbacks)) { in evbuffer_invoke_callbacks_()
517 buffer->n_add_for_cb = buffer->n_del_for_cb = 0; in evbuffer_invoke_callbacks_()
521 if (buffer->deferred_cbs) { in evbuffer_invoke_callbacks_()
522 if (event_deferred_cb_schedule_(buffer->cb_queue, &buffer->deferred)) { in evbuffer_invoke_callbacks_()
524 if (buffer->parent) in evbuffer_invoke_callbacks_()
525 bufferevent_incref_(buffer->parent); in evbuffer_invoke_callbacks_()
542 parent = buffer->parent; in evbuffer_deferred_callback()
554 while ((cbent = LIST_FIRST(&buffer->callbacks))) { in evbuffer_remove_all_callbacks()
566 EVUTIL_ASSERT(buffer->refcnt > 0); in evbuffer_decref_and_unlock_()
568 if (--buffer->refcnt > 0) { in evbuffer_decref_and_unlock_()
573 for (chain = buffer->first; chain != NULL; chain = next) { in evbuffer_decref_and_unlock_()
574 next = chain->next; in evbuffer_decref_and_unlock_()
578 if (buffer->deferred_cbs) in evbuffer_decref_and_unlock_()
579 event_deferred_cb_cancel_(buffer->cb_queue, &buffer->deferred); in evbuffer_decref_and_unlock_()
582 if (buffer->own_lock) in evbuffer_decref_and_unlock_()
583 EVTHREAD_FREE_LOCK(buffer->lock, EVTHREAD_LOCKTYPE_RECURSIVE); in evbuffer_decref_and_unlock_()
613 result = (buffer->total_len); in evbuffer_get_length()
627 chain = buf->first; in evbuffer_get_contiguous_space()
628 result = (chain != NULL ? chain->off : 0); in evbuffer_get_contiguous_space()
675 int n = -1; in evbuffer_reserve_space()
678 if (buf->freeze_end) in evbuffer_reserve_space()
707 struct evbuffer_chain **chainp = buf->last_with_datap; in advance_last_with_data()
714 while ((*chainp)->next) { in advance_last_with_data()
715 chainp = &(*chainp)->next; in advance_last_with_data()
716 if ((*chainp)->off) in advance_last_with_data()
717 buf->last_with_datap = chainp; in advance_last_with_data()
728 int result = -1; in evbuffer_commit_space()
734 if (buf->freeze_end) in evbuffer_commit_space()
740 (buf->last && vec[0].iov_base == (void *)CHAIN_SPACE_PTR(buf->last))) { in evbuffer_commit_space()
743 if ((size_t)vec[0].iov_len > (size_t)CHAIN_SPACE_LEN(buf->last)) in evbuffer_commit_space()
745 buf->last->off += vec[0].iov_len; in evbuffer_commit_space()
753 firstchainp = buf->last_with_datap; in evbuffer_commit_space()
757 firstchainp = &(*firstchainp)->next; in evbuffer_commit_space()
769 chain = chain->next; in evbuffer_commit_space()
774 (*chainp)->off += vec[i].iov_len; in evbuffer_commit_space()
777 buf->last_with_datap = chainp; in evbuffer_commit_space()
779 chainp = &(*chainp)->next; in evbuffer_commit_space()
783 buf->total_len += added; in evbuffer_commit_space()
784 buf->n_add_for_cb += added; in evbuffer_commit_space()
796 return (buf->last && CHAIN_PINNED_R(buf->last)); in HAS_PINNED_R()
803 dst->first = NULL; in ZERO_CHAIN()
804 dst->last = NULL; in ZERO_CHAIN()
805 dst->last_with_datap = &(dst)->first; in ZERO_CHAIN()
806 dst->total_len = 0; in ZERO_CHAIN()
810 * read-pinned chains. The first pinned chain is saved in first, and the
811 * last in last. If src has no read-pinned chains, first and last are set
826 pinned = src->last_with_datap; in PRESERVE_PINNED()
828 pinned = &(*pinned)->next; in PRESERVE_PINNED()
831 *last = src->last; in PRESERVE_PINNED()
835 if (chain->off) { in PRESERVE_PINNED()
838 EVUTIL_ASSERT(pinned == src->last_with_datap); in PRESERVE_PINNED()
839 tmp = evbuffer_chain_new(chain->off); in PRESERVE_PINNED()
841 return -1; in PRESERVE_PINNED()
842 memcpy(tmp->buffer, chain->buffer + chain->misalign, in PRESERVE_PINNED()
843 chain->off); in PRESERVE_PINNED()
844 tmp->off = chain->off; in PRESERVE_PINNED()
845 *src->last_with_datap = tmp; in PRESERVE_PINNED()
846 src->last = tmp; in PRESERVE_PINNED()
847 chain->misalign += chain->off; in PRESERVE_PINNED()
848 chain->off = 0; in PRESERVE_PINNED()
850 src->last = *src->last_with_datap; in PRESERVE_PINNED()
868 src->first = pinned; in RESTORE_PINNED()
869 src->last = last; in RESTORE_PINNED()
870 src->last_with_datap = &src->first; in RESTORE_PINNED()
871 src->total_len = 0; in RESTORE_PINNED()
879 dst->first = src->first; in COPY_CHAIN()
880 if (src->last_with_datap == &src->first) in COPY_CHAIN()
881 dst->last_with_datap = &dst->first; in COPY_CHAIN()
883 dst->last_with_datap = src->last_with_datap; in COPY_CHAIN()
884 dst->last = src->last; in COPY_CHAIN()
885 dst->total_len = src->total_len; in COPY_CHAIN()
897 *chp = src->first; in APPEND_CHAIN()
899 if (src->last_with_datap == &src->first) in APPEND_CHAIN()
900 dst->last_with_datap = chp; in APPEND_CHAIN()
902 dst->last_with_datap = src->last_with_datap; in APPEND_CHAIN()
903 dst->last = src->last; in APPEND_CHAIN()
904 dst->total_len += src->total_len; in APPEND_CHAIN()
911 struct evbuffer_chain *chain = src->first; in APPEND_CHAIN_MULTICAST()
917 for (; chain; chain = chain->next) { in APPEND_CHAIN_MULTICAST()
918 if (!chain->off || chain->flags & EVBUFFER_DANGLING) { in APPEND_CHAIN_MULTICAST()
933 extra->source = src; in APPEND_CHAIN_MULTICAST()
936 extra->parent = chain; in APPEND_CHAIN_MULTICAST()
937 chain->flags |= EVBUFFER_IMMUTABLE; in APPEND_CHAIN_MULTICAST()
938 tmp->buffer_len = chain->buffer_len; in APPEND_CHAIN_MULTICAST()
939 tmp->misalign = chain->misalign; in APPEND_CHAIN_MULTICAST()
940 tmp->off = chain->off; in APPEND_CHAIN_MULTICAST()
941 tmp->flags |= EVBUFFER_MULTICAST|EVBUFFER_IMMUTABLE; in APPEND_CHAIN_MULTICAST()
942 tmp->buffer = chain->buffer; in APPEND_CHAIN_MULTICAST()
952 src->last->next = dst->first; in PREPEND_CHAIN()
953 dst->first = src->first; in PREPEND_CHAIN()
954 dst->total_len += src->total_len; in PREPEND_CHAIN()
955 if (*dst->last_with_datap == NULL) { in PREPEND_CHAIN()
956 if (src->last_with_datap == &(src)->first) in PREPEND_CHAIN()
957 dst->last_with_datap = &dst->first; in PREPEND_CHAIN()
959 dst->last_with_datap = src->last_with_datap; in PREPEND_CHAIN()
960 } else if (dst->last_with_datap == &dst->first) { in PREPEND_CHAIN()
961 dst->last_with_datap = &src->last->next; in PREPEND_CHAIN()
973 in_total_len = inbuf->total_len; in evbuffer_add_buffer()
974 out_total_len = outbuf->total_len; in evbuffer_add_buffer()
979 if (outbuf->freeze_end || inbuf->freeze_start) { in evbuffer_add_buffer()
980 result = -1; in evbuffer_add_buffer()
985 result = -1; in evbuffer_add_buffer()
992 evbuffer_free_all_chains(outbuf->first); in evbuffer_add_buffer()
1000 inbuf->n_del_for_cb += in_total_len; in evbuffer_add_buffer()
1001 outbuf->n_add_for_cb += in_total_len; in evbuffer_add_buffer()
1019 in_total_len = inbuf->total_len; in evbuffer_add_buffer_reference()
1020 out_total_len = outbuf->total_len; in evbuffer_add_buffer_reference()
1021 chain = inbuf->first; in evbuffer_add_buffer_reference()
1026 if (outbuf->freeze_end || outbuf == inbuf) { in evbuffer_add_buffer_reference()
1027 result = -1; in evbuffer_add_buffer_reference()
1031 for (; chain; chain = chain->next) { in evbuffer_add_buffer_reference()
1032 if ((chain->flags & (EVBUFFER_FILESEGMENT|EVBUFFER_SENDFILE|EVBUFFER_MULTICAST)) != 0) { in evbuffer_add_buffer_reference()
1034 result = -1; in evbuffer_add_buffer_reference()
1042 evbuffer_free_all_chains(outbuf->first); in evbuffer_add_buffer_reference()
1046 outbuf->n_add_for_cb += in_total_len; in evbuffer_add_buffer_reference()
1063 in_total_len = inbuf->total_len; in evbuffer_prepend_buffer()
1064 out_total_len = outbuf->total_len; in evbuffer_prepend_buffer()
1069 if (outbuf->freeze_start || inbuf->freeze_start) { in evbuffer_prepend_buffer()
1070 result = -1; in evbuffer_prepend_buffer()
1075 result = -1; in evbuffer_prepend_buffer()
1082 evbuffer_free_all_chains(outbuf->first); in evbuffer_prepend_buffer()
1090 inbuf->n_del_for_cb += in_total_len; in evbuffer_prepend_buffer()
1091 outbuf->n_add_for_cb += in_total_len; in evbuffer_prepend_buffer()
1108 old_len = buf->total_len; in evbuffer_drain()
1113 if (buf->freeze_start) { in evbuffer_drain()
1114 result = -1; in evbuffer_drain()
1120 for (chain = buf->first; chain != NULL; chain = next) { in evbuffer_drain()
1121 next = chain->next; in evbuffer_drain()
1130 buf->total_len -= len; in evbuffer_drain()
1132 for (chain = buf->first; in evbuffer_drain()
1133 remaining >= chain->off; in evbuffer_drain()
1135 next = chain->next; in evbuffer_drain()
1136 remaining -= chain->off; in evbuffer_drain()
1138 if (chain == *buf->last_with_datap) { in evbuffer_drain()
1139 buf->last_with_datap = &buf->first; in evbuffer_drain()
1141 if (&chain->next == buf->last_with_datap) in evbuffer_drain()
1142 buf->last_with_datap = &buf->first; in evbuffer_drain()
1146 chain->misalign += chain->off; in evbuffer_drain()
1147 chain->off = 0; in evbuffer_drain()
1153 buf->first = chain; in evbuffer_drain()
1154 EVUTIL_ASSERT(remaining <= chain->off); in evbuffer_drain()
1155 chain->misalign += remaining; in evbuffer_drain()
1156 chain->off -= remaining; in evbuffer_drain()
1159 buf->n_del_for_cb += len; in evbuffer_drain()
1177 n = -1; in evbuffer_remove()
1203 if (datlen > (size_t)(EV_SSIZE_MAX - pos->pos)) { in evbuffer_copyout_from()
1204 result = -1; in evbuffer_copyout_from()
1207 chain = pos->internal_.chain; in evbuffer_copyout_from()
1208 pos_in_chain = pos->internal_.pos_in_chain; in evbuffer_copyout_from()
1209 if (datlen + pos->pos > buf->total_len) in evbuffer_copyout_from()
1210 datlen = buf->total_len - pos->pos; in evbuffer_copyout_from()
1212 chain = buf->first; in evbuffer_copyout_from()
1214 if (datlen > buf->total_len) in evbuffer_copyout_from()
1215 datlen = buf->total_len; in evbuffer_copyout_from()
1222 if (buf->freeze_start) { in evbuffer_copyout_from()
1223 result = -1; in evbuffer_copyout_from()
1229 while (datlen && datlen >= chain->off - pos_in_chain) { in evbuffer_copyout_from()
1230 size_t copylen = chain->off - pos_in_chain; in evbuffer_copyout_from()
1232 chain->buffer + chain->misalign + pos_in_chain, in evbuffer_copyout_from()
1235 datlen -= copylen; in evbuffer_copyout_from()
1237 chain = chain->next; in evbuffer_copyout_from()
1244 EVUTIL_ASSERT(datlen+pos_in_chain <= chain->off); in evbuffer_copyout_from()
1246 memcpy(data, chain->buffer + chain->misalign + pos_in_chain, in evbuffer_copyout_from()
1263 /*XXX We should have an option to force this to be zero-copy.*/ in evbuffer_remove_buffer()
1272 chain = previous = src->first; in evbuffer_remove_buffer()
1279 if (dst->freeze_end || src->freeze_start) { in evbuffer_remove_buffer()
1280 result = -1; in evbuffer_remove_buffer()
1284 /* short-cut if there is no more data buffered */ in evbuffer_remove_buffer()
1285 if (datlen >= src->total_len) { in evbuffer_remove_buffer()
1286 datlen = src->total_len; in evbuffer_remove_buffer()
1293 while (chain->off <= datlen) { in evbuffer_remove_buffer()
1297 EVUTIL_ASSERT(chain != *src->last_with_datap); in evbuffer_remove_buffer()
1298 nread += chain->off; in evbuffer_remove_buffer()
1299 datlen -= chain->off; in evbuffer_remove_buffer()
1301 if (src->last_with_datap == &chain->next) in evbuffer_remove_buffer()
1302 src->last_with_datap = &src->first; in evbuffer_remove_buffer()
1303 chain = chain->next; in evbuffer_remove_buffer()
1306 if (chain != src->first) { in evbuffer_remove_buffer()
1311 if (dst->first == NULL) { in evbuffer_remove_buffer()
1312 dst->first = src->first; in evbuffer_remove_buffer()
1314 *chp = src->first; in evbuffer_remove_buffer()
1316 dst->last = previous; in evbuffer_remove_buffer()
1317 previous->next = NULL; in evbuffer_remove_buffer()
1318 src->first = chain; in evbuffer_remove_buffer()
1321 dst->total_len += nread; in evbuffer_remove_buffer()
1322 dst->n_add_for_cb += nread; in evbuffer_remove_buffer()
1327 evbuffer_add(dst, chain->buffer + chain->misalign, datlen); in evbuffer_remove_buffer()
1328 chain->misalign += datlen; in evbuffer_remove_buffer()
1329 chain->off -= datlen; in evbuffer_remove_buffer()
1332 /* You might think we would want to increment dst->n_add_for_cb in evbuffer_remove_buffer()
1335 src->total_len -= nread; in evbuffer_remove_buffer()
1336 src->n_del_for_cb += nread; in evbuffer_remove_buffer()
1360 chain = buf->first; in evbuffer_pullup()
1363 size = buf->total_len; in evbuffer_pullup()
1364 /* if size > buf->total_len, we cannot guarantee to the user that she in evbuffer_pullup()
1367 if (size == 0 || (size_t)size > buf->total_len) in evbuffer_pullup()
1372 if (chain->off >= (size_t)size) { in evbuffer_pullup()
1373 result = chain->buffer + chain->misalign; in evbuffer_pullup()
1378 remaining = size - chain->off; in evbuffer_pullup()
1380 for (tmp=chain->next; tmp; tmp=tmp->next) { in evbuffer_pullup()
1383 if (tmp->off >= (size_t)remaining) in evbuffer_pullup()
1385 remaining -= tmp->off; in evbuffer_pullup()
1389 size_t old_off = chain->off; in evbuffer_pullup()
1390 if (CHAIN_SPACE_LEN(chain) < size - chain->off) { in evbuffer_pullup()
1396 tmp->off = size; in evbuffer_pullup()
1397 size -= old_off; in evbuffer_pullup()
1398 chain = chain->next; in evbuffer_pullup()
1399 } else if (chain->buffer_len - chain->misalign >= (size_t)size) { in evbuffer_pullup()
1401 size_t old_off = chain->off; in evbuffer_pullup()
1402 buffer = chain->buffer + chain->misalign + chain->off; in evbuffer_pullup()
1404 tmp->off = size; in evbuffer_pullup()
1405 size -= old_off; in evbuffer_pullup()
1406 chain = chain->next; in evbuffer_pullup()
1412 buffer = tmp->buffer; in evbuffer_pullup()
1413 tmp->off = size; in evbuffer_pullup()
1414 buf->first = tmp; in evbuffer_pullup()
1420 last_with_data = *buf->last_with_datap; in evbuffer_pullup()
1421 for (; chain != NULL && (size_t)size >= chain->off; chain = next) { in evbuffer_pullup()
1422 next = chain->next; in evbuffer_pullup()
1424 if (chain->buffer) { in evbuffer_pullup()
1425 memcpy(buffer, chain->buffer + chain->misalign, chain->off); in evbuffer_pullup()
1426 size -= chain->off; in evbuffer_pullup()
1427 buffer += chain->off; in evbuffer_pullup()
1431 if (&chain->next == buf->last_with_datap) in evbuffer_pullup()
1438 memcpy(buffer, chain->buffer + chain->misalign, size); in evbuffer_pullup()
1439 chain->misalign += size; in evbuffer_pullup()
1440 chain->off -= size; in evbuffer_pullup()
1442 buf->last = tmp; in evbuffer_pullup()
1445 tmp->next = chain; in evbuffer_pullup()
1448 buf->last_with_datap = &buf->first; in evbuffer_pullup()
1450 if (buf->first->next && buf->first->next->off) in evbuffer_pullup()
1451 buf->last_with_datap = &buf->first->next; in evbuffer_pullup()
1453 buf->last_with_datap = &buf->first; in evbuffer_pullup()
1456 result = (tmp->buffer + tmp->misalign); in evbuffer_pullup()
1476 struct evbuffer_chain *chain = it->internal_.chain; in evbuffer_strchr()
1477 size_t i = it->internal_.pos_in_chain; in evbuffer_strchr()
1479 char *buffer = (char *)chain->buffer + chain->misalign; in evbuffer_strchr()
1480 char *cp = memchr(buffer+i, chr, chain->off-i); in evbuffer_strchr()
1482 it->internal_.chain = chain; in evbuffer_strchr()
1483 it->internal_.pos_in_chain = cp - buffer; in evbuffer_strchr()
1484 it->pos += (cp - buffer - i); in evbuffer_strchr()
1485 return it->pos; in evbuffer_strchr()
1487 it->pos += chain->off - i; in evbuffer_strchr()
1489 chain = chain->next; in evbuffer_strchr()
1492 return (-1); in evbuffer_strchr()
1505 size_t chunk = (s + CHUNK_SZ < s_end) ? CHUNK_SZ : (s_end - s); in find_eol_char()
1525 struct evbuffer_chain *chain = it->internal_.chain; in evbuffer_find_eol_char()
1526 size_t i = it->internal_.pos_in_chain; in evbuffer_find_eol_char()
1528 char *buffer = (char *)chain->buffer + chain->misalign; in evbuffer_find_eol_char()
1529 char *cp = find_eol_char(buffer+i, chain->off-i); in evbuffer_find_eol_char()
1531 it->internal_.chain = chain; in evbuffer_find_eol_char()
1532 it->internal_.pos_in_chain = cp - buffer; in evbuffer_find_eol_char()
1533 it->pos += (cp - buffer) - i; in evbuffer_find_eol_char()
1534 return it->pos; in evbuffer_find_eol_char()
1536 it->pos += chain->off - i; in evbuffer_find_eol_char()
1538 chain = chain->next; in evbuffer_find_eol_char()
1541 return (-1); in evbuffer_find_eol_char()
1549 struct evbuffer_chain *chain = ptr->internal_.chain; in evbuffer_strspn()
1550 size_t i = ptr->internal_.pos_in_chain; in evbuffer_strspn()
1556 char *buffer = (char *)chain->buffer + chain->misalign; in evbuffer_strspn()
1557 for (; i < chain->off; ++i) { in evbuffer_strspn()
1563 ptr->internal_.chain = chain; in evbuffer_strspn()
1564 ptr->internal_.pos_in_chain = i; in evbuffer_strspn()
1565 ptr->pos += count; in evbuffer_strspn()
1572 if (! chain->next) { in evbuffer_strspn()
1573 ptr->internal_.chain = chain; in evbuffer_strspn()
1574 ptr->internal_.pos_in_chain = i; in evbuffer_strspn()
1575 ptr->pos += count; in evbuffer_strspn()
1579 chain = chain->next; in evbuffer_strspn()
1587 struct evbuffer_chain *chain = it->internal_.chain; in evbuffer_getchr()
1588 size_t off = it->internal_.pos_in_chain; in evbuffer_getchr()
1591 return -1; in evbuffer_getchr()
1593 return (unsigned char)chain->buffer[chain->misalign + off]; in evbuffer_getchr()
1606 if (start && start->internal_.chain == NULL) { in evbuffer_search_eol()
1619 it.internal_.chain = buffer->first; in evbuffer_search_eol()
1697 if (buffer->freeze_start) { in evbuffer_readln()
1735 int result = -1; in evbuffer_add()
1739 if (buf->freeze_end) { in evbuffer_add()
1742 /* Prevent buf->total_len overflow */ in evbuffer_add()
1743 if (datlen > EV_SIZE_MAX - buf->total_len) { in evbuffer_add()
1747 if (*buf->last_with_datap == NULL) { in evbuffer_add()
1748 chain = buf->last; in evbuffer_add()
1750 chain = *buf->last_with_datap; in evbuffer_add()
1762 if ((chain->flags & EVBUFFER_IMMUTABLE) == 0) { in evbuffer_add()
1764 EVUTIL_ASSERT(chain->misalign >= 0 && in evbuffer_add()
1765 (ev_uint64_t)chain->misalign <= EVBUFFER_CHAIN_MAX); in evbuffer_add()
1766 remain = chain->buffer_len - (size_t)chain->misalign - chain->off; in evbuffer_add()
1770 memcpy(chain->buffer + chain->misalign + chain->off, in evbuffer_add()
1772 chain->off += datlen; in evbuffer_add()
1773 buf->total_len += datlen; in evbuffer_add()
1774 buf->n_add_for_cb += datlen; in evbuffer_add()
1781 memcpy(chain->buffer + chain->off, data, datlen); in evbuffer_add()
1782 chain->off += datlen; in evbuffer_add()
1783 buf->total_len += datlen; in evbuffer_add()
1784 buf->n_add_for_cb += datlen; in evbuffer_add()
1793 to_alloc = chain->buffer_len; in evbuffer_add()
1803 memcpy(chain->buffer + chain->misalign + chain->off, in evbuffer_add()
1805 chain->off += remain; in evbuffer_add()
1806 buf->total_len += remain; in evbuffer_add()
1807 buf->n_add_for_cb += remain; in evbuffer_add()
1811 datlen -= remain; in evbuffer_add()
1813 memcpy(tmp->buffer, data, datlen); in evbuffer_add()
1814 tmp->off = datlen; in evbuffer_add()
1816 buf->n_add_for_cb += datlen; in evbuffer_add()
1830 int result = -1; in evbuffer_prepend()
1838 if (buf->freeze_start) { in evbuffer_prepend()
1841 if (datlen > EV_SIZE_MAX - buf->total_len) { in evbuffer_prepend()
1845 chain = buf->first; in evbuffer_prepend()
1855 if ((chain->flags & EVBUFFER_IMMUTABLE) == 0) { in evbuffer_prepend()
1857 EVUTIL_ASSERT(chain->misalign >= 0 && in evbuffer_prepend()
1858 (ev_uint64_t)chain->misalign <= EVBUFFER_CHAIN_MAX); in evbuffer_prepend()
1862 if (chain->off == 0) in evbuffer_prepend()
1863 chain->misalign = chain->buffer_len; in evbuffer_prepend()
1865 if ((size_t)chain->misalign >= datlen) { in evbuffer_prepend()
1867 memcpy(chain->buffer + chain->misalign - datlen, in evbuffer_prepend()
1869 chain->off += datlen; in evbuffer_prepend()
1870 chain->misalign -= datlen; in evbuffer_prepend()
1871 buf->total_len += datlen; in evbuffer_prepend()
1872 buf->n_add_for_cb += datlen; in evbuffer_prepend()
1874 } else if (chain->misalign) { in evbuffer_prepend()
1876 memcpy(chain->buffer, in evbuffer_prepend()
1877 (char*)data + datlen - chain->misalign, in evbuffer_prepend()
1878 (size_t)chain->misalign); in evbuffer_prepend()
1879 chain->off += (size_t)chain->misalign; in evbuffer_prepend()
1880 buf->total_len += (size_t)chain->misalign; in evbuffer_prepend()
1881 buf->n_add_for_cb += (size_t)chain->misalign; in evbuffer_prepend()
1882 datlen -= (size_t)chain->misalign; in evbuffer_prepend()
1883 chain->misalign = 0; in evbuffer_prepend()
1890 buf->first = tmp; in evbuffer_prepend()
1891 if (buf->last_with_datap == &buf->first && chain->off) in evbuffer_prepend()
1892 buf->last_with_datap = &tmp->next; in evbuffer_prepend()
1894 tmp->next = chain; in evbuffer_prepend()
1896 tmp->off = datlen; in evbuffer_prepend()
1897 EVUTIL_ASSERT(datlen <= tmp->buffer_len); in evbuffer_prepend()
1898 tmp->misalign = tmp->buffer_len - datlen; in evbuffer_prepend()
1900 memcpy(tmp->buffer + tmp->misalign, data, datlen); in evbuffer_prepend()
1901 buf->total_len += datlen; in evbuffer_prepend()
1902 buf->n_add_for_cb += datlen; in evbuffer_prepend()
1912 /** Helper: realigns the memory in chain->buffer so that misalign is 0. */
1916 EVUTIL_ASSERT(!(chain->flags & EVBUFFER_IMMUTABLE)); in evbuffer_chain_align()
1917 EVUTIL_ASSERT(!(chain->flags & EVBUFFER_MEM_PINNED_ANY)); in evbuffer_chain_align()
1918 memmove(chain->buffer, chain->buffer + chain->misalign, chain->off); in evbuffer_chain_align()
1919 chain->misalign = 0; in evbuffer_chain_align()
1931 return chain->buffer_len - chain->off >= datlen && in evbuffer_chain_should_realign()
1932 (chain->off < chain->buffer_len / 2) && in evbuffer_chain_should_realign()
1933 (chain->off <= MAX_TO_REALIGN_IN_EXPAND); in evbuffer_chain_should_realign()
1945 chainp = buf->last_with_datap; in evbuffer_expand_singlechain()
1949 * (*chainp)->next. */ in evbuffer_expand_singlechain()
1951 chainp = &(*chainp)->next; in evbuffer_expand_singlechain()
1958 (chain->flags & (EVBUFFER_IMMUTABLE|EVBUFFER_MEM_PINNED_ANY))) { in evbuffer_expand_singlechain()
1972 if (chain->off == 0) { in evbuffer_expand_singlechain()
1991 * resize, we have to copy chain->off bytes. in evbuffer_expand_singlechain()
1995 if (CHAIN_SPACE_LEN(chain) < chain->buffer_len / 8 || in evbuffer_expand_singlechain()
1996 chain->off > MAX_TO_COPY_IN_EXPAND || in evbuffer_expand_singlechain()
1997 datlen >= (EVBUFFER_CHAIN_MAX - chain->off)) { in evbuffer_expand_singlechain()
2000 if (chain->next && CHAIN_SPACE_LEN(chain->next) >= datlen) { in evbuffer_expand_singlechain()
2003 result = chain->next; in evbuffer_expand_singlechain()
2016 size_t length = chain->off + datlen; in evbuffer_expand_singlechain()
2022 tmp->off = chain->off; in evbuffer_expand_singlechain()
2023 memcpy(tmp->buffer, chain->buffer + chain->misalign, in evbuffer_expand_singlechain()
2024 chain->off); in evbuffer_expand_singlechain()
2029 if (buf->last == chain) in evbuffer_expand_singlechain()
2030 buf->last = tmp; in evbuffer_expand_singlechain()
2032 tmp->next = chain->next; in evbuffer_expand_singlechain()
2053 struct evbuffer_chain *chain = buf->last, *tmp, *next; in evbuffer_expand_fast_()
2060 if (chain == NULL || (chain->flags & EVBUFFER_IMMUTABLE)) { in evbuffer_expand_fast_()
2065 return (-1); in evbuffer_expand_fast_()
2076 for (chain = *buf->last_with_datap; chain; chain = chain->next) { in evbuffer_expand_fast_()
2077 if (chain->off) { in evbuffer_expand_fast_()
2079 EVUTIL_ASSERT(chain == *buf->last_with_datap); in evbuffer_expand_fast_()
2086 chain->misalign = 0; in evbuffer_expand_fast_()
2087 avail += chain->buffer_len; in evbuffer_expand_fast_()
2106 tmp = evbuffer_chain_new(datlen - avail); in evbuffer_expand_fast_()
2108 return (-1); in evbuffer_expand_fast_()
2110 buf->last->next = tmp; in evbuffer_expand_fast_()
2111 buf->last = tmp; in evbuffer_expand_fast_()
2119 chain = *buf->last_with_datap; in evbuffer_expand_fast_()
2120 if (!chain->off) { in evbuffer_expand_fast_()
2121 EVUTIL_ASSERT(chain == buf->first); in evbuffer_expand_fast_()
2128 chain = chain->next; in evbuffer_expand_fast_()
2133 next = chain->next; in evbuffer_expand_fast_()
2134 EVUTIL_ASSERT(chain->off == 0); in evbuffer_expand_fast_()
2138 tmp = evbuffer_chain_new(datlen - avail); in evbuffer_expand_fast_()
2143 buf->last = *buf->last_with_datap; in evbuffer_expand_fast_()
2144 (*buf->last_with_datap)->next = NULL; in evbuffer_expand_fast_()
2146 return (-1); in evbuffer_expand_fast_()
2150 buf->first = buf->last = tmp; in evbuffer_expand_fast_()
2151 buf->last_with_datap = &buf->first; in evbuffer_expand_fast_()
2153 (*buf->last_with_datap)->next = tmp; in evbuffer_expand_fast_()
2154 buf->last = tmp; in evbuffer_expand_fast_()
2168 return chain ? 0 : -1; in evbuffer_expand()
2236 return -1; in evbuffer_read_setup_vecs_()
2240 firstchainp = buf->last_with_datap; in evbuffer_read_setup_vecs_()
2243 firstchainp = &(*firstchainp)->next; in evbuffer_read_setup_vecs_()
2250 if (avail > (howmuch - so_far) && exact) in evbuffer_read_setup_vecs_()
2251 avail = howmuch - so_far; in evbuffer_read_setup_vecs_()
2255 chain = chain->next; in evbuffer_read_setup_vecs_()
2268 return -1; in get_n_bytes_readable_on_socket()
2274 return -1; in get_n_bytes_readable_on_socket()
2299 if (buf->freeze_end) { in evbuffer_read()
2300 result = -1; in evbuffer_read()
2313 if (evbuffer_expand_fast_(buf, howmuch, NUM_READ_IOVEC) == -1) { in evbuffer_read()
2314 result = -1; in evbuffer_read()
2337 /* The read failed. It might be a close, in evbuffer_read()
2342 n = -1; in evbuffer_read()
2354 * over on buf->last. */ in evbuffer_read()
2356 result = -1; in evbuffer_read()
2361 p = chain->buffer + chain->misalign + chain->off; in evbuffer_read()
2370 if (n == -1) { in evbuffer_read()
2371 result = -1; in evbuffer_read()
2390 (*chainp)->off += space; in evbuffer_read()
2391 remaining -= (int)space; in evbuffer_read()
2393 (*chainp)->off += remaining; in evbuffer_read()
2394 buf->last_with_datap = chainp; in evbuffer_read()
2397 chainp = &(*chainp)->next; in evbuffer_read()
2400 chain->off += n; in evbuffer_read()
2403 buf->total_len += n; in evbuffer_read()
2404 buf->n_add_for_cb += n; in evbuffer_read()
2420 struct evbuffer_chain *chain = buffer->first; in evbuffer_write_iovec()
2424 return -1; in evbuffer_write_iovec()
2433 if (chain->flags & EVBUFFER_SENDFILE) in evbuffer_write_iovec()
2436 iov[i].IOV_PTR_FIELD = (void *) (chain->buffer + chain->misalign); in evbuffer_write_iovec()
2437 if ((size_t)howmuch >= chain->off) { in evbuffer_write_iovec()
2439 iov[i++].IOV_LEN_FIELD = (IOV_LEN_TYPE)chain->off; in evbuffer_write_iovec()
2440 howmuch -= chain->off; in evbuffer_write_iovec()
2446 chain = chain->next; in evbuffer_write_iovec()
2455 n = -1; in evbuffer_write_iovec()
2471 struct evbuffer_chain *chain = buffer->first; in evbuffer_write_sendfile()
2475 const int source_fd = info->segment->fd; in evbuffer_write_sendfile()
2478 ev_off_t len = chain->off; in evbuffer_write_sendfile()
2481 off_t offset = chain->misalign; in evbuffer_write_sendfile()
2487 res = sendfile(source_fd, dest_fd, chain->misalign, &len, NULL, 0); in evbuffer_write_sendfile()
2488 if (res == -1 && !EVUTIL_ERR_RW_RETRIABLE(errno)) in evbuffer_write_sendfile()
2489 return (-1); in evbuffer_write_sendfile()
2493 res = sendfile(source_fd, dest_fd, chain->misalign, chain->off, NULL, &len, 0); in evbuffer_write_sendfile()
2494 if (res == -1 && !EVUTIL_ERR_RW_RETRIABLE(errno)) in evbuffer_write_sendfile()
2495 return (-1); in evbuffer_write_sendfile()
2500 res = sendfile(dest_fd, source_fd, &offset, chain->off); in evbuffer_write_sendfile()
2501 if (res == -1 && EVUTIL_ERR_RW_RETRIABLE(errno)) { in evbuffer_write_sendfile()
2502 /* if this is EAGAIN or EINTR return 0; otherwise, -1 */ in evbuffer_write_sendfile()
2509 res = sendfile(dest_fd, source_fd, &offset, chain->off); in evbuffer_write_sendfile()
2510 if (res == -1 && EVUTIL_ERR_RW_RETRIABLE(errno)) { in evbuffer_write_sendfile()
2511 if (offset - offset_orig) in evbuffer_write_sendfile()
2512 return offset - offset_orig; in evbuffer_write_sendfile()
2527 int n = -1; in evbuffer_write_atmost()
2531 if (buffer->freeze_start) { in evbuffer_write_atmost()
2535 if (howmuch < 0 || (size_t)howmuch > buffer->total_len) in evbuffer_write_atmost()
2536 howmuch = buffer->total_len; in evbuffer_write_atmost()
2540 struct evbuffer_chain *chain = buffer->first; in evbuffer_write_atmost()
2541 if (chain != NULL && (chain->flags & EVBUFFER_SENDFILE)) in evbuffer_write_atmost()
2548 /* XXX(nickm) Don't disable this code until we know if in evbuffer_write_atmost()
2574 return evbuffer_write_atmost(buffer, fd, -1); in evbuffer_write()
2598 * <b>buf</b>. Returns 0 on success, -1 on failure.
2600 * This isn't exposed yet, because of potential inefficiency issues.
2606 if (pos->pos < 0) in evbuffer_ptr_subtract()
2607 return -1; in evbuffer_ptr_subtract()
2608 if (howfar > (size_t)pos->pos) in evbuffer_ptr_subtract()
2609 return -1; in evbuffer_ptr_subtract()
2610 if (pos->internal_.chain && howfar <= pos->internal_.pos_in_chain) { in evbuffer_ptr_subtract()
2611 pos->internal_.pos_in_chain -= howfar; in evbuffer_ptr_subtract()
2612 pos->pos -= howfar; in evbuffer_ptr_subtract()
2615 const size_t newpos = pos->pos - howfar; in evbuffer_ptr_subtract()
2634 chain = buf->first; in evbuffer_ptr_set()
2635 pos->pos = position; in evbuffer_ptr_set()
2641 if (pos->pos < 0 || EV_SIZE_MAX - position < (size_t)pos->pos) { in evbuffer_ptr_set()
2643 return -1; in evbuffer_ptr_set()
2645 chain = pos->internal_.chain; in evbuffer_ptr_set()
2646 pos->pos += position; in evbuffer_ptr_set()
2647 position = pos->internal_.pos_in_chain; in evbuffer_ptr_set()
2651 EVUTIL_ASSERT(EV_SIZE_MAX - left >= position); in evbuffer_ptr_set()
2652 while (chain && position + left >= chain->off) { in evbuffer_ptr_set()
2653 left -= chain->off - position; in evbuffer_ptr_set()
2654 chain = chain->next; in evbuffer_ptr_set()
2658 pos->internal_.chain = chain; in evbuffer_ptr_set()
2659 pos->internal_.pos_in_chain = position + left; in evbuffer_ptr_set()
2661 /* The first byte in the (nonexistent) chain after the last chain */ in evbuffer_ptr_set()
2662 pos->internal_.chain = NULL; in evbuffer_ptr_set()
2663 pos->internal_.pos_in_chain = 0; in evbuffer_ptr_set()
2666 result = -1; in evbuffer_ptr_set()
2688 if (pos->pos < 0 || in evbuffer_ptr_memcmp()
2689 EV_SIZE_MAX - len < (size_t)pos->pos || in evbuffer_ptr_memcmp()
2690 pos->pos + len > buf->total_len) in evbuffer_ptr_memcmp()
2691 return -1; in evbuffer_ptr_memcmp()
2693 chain = pos->internal_.chain; in evbuffer_ptr_memcmp()
2694 position = pos->internal_.pos_in_chain; in evbuffer_ptr_memcmp()
2697 if (len + position > chain->off) in evbuffer_ptr_memcmp()
2698 n_comparable = chain->off - position; in evbuffer_ptr_memcmp()
2701 r = memcmp(chain->buffer + chain->misalign + position, mem, in evbuffer_ptr_memcmp()
2706 len -= n_comparable; in evbuffer_ptr_memcmp()
2708 chain = chain->next; in evbuffer_ptr_memcmp()
2735 chain = pos.internal_.chain = buffer->first; in evbuffer_search_range()
2740 last_chain = end->internal_.chain; in evbuffer_search_range()
2749 chain->buffer + chain->misalign + in evbuffer_search_range()
2752 chain->off - pos.internal_.pos_in_chain); in evbuffer_search_range()
2754 pos.pos += p - start_at; in evbuffer_search_range()
2755 pos.internal_.pos_in_chain += p - start_at; in evbuffer_search_range()
2757 if (end && pos.pos + (ev_ssize_t)len > end->pos) in evbuffer_search_range()
2764 if (pos.internal_.pos_in_chain == chain->off) { in evbuffer_search_range()
2765 chain = pos.internal_.chain = chain->next; in evbuffer_search_range()
2771 pos.pos += chain->off - pos.internal_.pos_in_chain; in evbuffer_search_range()
2772 chain = pos.internal_.chain = chain->next; in evbuffer_search_range()
2794 if (start_at && start_at->internal_.chain == NULL) in evbuffer_peek()
2800 chain = start_at->internal_.chain; in evbuffer_peek()
2801 len_so_far = chain->off in evbuffer_peek()
2802 - start_at->internal_.pos_in_chain; in evbuffer_peek()
2805 vec[0].iov_base = (void *)(chain->buffer + chain->misalign in evbuffer_peek()
2806 + start_at->internal_.pos_in_chain); in evbuffer_peek()
2809 chain = chain->next; in evbuffer_peek()
2811 chain = buffer->first; in evbuffer_peek()
2817 len = buffer->total_len; in evbuffer_peek()
2819 len -= start_at->pos; in evbuffer_peek()
2827 vec[idx].iov_base = (void *)(chain->buffer + chain->misalign); in evbuffer_peek()
2828 vec[idx].iov_len = chain->off; in evbuffer_peek()
2833 len_so_far += chain->off; in evbuffer_peek()
2834 chain = chain->next; in evbuffer_peek()
2848 int sz, result = -1; in evbuffer_add_vprintf()
2855 if (buf->freeze_end) { in evbuffer_add_vprintf()
2865 size_t used = chain->misalign + chain->off; in evbuffer_add_vprintf()
2866 buffer = (char *)chain->buffer + chain->misalign + chain->off; in evbuffer_add_vprintf()
2867 EVUTIL_ASSERT(chain->buffer_len >= used); in evbuffer_add_vprintf()
2868 space = chain->buffer_len - used; in evbuffer_add_vprintf()
2888 chain->off += sz; in evbuffer_add_vprintf()
2889 buf->total_len += sz; in evbuffer_add_vprintf()
2890 buf->n_add_for_cb += sz; in evbuffer_add_vprintf()
2910 int res = -1; in evbuffer_add_printf()
2927 int result = -1; in evbuffer_add_reference()
2931 return (-1); in evbuffer_add_reference()
2932 chain->flags |= EVBUFFER_REFERENCE | EVBUFFER_IMMUTABLE; in evbuffer_add_reference()
2933 chain->buffer = (unsigned char *)data; in evbuffer_add_reference()
2934 chain->buffer_len = datlen; in evbuffer_add_reference()
2935 chain->off = datlen; in evbuffer_add_reference()
2938 info->cleanupfn = cleanupfn; in evbuffer_add_reference()
2939 info->extra = extra; in evbuffer_add_reference()
2942 if (outbuf->freeze_end) { in evbuffer_add_reference()
2949 outbuf->n_add_for_cb += datlen; in evbuffer_add_reference()
2971 seg->refcnt = 1; in evbuffer_file_segment_new()
2972 seg->fd = fd; in evbuffer_file_segment_new()
2973 seg->flags = flags; in evbuffer_file_segment_new()
2974 seg->file_offset = offset; in evbuffer_file_segment_new()
2975 seg->cleanup_cb = NULL; in evbuffer_file_segment_new()
2976 seg->cleanup_cb_arg = NULL; in evbuffer_file_segment_new()
2988 if (length == -1) { in evbuffer_file_segment_new()
2994 seg->length = length; in evbuffer_file_segment_new()
2998 (ev_uint64_t)offset > (ev_uint64_t)(EVBUFFER_CHAIN_MAX - length)) in evbuffer_file_segment_new()
3003 seg->can_sendfile = 1; in evbuffer_file_segment_new()
3015 EVTHREAD_ALLOC_LOCK(seg->lock, 0); in evbuffer_file_segment_new()
3042 const unsigned flags = seg->flags; in evbuffer_file_segment_materialize()
3043 const int fd = seg->fd; in evbuffer_file_segment_materialize()
3044 const ev_off_t length = seg->length; in evbuffer_file_segment_materialize()
3045 const ev_off_t offset = seg->file_offset; in evbuffer_file_segment_materialize()
3047 if (seg->contents) in evbuffer_file_segment_materialize()
3058 if (page_size == -1) in evbuffer_file_segment_materialize()
3061 offset_rounded = offset - offset_leftover; in evbuffer_file_segment_materialize()
3077 seg->mapping = mapped; in evbuffer_file_segment_materialize()
3078 seg->contents = (char*)mapped+offset_leftover; in evbuffer_file_segment_materialize()
3079 seg->mmap_offset = 0; in evbuffer_file_segment_materialize()
3080 seg->is_mapping = 1; in evbuffer_file_segment_materialize()
3096 seg->mapping_handle = m; in evbuffer_file_segment_materialize()
3097 seg->mmap_offset = offset; in evbuffer_file_segment_materialize()
3098 seg->is_mapping = 1; in evbuffer_file_segment_materialize()
3120 n = read(fd, mem+read_so_far, length-read_so_far); in evbuffer_file_segment_materialize()
3137 seg->contents = mem; in evbuffer_file_segment_materialize()
3143 return -1; in evbuffer_file_segment_materialize()
3149 EVUTIL_ASSERT(seg->refcnt > 0); in evbuffer_file_segment_add_cleanup_cb()
3150 seg->cleanup_cb = cb; in evbuffer_file_segment_add_cleanup_cb()
3151 seg->cleanup_cb_arg = arg; in evbuffer_file_segment_add_cleanup_cb()
3158 EVLOCK_LOCK(seg->lock, 0); in evbuffer_file_segment_free()
3159 refcnt = --seg->refcnt; in evbuffer_file_segment_free()
3160 EVLOCK_UNLOCK(seg->lock, 0); in evbuffer_file_segment_free()
3165 if (seg->is_mapping) { in evbuffer_file_segment_free()
3167 CloseHandle(seg->mapping_handle); in evbuffer_file_segment_free()
3170 offset_leftover = seg->file_offset % get_page_size(); in evbuffer_file_segment_free()
3171 if (munmap(seg->mapping, seg->length + offset_leftover) == -1) in evbuffer_file_segment_free()
3174 } else if (seg->contents) { in evbuffer_file_segment_free()
3175 mm_free(seg->contents); in evbuffer_file_segment_free()
3178 if ((seg->flags & EVBUF_FS_CLOSE_ON_FREE) && seg->fd >= 0) { in evbuffer_file_segment_free()
3179 close(seg->fd); in evbuffer_file_segment_free()
3182 if (seg->cleanup_cb) { in evbuffer_file_segment_free()
3183 (*seg->cleanup_cb)((struct evbuffer_file_segment const*)seg, in evbuffer_file_segment_free()
3184 seg->flags, seg->cleanup_cb_arg); in evbuffer_file_segment_free()
3185 seg->cleanup_cb = NULL; in evbuffer_file_segment_free()
3186 seg->cleanup_cb_arg = NULL; in evbuffer_file_segment_free()
3189 EVTHREAD_FREE_LOCK(seg->lock, 0); in evbuffer_file_segment_free()
3202 EVLOCK_LOCK(seg->lock, 0); in evbuffer_add_file_segment()
3203 if (buf->flags & EVBUFFER_FLAG_DRAINS_TO_FD) { in evbuffer_add_file_segment()
3206 if (!seg->contents) { in evbuffer_add_file_segment()
3208 EVLOCK_UNLOCK(seg->lock, 0); in evbuffer_add_file_segment()
3210 return -1; in evbuffer_add_file_segment()
3214 EVLOCK_UNLOCK(seg->lock, 0); in evbuffer_add_file_segment()
3216 if (buf->freeze_end) in evbuffer_add_file_segment()
3220 if (offset > seg->length) in evbuffer_add_file_segment()
3222 length = seg->length - offset; in evbuffer_add_file_segment()
3226 if (offset+length > seg->length) in evbuffer_add_file_segment()
3234 chain->flags |= EVBUFFER_IMMUTABLE|EVBUFFER_FILESEGMENT; in evbuffer_add_file_segment()
3235 if (can_use_sendfile && seg->can_sendfile) { in evbuffer_add_file_segment()
3236 chain->flags |= EVBUFFER_SENDFILE; in evbuffer_add_file_segment()
3237 chain->misalign = seg->file_offset + offset; in evbuffer_add_file_segment()
3238 chain->off = length; in evbuffer_add_file_segment()
3239 chain->buffer_len = chain->misalign + length; in evbuffer_add_file_segment()
3240 } else if (seg->is_mapping) { in evbuffer_add_file_segment()
3242 ev_uint64_t total_offset = seg->mmap_offset+offset; in evbuffer_add_file_segment()
3250 offset_rounded = total_offset - offset_remaining; in evbuffer_add_file_segment()
3253 seg->mapping_handle, in evbuffer_add_file_segment()
3262 chain->buffer = (unsigned char*) data; in evbuffer_add_file_segment()
3263 chain->buffer_len = length+offset_remaining; in evbuffer_add_file_segment()
3264 chain->misalign = offset_remaining; in evbuffer_add_file_segment()
3265 chain->off = length; in evbuffer_add_file_segment()
3267 chain->buffer = (unsigned char*)(seg->contents + offset); in evbuffer_add_file_segment()
3268 chain->buffer_len = length; in evbuffer_add_file_segment()
3269 chain->off = length; in evbuffer_add_file_segment()
3272 chain->buffer = (unsigned char*)(seg->contents + offset); in evbuffer_add_file_segment()
3273 chain->buffer_len = length; in evbuffer_add_file_segment()
3274 chain->off = length; in evbuffer_add_file_segment()
3277 EVLOCK_LOCK(seg->lock, 0); in evbuffer_add_file_segment()
3278 ++seg->refcnt; in evbuffer_add_file_segment()
3279 EVLOCK_UNLOCK(seg->lock, 0); in evbuffer_add_file_segment()
3280 extra->segment = seg; in evbuffer_add_file_segment()
3281 buf->n_add_for_cb += length; in evbuffer_add_file_segment()
3292 return -1; in evbuffer_add_file_segment()
3304 return -1; in evbuffer_add_file()
3316 if (!LIST_EMPTY(&buffer->callbacks)) in evbuffer_setcb()
3324 return -1; in evbuffer_setcb()
3326 ent->cb.cb_obsolete = cb; in evbuffer_setcb()
3327 ent->flags |= EVBUFFER_CB_OBSOLETE; in evbuffer_setcb()
3340 e->cb.cb_func = cb; in evbuffer_add_cb()
3341 e->cbarg = cbarg; in evbuffer_add_cb()
3342 e->flags = EVBUFFER_CB_ENABLED; in evbuffer_add_cb()
3343 LIST_INSERT_HEAD(&buffer->callbacks, e, next); in evbuffer_add_cb()
3363 int result = -1; in evbuffer_remove_cb()
3365 LIST_FOREACH(cbent, &buffer->callbacks, next) { in evbuffer_remove_cb()
3366 if (cb == cbent->cb.cb_func && cbarg == cbent->cbarg) { in evbuffer_remove_cb()
3383 cb->flags |= flags; in evbuffer_cb_set_flags()
3395 cb->flags &= ~flags; in evbuffer_cb_clear_flags()
3405 buffer->freeze_start = 1; in evbuffer_freeze()
3407 buffer->freeze_end = 1; in evbuffer_freeze()
3417 buffer->freeze_start = 0; in evbuffer_unfreeze()
3419 buffer->freeze_end = 0; in evbuffer_unfreeze()
3428 if (!(cb->flags & EVBUFFER_CB_SUSPENDED)) {
3429 cb->size_before_suspend = evbuffer_get_length(buffer);
3430 cb->flags |= EVBUFFER_CB_SUSPENDED;
3437 if ((cb->flags & EVBUFFER_CB_SUSPENDED)) {
3438 unsigned call = (cb->flags & EVBUFFER_CB_CALL_ON_UNSUSPEND);
3439 size_t sz = cb->size_before_suspend;
3440 cb->flags &= ~(EVBUFFER_CB_SUSPENDED|
3442 cb->size_before_suspend = 0;
3443 if (call && (cb->flags & EVBUFFER_CB_ENABLED)) {
3444 cb->cb(buffer, sz, evbuffer_get_length(buffer), cb->cbarg);
3456 if (buffer->deferred_cbs) { in evbuffer_get_callbacks_()
3458 r = -1; in evbuffer_get_callbacks_()
3461 cbs[0] = &buffer->deferred; in evbuffer_get_callbacks_()