diff --git a/include/msgpack/vrefbuffer.hpp b/include/msgpack/vrefbuffer.hpp index c8ac49af..4ce6cb45 100644 --- a/include/msgpack/vrefbuffer.hpp +++ b/include/msgpack/vrefbuffer.hpp @@ -40,8 +40,8 @@ struct iovec { namespace msgpack { namespace detail { - - + // int64, uint64, double + std::size_t const packer_max_buffer_size = 9; } // detail class vrefbuffer { @@ -57,7 +57,8 @@ private: public: vrefbuffer(size_t ref_size = MSGPACK_VREFBUFFER_REF_SIZE, size_t chunk_size = MSGPACK_VREFBUFFER_CHUNK_SIZE) - :m_ref_size(ref_size), m_chunk_size(chunk_size) + :m_ref_size(std::max(ref_size, detail::packer_max_buffer_size + 1)), + m_chunk_size(chunk_size) { size_t nfirst = (sizeof(iovec) < 72/2) ? 72 / sizeof(iovec) : 8; @@ -277,4 +278,3 @@ private: } // namespace msgpack #endif /* msgpack/vrefbuffer.hpp */ - diff --git a/src/vrefbuffer.c b/src/vrefbuffer.c index ec5a0ead..1070ba2c 100644 --- a/src/vrefbuffer.c +++ b/src/vrefbuffer.c @@ -19,6 +19,8 @@ #include #include +#define MSGPACK_PACKER_MAX_BUFFER_SIZE 9 + struct msgpack_vrefbuffer_chunk { struct msgpack_vrefbuffer_chunk* next; /* data ... */ @@ -28,7 +30,9 @@ bool msgpack_vrefbuffer_init(msgpack_vrefbuffer* vbuf, size_t ref_size, size_t chunk_size) { vbuf->chunk_size = chunk_size; - vbuf->ref_size = ref_size; + vbuf->ref_size = + ref_size > MSGPACK_PACKER_MAX_BUFFER_SIZE + 1 ? + ref_size : MSGPACK_PACKER_MAX_BUFFER_SIZE + 1 ; size_t nfirst = (sizeof(struct iovec) < 72/2) ? 72 / sizeof(struct iovec) : 8; @@ -217,4 +221,3 @@ int msgpack_vrefbuffer_migrate(msgpack_vrefbuffer* vbuf, msgpack_vrefbuffer* to) return 0; } - diff --git a/test/buffer.cc b/test/buffer.cc index b72aeddf..512b0bc4 100644 --- a/test/buffer.cc +++ b/test/buffer.cc @@ -117,4 +117,3 @@ TEST(buffer, fbuffer_c) EXPECT_EQ(EOF, fgetc(file)); fclose(file); } - diff --git a/test/msgpack_test.cpp b/test/msgpack_test.cpp index 53af6dfb..3201a82d 100644 --- a/test/msgpack_test.cpp +++ b/test/msgpack_test.cpp @@ -1076,13 +1076,12 @@ TEST(MSGPACK_USER_DEFINED, simple_buffer_union_member) //----------------------------------------------------------------------------- -#define GEN_TEST_VREF(test_type) \ +#define GEN_TEST_VREF(test_type, vbuf) \ do { \ vector v; \ v.push_back(0); \ for (unsigned int i = 0; i < v.size(); i++) { \ test_type val1 = v[i]; \ - msgpack::vrefbuffer vbuf; \ msgpack::pack(vbuf, val1); \ msgpack::sbuffer sbuf; \ const struct iovec* cur = vbuf.vector(); \ @@ -1099,97 +1098,231 @@ TEST(MSGPACK_USER_DEFINED, simple_buffer_union_member) TEST(MSGPACK, vrefbuffer_char) { - GEN_TEST_VREF(char); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(char, vbuf); } TEST(MSGPACK, vrefbuffer_signed_char) { - GEN_TEST_VREF(signed char); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(signed char, vbuf); } TEST(MSGPACK, vrefbuffer_unsigned_char) { - GEN_TEST_VREF(unsigned char); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(unsigned char, vbuf); } TEST(MSGPACK, vrefbuffer_short) { - GEN_TEST_VREF(short); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(short, vbuf); } TEST(MSGPACK, vrefbuffer_int) { - GEN_TEST_VREF(int); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(int, vbuf); } TEST(MSGPACK, vrefbuffer_long) { - GEN_TEST_VREF(long); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(long, vbuf); } TEST(MSGPACK, vrefbuffer_long_long) { - GEN_TEST_VREF(long long); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(long long, vbuf); } TEST(MSGPACK, vrefbuffer_unsigned_short) { - GEN_TEST_VREF(unsigned short); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(unsigned short, vbuf); } TEST(MSGPACK, vrefbuffer_unsigned_int) { - GEN_TEST_VREF(unsigned int); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(unsigned int, vbuf); } TEST(MSGPACK, vrefbuffer_unsigned_long) { - GEN_TEST_VREF(unsigned long); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(unsigned long, vbuf); } TEST(MSGPACK, vrefbuffer_unsigned_long_long) { - GEN_TEST_VREF(unsigned long long); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(unsigned long long, vbuf); } TEST(MSGPACK, vrefbuffer_uint8) { - GEN_TEST_VREF(uint8_t); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(uint8_t, vbuf); } TEST(MSGPACK, vrefbuffer_uint16) { - GEN_TEST_VREF(uint16_t); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(uint16_t, vbuf); } TEST(MSGPACK, vrefbuffer_uint32) { - GEN_TEST_VREF(uint32_t); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(uint32_t, vbuf); } TEST(MSGPACK, vrefbuffer_uint64) { - GEN_TEST_VREF(uint64_t); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(uint64_t, vbuf); } TEST(MSGPACK, vrefbuffer_int8) { - GEN_TEST_VREF(int8_t); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(int8_t, vbuf); } TEST(MSGPACK, vrefbuffer_int16) { - GEN_TEST_VREF(int16_t); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(int16_t, vbuf); } TEST(MSGPACK, vrefbuffer_int32) { - GEN_TEST_VREF(int32_t); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(int32_t, vbuf); } TEST(MSGPACK, vrefbuffer_int64) { - GEN_TEST_VREF(int64_t); + msgpack::vrefbuffer vbuf; + GEN_TEST_VREF(int64_t, vbuf); +} + +// small ref_size and chunk_size +TEST(MSGPACK, vrefbuffer_small_char) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(char, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_signed_char) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(signed char, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_unsigned_char) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(unsigned char, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_short) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(short, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_int) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(int, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_long) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(long, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_long_long) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(long long, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_unsigned_short) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(unsigned short, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_unsigned_int) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(unsigned int, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_unsigned_long) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(unsigned long, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_unsigned_long_long) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(unsigned long long, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_uint8) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(uint8_t, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_uint16) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(uint16_t, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_uint32) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(uint32_t, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_uint64) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(uint64_t, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_int8) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(int8_t, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_int16) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(int16_t, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_int32) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(int32_t, vbuf); +} + +TEST(MSGPACK, vrefbuffer_small_int64) +{ + msgpack::vrefbuffer vbuf(0, 0); + GEN_TEST_VREF(int64_t, vbuf); } //-----------------------------------------------------------------------------