From d5f047bee04a42f40425c34061c84b39af846e1f Mon Sep 17 00:00:00 2001 From: bfredl Date: Mon, 23 May 2022 19:53:19 +0200 Subject: refactor(api): use a unpacker based on libmpack instead of msgpack-c Currently this is more or less a straight off reimplementation, but this allow further optimizations down the line, especially for avoiding memory allocations of rpc objects. Current score for "make functionaltest; make oldtest" on a -DEXITFREE build: is 117 055 352 xfree(ptr != NULL) calls (that's NUMBERWANG!). --- src/mpack/mpack_core.c | 10 +++++----- src/mpack/mpack_core.h | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) (limited to 'src/mpack') diff --git a/src/mpack/mpack_core.c b/src/mpack/mpack_core.c index f8ca63b7a3..4ee67a032a 100644 --- a/src/mpack/mpack_core.c +++ b/src/mpack/mpack_core.c @@ -12,8 +12,6 @@ # define MIN(X, Y) ((X) < (Y) ? (X) : (Y)) #endif -static int mpack_rtoken(const char **buf, size_t *buflen, - mpack_token_t *tok); static int mpack_rpending(const char **b, size_t *nl, mpack_tokbuf_t *tb); static int mpack_rvalue(mpack_token_type_t t, mpack_uint32_t l, const char **b, size_t *bl, mpack_token_t *tok); @@ -52,7 +50,10 @@ MPACK_API int mpack_read(mpack_tokbuf_t *tokbuf, const char **buf, int status; size_t initial_ppos, ptrlen, advanced; const char *ptr, *ptr_save; - assert(*buf && *buflen); + assert(*buf); + if (*buflen == 0) { + return MPACK_EOF; + } if (tokbuf->passthrough) { /* pass data from str/bin/ext directly as a MPACK_TOKEN_CHUNK, adjusting @@ -170,8 +171,7 @@ MPACK_API int mpack_write(mpack_tokbuf_t *tokbuf, char **buf, size_t *buflen, return MPACK_OK; } -static int mpack_rtoken(const char **buf, size_t *buflen, - mpack_token_t *tok) +int mpack_rtoken(const char **buf, size_t *buflen, mpack_token_t *tok) { unsigned char t = ADVANCE(buf, buflen); if (t < 0x80) { diff --git a/src/mpack/mpack_core.h b/src/mpack/mpack_core.h index 9edd13c41e..1d601bc82d 100644 --- a/src/mpack/mpack_core.h +++ b/src/mpack/mpack_core.h @@ -83,5 +83,7 @@ MPACK_API int mpack_read(mpack_tokbuf_t *tb, const char **b, size_t *bl, mpack_token_t *tok) FUNUSED FNONULL; MPACK_API int mpack_write(mpack_tokbuf_t *tb, char **b, size_t *bl, const mpack_token_t *tok) FUNUSED FNONULL; +int mpack_rtoken(const char **buf, size_t *buflen, + mpack_token_t *tok); #endif /* MPACK_CORE_H */ -- cgit