[master] 4e00e65 Merge closer to FreeBSD's present sbuf version
Poul-Henning Kamp
phk at varnish-cache.org
Tue May 17 11:17:56 CEST 2011
commit 4e00e65c36d4d469041f2e168aa6f75387ce55a3
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue May 17 09:17:41 2011 +0000
Merge closer to FreeBSD's present sbuf version
diff --git a/include/vsb.h b/include/vsb.h
index 5db06b9..e363a1f 100644
--- a/include/vsb.h
+++ b/include/vsb.h
@@ -25,7 +25,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD: head/sys/sys/sbuf.h 212425 2010-09-10 16:42:16Z mdf $
+ * $FreeBSD: head/sys/sys/vsb.h 221993 2011-05-16 16:18:40Z phk $
*/
#ifndef VSB_H_INCLUDED
@@ -76,7 +76,7 @@ int vsb_printf(struct vsb *, const char *, ...)
int vsb_vprintf(struct vsb *, const char *, va_list)
__printflike(2, 0);
#endif
-int vsb_putc(struct vsb *, char);
+int vsb_putc(struct vsb *, int);
int vsb_trim(struct vsb *);
int vsb_error(const struct vsb *);
int vsb_finish(struct vsb *);
diff --git a/lib/libvarnish/vsb.c b/lib/libvarnish/vsb.c
index ac0c608..c5cdb07 100644
--- a/lib/libvarnish/vsb.c
+++ b/lib/libvarnish/vsb.c
@@ -24,7 +24,7 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
-__FBSDID("$FreeBSD: head/sys/kern/subr_vsb.c 212750 2010-09-16 16:13:12Z mdf $
+__FBSDID("$FreeBSD: head/sys/kern/subr_vsb.c 222004 2011-05-17 06:36:32Z phk $")
*/
#include "config.h"
@@ -62,6 +62,7 @@ __FBSDID("$FreeBSD: head/sys/kern/subr_vsb.c 212750 2010-09-16 16:13:12Z mdf $
#define VSB_CLEARFLAG(s, f) do { (s)->s_flags &= ~(f); } while (0)
#define VSB_MINEXTENDSIZE 16 /* Should be power of 2. */
+
#ifdef PAGE_SIZE
#define VSB_MAXEXTENDSIZE PAGE_SIZE
#define VSB_MAXEXTENDINCR PAGE_SIZE
@@ -108,6 +109,12 @@ _assert_vsb_state(const char *fun, struct vsb *s, int state)
#define assert_vsb_state(s, i) do { } while (0)
#endif
+#ifdef CTASSERT
+CTASSERT(powerof2(VSB_MAXEXTENDSIZE));
+CTASSERT(powerof2(VSB_MAXEXTENDINCR));
+#endif
+
+
static int
vsb_extendsize(int size)
{
@@ -124,7 +131,6 @@ vsb_extendsize(int size)
return (newsize);
}
-
/*
* Extend an vsb.
*/
@@ -164,8 +170,6 @@ vsb_newbuf(struct vsb *s, char *buf, int length, int flags)
s->s_magic = VSB_MAGIC;
if (buf != NULL) {
- KASSERT(length > 0,
- ("zero or negative length (%d)", length));
s->s_size = length;
s->s_buf = buf;
return (s);
@@ -182,6 +186,8 @@ vsb_newbuf(struct vsb *s, char *buf, int length, int flags)
/*
* Initialize an vsb.
+ * If buf is non-NULL, it points to a static or already-allocated string
+ * big enough to hold at least length characters.
*/
struct vsb *
vsb_new(struct vsb *s, char *buf, int length, int flags)
@@ -234,9 +240,10 @@ vsb_setpos(struct vsb *s, ssize_t pos)
assert_vsb_state(s, 0);
KASSERT(pos >= 0,
- ("attempt to seek to a negative position (%d)", pos));
+ ("attempt to seek to a negative position (%jd)", (intmax_t)pos));
KASSERT(pos < s->s_size,
- ("attempt to seek past end of vsb (%d >= %d)", pos, s->s_size));
+ ("attempt to seek past end of vsb (%jd >= %jd)",
+ (intmax_t)pos, (intmax_t)->s_size));
if (pos < 0 || pos > s->s_len)
return (-1);
@@ -250,7 +257,7 @@ vsb_setpos(struct vsb *s, ssize_t pos)
* buffer and marking overflow.
*/
static void
-vsb_put_byte(struct vsb *s, char c)
+vsb_put_byte(struct vsb *s, int c)
{
assert_vsb_integrity(s);
@@ -264,10 +271,9 @@ vsb_put_byte(struct vsb *s, char c)
if (s->s_error != 0)
return;
}
- s->s_buf[s->s_len++] = c;
+ s->s_buf[s->s_len++] = (char)c;
}
-
/*
* Append a byte string to an vsb.
*/
@@ -357,6 +363,17 @@ vsb_vprintf(struct vsb *s, const char *fmt, va_list ap)
if (s->s_error != 0)
return (-1);
+ /*
+ * For the moment, there is no way to get vsnprintf(3) to hand
+ * back a character at a time, to push everything into
+ * vsb_putc_func() as was done for the kernel.
+ *
+ * In userspace, while drains are useful, there's generally
+ * not a problem attempting to malloc(3) on out of space. So
+ * expand a userland vsb if there is not enough room for the
+ * data produced by vsb_[v]printf(3).
+ */
+
do {
va_copy(ap_copy, ap);
len = vsnprintf(&s->s_buf[s->s_len], VSB_FREESPACE(s) + 1,
@@ -407,7 +424,7 @@ vsb_printf(struct vsb *s, const char *fmt, ...)
* Append a character to an vsb.
*/
int
-vsb_putc(struct vsb *s, char c)
+vsb_putc(struct vsb *s, int c)
{
vsb_put_byte(s, c);
More information about the varnish-commit
mailing list