Changeset 11564


Ignore:
Timestamp:
Dec 21, 2010, 10:07:15 PM (11 years ago)
Author:
charles
Message:

(trunk libT) #3836 "libevent2 support" -- optimize serialization of json strings for libevent2's new evbuffer API. This also fixes #3843

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/bencode.c

    r11548 r11564  
    13561356jsonStringFunc( const tr_benc * val, void * vdata )
    13571357{
     1358    char * out;
     1359    char * outwalk;
     1360    char * outend;
     1361    struct evbuffer_iovec vec[1];
    13581362    struct jsonWalk * data = vdata;
    13591363    const unsigned char * it = (const unsigned char *) getStr(val);
    13601364    const unsigned char * end = it + val->val.s.len;
    1361 
    1362     evbuffer_expand( data->out, val->val.s.len + 2 );
    1363     evbuffer_add( data->out, "\"", 1 );
     1365    const int safeguard = 512; /* arbitrary margin for escapes and unicode */
     1366
     1367    evbuffer_reserve_space( data->out, val->val.s.len+safeguard, vec, 1 );
     1368    out = vec[0].iov_base;
     1369    outend = out + vec[0].iov_len;
     1370
     1371    outwalk = out;
     1372    *outwalk++ = '"';
    13641373
    13651374    for( ; it!=end; ++it )
     
    13671376        switch( *it )
    13681377        {
    1369             case '\b': evbuffer_add( data->out, "\\b", 2 ); break;
    1370             case '\f': evbuffer_add( data->out, "\\f", 2 ); break;
    1371             case '\n': evbuffer_add( data->out, "\\n", 2 ); break;
    1372             case '\r': evbuffer_add( data->out, "\\r", 2 ); break;
    1373             case '\t': evbuffer_add( data->out, "\\t", 2 ); break;
    1374             case '"': evbuffer_add( data->out, "\\\"", 2 ); break;
    1375             case '\\': evbuffer_add( data->out, "\\\\", 2 ); break;
     1378            case '\b': *outwalk++ = '\\'; *outwalk++ = 'b'; break;
     1379            case '\f': *outwalk++ = '\\'; *outwalk++ = 'f'; break;
     1380            case '\n': *outwalk++ = '\\'; *outwalk++ = 'n'; break;
     1381            case '\r': *outwalk++ = '\\'; *outwalk++ = 'r'; break;
     1382            case '\t': *outwalk++ = '\\'; *outwalk++ = 't'; break;
     1383            case '"' : *outwalk++ = '\\'; *outwalk++ = '"'; break;
     1384            case '\\': *outwalk++ = '\\'; *outwalk++ = '\\'; break;
    13761385
    13771386            default:
    13781387                if( isascii( *it ) )
    1379                     evbuffer_add( data->out, it, 1 );
     1388                    *outwalk++ = *it;
    13801389                else {
    13811390                    const UTF8 * tmp = it;
     
    13841393                    ConversionResult result = ConvertUTF8toUTF32( &tmp, end, &u32, &buf + 1, 0 );
    13851394                    if((( result==conversionOK ) || (result==targetExhausted)) && (tmp!=it)) {
    1386                         evbuffer_add_printf( data->out, "\\u%04x", (unsigned int)buf );
     1395                        outwalk += tr_snprintf( outwalk, outend-outwalk, "\\u%04x", (unsigned int)buf );
    13871396                        it = tmp - 1;
    13881397                    }
     
    13901399        }
    13911400    }
    1392     evbuffer_add( data->out, "\"", 1 );
     1401
     1402    *outwalk++ = '"';
     1403    vec[0].iov_len = outwalk - out;
     1404    evbuffer_commit_space( data->out, vec, 1 );
     1405
    13931406    jsonChildFunc( data );
    13941407}
Note: See TracChangeset for help on using the changeset viewer.