/* ========================================================================== * libevnet/src/bufio-pagebuf.h - Network server library for libevent. * -------------------------------------------------------------------------- * Copyright (c) 2006 Barracuda Networks, Inc. * Copyright (c) 2006 William Ahern * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to permit * persons to whom the Software is furnished to do so, subject to the * following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. * ========================================================================== */ #ifndef EVNET_BUFIO_PAGEBUF_H #define EVNET_BUFIO_PAGEBUF_H #define bufio_page_initialized(p) ((p)->base) #define bufio_page_len(p) (size_t)((p)->cursor.put - (p)->cursor.get) #define bufio_page_nfree(p) (size_t)((p)->cursor.end - (p)->cursor.put) #define bufio_page_size(p) (size_t)((p)->cursor.end - (unsigned char *)(p)->base) struct bufio_page { void *base; struct { unsigned char *get; unsigned char *put; unsigned char *end; } cursor; #if defined TAILQ_ENTRY TAILQ_ENTRY(bufio_page) tqe; #else struct { struct bufio_page *tqe_next; struct bufio_page **tqe_prev; } tqe; #endif }; /* bufio_page */ #if defined TAILQ_HEAD TAILQ_HEAD(bufio_pages, bufio_page); #else struct bufio_pages { struct bufio_page *tqh_first; struct bufio_page **tqh_last; }; #endif static __inline struct bufio_page *bufio_page_init(struct bufio_page *p, void *buf, size_t bufsiz) { p->base = buf; p->cursor.get = buf; p->cursor.put = buf; p->cursor.end = (unsigned char *)(buf) + (bufsiz); return p; } /* bufio_page_init() */ extern const struct bufio_pagebuf_options { size_t page_size; size_t keep_lowat; size_t keep_hiwat; } bufio_pagebuf_defaults; struct bufio_pagebuf; struct bufio_pagebuf_frame { struct bufio_pagebuf **bp; #if defined SLIST_ENTRY && !_WIN32 SLIST_ENTRY(bufio_pagebuf_frame) sle; #else struct { struct bufio_pagebuf_frame *sle_next; } sle; #endif }; /* struct bufio_pagebuf_frame */ struct bufio_pagebuf { struct bufio_pagebuf_options opts; const struct arena_prototype *ap; struct bufio_source *source; struct bufio_sink *sink; struct bufio_pages pages; size_t npages; size_t nbytes; #if defined SLIST_HEAD SLIST_HEAD(, bufio_pagebuf_frame) stack; #else struct { struct bufio_pagebuf_frame *slh_first; } stack; #endif BUFIO_IMPLEMENTS(bufio_pagebuf, bufio_source); BUFIO_IMPLEMENTS(bufio_pagebuf, bufio_sink); struct { enum bufio_errno source; enum bufio_errno sink; } lasterr; struct { struct bufio_source *source; struct bufio_sink *sink; } next; }; /* struct bufio_pagebuf */ struct bufio_pagebuf *bufio_pagebuf_init(struct bufio_pagebuf *, const struct bufio_pagebuf_options *, const struct arena_prototype *); void bufio_pagebuf_destroy(struct bufio_pagebuf *); void bufio_pagebuf_clear(struct bufio_pagebuf *); void bufio_pagebuf_set_sink(struct bufio_pagebuf *, struct bufio_sink *); void bufio_pagebuf_set_source(struct bufio_pagebuf *, struct bufio_source *); struct bufio_sink *bufio_pagebuf_to_sink(struct bufio_pagebuf *); struct bufio_source *bufio_pagebuf_to_source(struct bufio_pagebuf *); size_t bufio_pagebuf_gets(struct bufio_pagebuf *, void *, size_t, int, enum bufio_errno *); #endif /* EVNET_BUFIO_PAGEBUF_H */