From 0313826cef64ca89058f32e3c8a2868e8f9e98df Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sun, 6 Feb 2011 12:42:35 -0800 Subject: Benchmarks compile and run again! --- benchmarks/parsestream.upb_table.c | 68 +++++++++++--------------------------- core/upb_string.c | 20 +---------- core/upb_string.h | 20 ++++++++++- stream/upb_decoder.c | 3 +- stream/upb_strstream.c | 4 +-- 5 files changed, 43 insertions(+), 72 deletions(-) diff --git a/benchmarks/parsestream.upb_table.c b/benchmarks/parsestream.upb_table.c index 16979b0..a646999 100644 --- a/benchmarks/parsestream.upb_table.c +++ b/benchmarks/parsestream.upb_table.c @@ -4,12 +4,13 @@ #include "upb_def.h" #include "upb_decoder.h" #include "upb_strstream.h" +#include "upb_glue.h" -static upb_stringsrc *stringsrc; static upb_string *input_str; -static upb_string *tmp_str; static upb_msgdef *def; -static upb_decoder *decoder; +static upb_decoder decoder; +static upb_stringsrc stringsrc; +upb_handlers handlers; static bool initialize() { @@ -29,13 +30,8 @@ static bool initialize() upb_printerr(&status); return false; } - - upb_stringsrc *ssrc = upb_stringsrc_new(); - upb_stringsrc_reset(ssrc, fds_str); - upb_decoder *d = upb_decoder_new(upb_downcast_msgdef(fds_def)); - upb_decoder_reset(d, upb_stringsrc_bytesrc(ssrc)); - - upb_symtab_addfds(s, upb_decoder_src(d), &status); + upb_parsedesc(s, fds_str, &status); + upb_string_unref(fds_str); if(!upb_ok(&status)) { fprintf(stderr, "Error importing " MESSAGE_DESCRIPTOR_FILE ":"); @@ -43,12 +39,7 @@ static bool initialize() return false; } - upb_string_unref(fds_str); - upb_decoder_free(d); - upb_stringsrc_free(ssrc); - upb_def_unref(fds_def); - - def = upb_downcast_msgdef(upb_symtab_lookup(s, UPB_STRLIT(MESSAGE_NAME))); + def = upb_dyncast_msgdef(upb_symtab_lookup(s, UPB_STRLIT(MESSAGE_NAME))); if(!def) { fprintf(stderr, "Error finding symbol '" UPB_STRFMT "'.\n", UPB_STRARG(UPB_STRLIT(MESSAGE_NAME))); @@ -62,55 +53,36 @@ static bool initialize() fprintf(stderr, "Error reading " MESSAGE_FILE "\n"); return false; } - tmp_str = NULL; - decoder = upb_decoder_new(def); - stringsrc = upb_stringsrc_new(); + upb_decoder_init(&decoder, def); + upb_stringsrc_init(&stringsrc); + upb_handlers_init(&handlers); + static upb_handlerset handlerset = {}; // Empty handlers. + upb_register_handlerset(&handlers, &handlerset); return true; } static void cleanup() { upb_string_unref(input_str); - upb_string_unref(tmp_str); upb_def_unref(UPB_UPCAST(def)); - upb_decoder_free(decoder); - upb_stringsrc_free(stringsrc); + upb_decoder_uninit(&decoder); + upb_stringsrc_uninit(&stringsrc); } static size_t run(int i) { (void)i; upb_status status = UPB_STATUS_INIT; - upb_stringsrc_reset(stringsrc, input_str); - upb_decoder_reset(decoder, upb_stringsrc_bytesrc(stringsrc)); - upb_src *src = upb_decoder_src(decoder); - upb_fielddef *f; - int depth = 0; - while(1) { - while(!upb_src_eof(src) && (f = upb_src_getdef(src)) != NULL) { - if(upb_issubmsg(f)) { - upb_src_startmsg(src); - ++depth; - } else if(upb_isstring(f)) { - tmp_str = upb_string_tryrecycle(tmp_str); - upb_src_getstr(src, tmp_str); - } else { - // Primitive type. - upb_value val; - upb_src_getval(src, upb_value_addrof(&val)); - } - } - // If we're not EOF now, the loop terminated due to an error. - if (!upb_src_eof(src)) goto err; - if (depth == 0) break; - --depth; - upb_src_endmsg(src); - } + upb_stringsrc_reset(&stringsrc, input_str); + upb_decoder_reset(&decoder, upb_stringsrc_bytesrc(&stringsrc)); + upb_src *src = upb_decoder_src(&decoder); + upb_src_sethandlers(src, &handlers); + upb_src_run(src, &status); if(!upb_ok(&status)) goto err; return upb_string_len(input_str); err: - fprintf(stderr, "Decode error"); + fprintf(stderr, "Decode error: "); upb_printerr(&status); return 0; } diff --git a/core/upb_string.c b/core/upb_string.c index 297583b..30ed88f 100644 --- a/core/upb_string.c +++ b/core/upb_string.c @@ -48,30 +48,12 @@ uint32_t upb_string_size(upb_string *str) { #endif } -static void upb_string_release(upb_string *str) { - if(str->src) { - upb_string_unref(str->src); - str->src = NULL; - } -} - void _upb_string_free(upb_string *str) { free(str->cached_mem); - upb_string_release(str); + _upb_string_release(str); free(str); } -void upb_string_recycle(upb_string **_str) { - upb_string *str = *_str; - if(str && upb_atomic_only(&str->refcount)) { - str->ptr = NULL; - upb_string_release(str); - } else { - upb_string_unref(str); - *_str = upb_string_new(); - } -} - char *upb_string_getrwbuf(upb_string *str, upb_strlen_t len) { // assert(str->ptr == NULL); upb_strlen_t size = upb_string_size(str); diff --git a/core/upb_string.h b/core/upb_string.h index 4943cbf..0694a23 100644 --- a/core/upb_string.h +++ b/core/upb_string.h @@ -112,6 +112,13 @@ INLINE void upb_string_unref(upb_string *str) { } } +static void _upb_string_release(upb_string *str) { + if(str->src) { + upb_string_unref(str->src); + str->src = NULL; + } +} + upb_string *upb_strdup(upb_string *s); // Forward-declare. // Returns a string with the same contents as "str". The caller owns a ref on @@ -158,7 +165,18 @@ INLINE const char *upb_string_getbufend(upb_string *str) { // upb_src_getstr(str); // } // } -void upb_string_recycle(upb_string **str); +INLINE void upb_string_recycle(upb_string **_str) { + upb_string *str = *_str; + if(str && upb_atomic_only(&str->refcount)) { + str->ptr = NULL; + str->len = 0; + _upb_string_release(str); + } else { + upb_string_unref(str); + *_str = upb_string_new(); + } +} + // The options for setting the contents of a string. These may only be called // when a string is first created or recycled; once other functions have been diff --git a/stream/upb_decoder.c b/stream/upb_decoder.c index 588d553..2fadf51 100644 --- a/stream/upb_decoder.c +++ b/stream/upb_decoder.c @@ -389,8 +389,7 @@ void upb_decoder_reset(upb_decoder *d, upb_bytesrc *bytesrc) { d->top->msgdef = d->toplevel_msgdef; // Never want to end top-level message, so treat it like a group. d->top->end_offset = UPB_GROUP_END_OFFSET; - upb_string_unref(d->buf); - d->buf = NULL; + upb_string_recycle(&d->buf); } void upb_decoder_uninit(upb_decoder *d) { diff --git a/stream/upb_strstream.c b/stream/upb_strstream.c index 8a230ae..a7967d4 100644 --- a/stream/upb_strstream.c +++ b/stream/upb_strstream.c @@ -13,7 +13,7 @@ static upb_strlen_t upb_stringsrc_read(upb_bytesrc *_src, void *buf, upb_strlen_t count, upb_status *status) { upb_stringsrc *src = (upb_stringsrc*)_src; if (src->offset == upb_string_len(src->str)) { - upb_seterr(status, UPB_EOF, ""); + status->code = UPB_EOF; return -1; } else { upb_strlen_t to_read = UPB_MIN(count, upb_string_len(src->str) - src->offset); @@ -27,7 +27,7 @@ static bool upb_stringsrc_getstr(upb_bytesrc *_src, upb_string *str, upb_status *status) { upb_stringsrc *src = (upb_stringsrc*)_src; if (src->offset == upb_string_len(src->str)) { - upb_seterr(status, UPB_EOF, ""); + status->code = UPB_EOF; return false; } else { upb_strlen_t len = upb_string_len(src->str) - src->offset; -- cgit v1.2.3