Author: gahr (ports committer)
Date: Thu Jul 10 13:08:51 2014
New Revision: 268494
URL: http://svnweb.freebsd.org/changeset/base/268494

Log:
  Implement Short/Small String Optimization in SBUF(9) and change lengths and
  positions in the API from ssize_t and int to size_t.
  
  CR:           D388
  Approved by:  des, bapt

Modified:
  head/lib/libsbuf/Makefile
  head/sys/kern/subr_sbuf.c
  head/sys/sys/sbuf.h

Modified: head/lib/libsbuf/Makefile
==============================================================================
--- head/lib/libsbuf/Makefile   Thu Jul 10 13:04:52 2014        (r268493)
+++ head/lib/libsbuf/Makefile   Thu Jul 10 13:08:51 2014        (r268494)
@@ -4,7 +4,7 @@ LIB=            sbuf
 SHLIBDIR?=     /lib
 SRCS=          subr_sbuf.c 
 
-SHLIB_MAJOR    = 6
+SHLIB_MAJOR    = 7
 
 SYMBOL_MAPS=    ${.CURDIR}/Symbol.map
 VERSION_DEF=   ${.CURDIR}/Version.def

Modified: head/sys/kern/subr_sbuf.c
==============================================================================
--- head/sys/kern/subr_sbuf.c   Thu Jul 10 13:04:52 2014        (r268493)
+++ head/sys/kern/subr_sbuf.c   Thu Jul 10 13:08:51 2014        (r268494)
@@ -152,11 +152,16 @@ static int
 sbuf_extend(struct sbuf *s, int addlen)
 {
        char *newbuf;
-       int newsize;
+       size_t newsize;
 
        if (!SBUF_CANEXTEND(s))
                return (-1);
        newsize = sbuf_extendsize(s->s_size + addlen);
+       if (s->s_buf == s->s_static_buf && newsize <= sizeof(s->s_static_buf)) {
+               s->s_size = sizeof(s->s_static_buf);
+               return (0);
+       }
+
        newbuf = SBMALLOC(newsize);
        if (newbuf == NULL)
                return (-1);
@@ -176,7 +181,7 @@ sbuf_extend(struct sbuf *s, int addlen)
  * big enough to hold at least length characters.
  */
 static struct sbuf *
-sbuf_newbuf(struct sbuf *s, char *buf, int length, int flags)
+sbuf_newbuf(struct sbuf *s, char *buf, size_t length, int flags)
 {
 
        memset(s, 0, sizeof(*s));
@@ -195,6 +200,11 @@ sbuf_newbuf(struct sbuf *s, char *buf, i
        if ((flags & SBUF_AUTOEXTEND) != 0)
                s->s_size = sbuf_extendsize(s->s_size);
 
+       if (s->s_size <= sizeof(s->s_static_buf)) {
+               s->s_buf = s->s_static_buf;
+               return (s);
+       }
+
        s->s_buf = SBMALLOC(s->s_size);
        if (s->s_buf == NULL)
                return (NULL);
@@ -283,21 +293,19 @@ sbuf_clear(struct sbuf *s)
  * Effectively truncates the sbuf at the new position.
  */
 int
-sbuf_setpos(struct sbuf *s, ssize_t pos)
+sbuf_setpos(struct sbuf *s, size_t pos)
 {
 
        assert_sbuf_integrity(s);
        assert_sbuf_state(s, 0);
 
-       KASSERT(pos >= 0,
-           ("attempt to seek to a negative position (%jd)", (intmax_t)pos));
        KASSERT(pos < s->s_size,
            ("attempt to seek past end of sbuf (%jd >= %jd)",
            (intmax_t)pos, (intmax_t)s->s_size));
        KASSERT(!SBUF_ISSECTION(s),
            ("attempt to seek when in a section"));
 
-       if (pos < 0 || pos > s->s_len)
+       if (pos > s->s_len)
                return (-1);
        s->s_len = pos;
        return (0);
@@ -561,7 +569,8 @@ int
 sbuf_vprintf(struct sbuf *s, const char *fmt, va_list ap)
 {
        va_list ap_copy;
-       int error, len;
+       size_t len;
+       int error;
 
        assert_sbuf_integrity(s);
        assert_sbuf_state(s, 0);

Modified: head/sys/sys/sbuf.h
==============================================================================
--- head/sys/sys/sbuf.h Thu Jul 10 13:04:52 2014        (r268493)
+++ head/sys/sys/sbuf.h Thu Jul 10 13:08:51 2014        (r268494)
@@ -44,8 +44,8 @@ struct sbuf {
        sbuf_drain_func *s_drain_func;  /* drain function */
        void            *s_drain_arg;   /* user-supplied drain argument */
        int              s_error;       /* current error code */
-       ssize_t          s_size;        /* size of storage buffer */
-       ssize_t          s_len;         /* current length of string */
+       size_t           s_size;        /* size of storage buffer */
+       size_t           s_len;         /* current length of string */
 #define        SBUF_FIXEDLEN   0x00000000      /* fixed length buffer 
(default) */
 #define        SBUF_AUTOEXTEND 0x00000001      /* automatically extend buffer 
*/
 #define        SBUF_USRFLAGMSK 0x0000ffff      /* mask of flags the user may 
specify */
@@ -55,6 +55,9 @@ struct sbuf {
 #define        SBUF_INSECTION  0x00100000      /* set by sbuf_start_section() 
*/
        int              s_flags;       /* flags */
        ssize_t          s_sect_len;    /* current length of section */
+#define SBUF_STATIC_LEN        64              /* static storage buffer length 
*/
+       char             s_static_buf[SBUF_STATIC_LEN];
+                                       /* static storage buffer */
 };
 
 __BEGIN_DECLS
@@ -65,7 +68,7 @@ struct sbuf   *sbuf_new(struct sbuf *, cha
 #define                 sbuf_new_auto()                                \
        sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND)
 void            sbuf_clear(struct sbuf *);
-int             sbuf_setpos(struct sbuf *, ssize_t);
+int             sbuf_setpos(struct sbuf *, size_t);
 int             sbuf_bcat(struct sbuf *, const void *, size_t);
 int             sbuf_bcpy(struct sbuf *, const void *, size_t);
 int             sbuf_cat(struct sbuf *, const char *);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to