remove msgpack_unpacker_buffered_size, add msgpack_unpacker_parsed_size

This commit is contained in:
frsyuki 2009-02-26 01:15:14 +09:00
parent 8893523776
commit 5697b9a15d
5 changed files with 26 additions and 19 deletions

View File

@ -197,6 +197,7 @@ bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size)
mpac->used = COUNTER_SIZE; mpac->used = COUNTER_SIZE;
mpac->free = initial_buffer_size - mpac->used; mpac->free = initial_buffer_size - mpac->used;
mpac->off = COUNTER_SIZE; mpac->off = COUNTER_SIZE;
mpac->parsed = 0;
mpac->initial_buffer_size = initial_buffer_size; mpac->initial_buffer_size = initial_buffer_size;
mpac->z = z; mpac->z = z;
mpac->referenced = false; mpac->referenced = false;
@ -305,8 +306,13 @@ bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size)
int msgpack_unpacker_execute(msgpack_unpacker* mpac) int msgpack_unpacker_execute(msgpack_unpacker* mpac)
{ {
return template_execute(CTX_CAST(mpac->ctx), size_t off = mpac->off;
int ret = template_execute(CTX_CAST(mpac->ctx),
mpac->buf, mpac->used, &mpac->off); mpac->buf, mpac->used, &mpac->off);
if(mpac->off > off) {
mpac->parsed += mpac->off - off;
}
return ret;
} }
msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac) msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac)
@ -347,10 +353,8 @@ bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac)
void msgpack_unpacker_reset(msgpack_unpacker* mpac) void msgpack_unpacker_reset(msgpack_unpacker* mpac)
{ {
msgpack_zone* z = mpac->z;
template_init(CTX_CAST(mpac->ctx)); template_init(CTX_CAST(mpac->ctx));
CTX_CAST(mpac->ctx)->user.z = z; mpac->parsed = 0;
CTX_CAST(mpac->ctx)->user.referenced = &mpac->referenced;
} }

View File

@ -33,6 +33,7 @@ typedef struct msgpack_unpacker {
size_t used; size_t used;
size_t free; size_t free;
size_t off; size_t off;
size_t parsed;
msgpack_zone* z; msgpack_zone* z;
bool referenced; bool referenced;
size_t initial_buffer_size; size_t initial_buffer_size;
@ -46,7 +47,6 @@ void msgpack_unpacker_destroy(msgpack_unpacker* mpac);
msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size); msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size);
void msgpack_unpacker_free(msgpack_unpacker* mpac); void msgpack_unpacker_free(msgpack_unpacker* mpac);
static inline size_t msgpack_unpacker_buffered_size(const msgpack_unpacker* mpac);
static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size); static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size);
static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac); static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac);
static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac); static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac);
@ -61,6 +61,8 @@ msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac);
void msgpack_unpacker_reset(msgpack_unpacker* mpac); void msgpack_unpacker_reset(msgpack_unpacker* mpac);
static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac);
typedef enum { typedef enum {
MSGPACK_UNPACK_SUCCESS = 2, MSGPACK_UNPACK_SUCCESS = 2,
@ -78,11 +80,6 @@ bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac);
bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size); bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size);
size_t msgpack_unpacker_buffered_size(const msgpack_unpacker* mpac)
{
return mpac->used;
}
bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size) bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size)
{ {
if(mpac->free >= size) { return true; } if(mpac->free >= size) { return true; }
@ -105,6 +102,11 @@ void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size)
mpac->free -= size; mpac->free -= size;
} }
size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac)
{
return mpac->parsed;
}
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -43,9 +43,6 @@ public:
~unpacker(); ~unpacker();
public: public:
/*! 0. check if the buffered size is not exceed the assumption. */
size_t buffered_size() const;
/*! 1. reserve buffer. at least `size' bytes of capacity will be ready */ /*! 1. reserve buffer. at least `size' bytes of capacity will be ready */
void reserve_buffer(size_t size); void reserve_buffer(size_t size);
@ -70,6 +67,9 @@ public:
/*! 5.3. after release_zone(), re-initialize unpacker */ /*! 5.3. after release_zone(), re-initialize unpacker */
void reset(); void reset();
/*! 6. check if the parsed message size doesn't exceed assumption. */
size_t parsed_size() const;
// Basic usage of the unpacker is as following: // Basic usage of the unpacker is as following:
// //
@ -158,11 +158,6 @@ inline unpacker::~unpacker()
} }
inline size_t unpacker::buffered_size() const
{
return msgpack_unpacker_buffered_size(this);
}
inline void unpacker::reserve_buffer(size_t size) inline void unpacker::reserve_buffer(size_t size)
{ {
if(!msgpack_unpacker_reserve_buffer(this, size)) { if(!msgpack_unpacker_reserve_buffer(this, size)) {
@ -223,6 +218,11 @@ inline void unpacker::reset()
msgpack_unpacker_reset(this); msgpack_unpacker_reset(this);
} }
inline size_t unpacker::parsed_size() const
{
return msgpack_unpacker_parsed_size(this);
}
inline char* unpacker::nonparsed_buffer() inline char* unpacker::nonparsed_buffer()
{ {

View File

@ -59,7 +59,6 @@ msgpack_unpack_struct_decl(_context) {
msgpack_unpack_func(void, _init)(msgpack_unpack_struct(_context)* ctx) msgpack_unpack_func(void, _init)(msgpack_unpack_struct(_context)* ctx)
{ {
/*memset(ctx, 0, sizeof( msgpack_unpack_struct(_context) )); FIXME needed? */
ctx->cs = CS_HEADER; ctx->cs = CS_HEADER;
ctx->trail = 0; ctx->trail = 0;
ctx->top = 0; ctx->top = 0;

View File

@ -278,6 +278,7 @@ static VALUE MessagePack_unpack_rescue(VALUE args)
static VALUE MessagePack_unpack_limit(VALUE self, VALUE data, VALUE limit) static VALUE MessagePack_unpack_limit(VALUE self, VALUE data, VALUE limit)
{ {
CHECK_STRING_TYPE(data); CHECK_STRING_TYPE(data);
msgpack_unpack_t mp; msgpack_unpack_t mp;
template_init(&mp); template_init(&mp);
unpack_user u = {0, Qnil}; unpack_user u = {0, Qnil};
@ -288,6 +289,7 @@ static VALUE MessagePack_unpack_limit(VALUE self, VALUE data, VALUE limit)
VALUE ret = rb_rescue(MessagePack_unpack_impl, (VALUE)args, VALUE ret = rb_rescue(MessagePack_unpack_impl, (VALUE)args,
MessagePack_unpack_rescue, Qnil); MessagePack_unpack_rescue, Qnil);
rb_gc_enable(); rb_gc_enable();
return ret; return ret;
} }