[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