Allocate at least sizeof(ArenaBlock) for an ArenaBlock (#6770)
* Allocate at least sizeof(ArenaBlock) for an ArenaBlock * Fix message pack unit test Previously we were using only the 4 least significan bits as the length of a message pack string, but it should be 5 according to https://github.com/msgpack/msgpack/blob/master/spec.md#str-format-family
This commit is contained in:
parent
ce33366396
commit
966402a7a2
|
@ -304,11 +304,9 @@ void* ArenaBlock::allocate(Reference<ArenaBlock>& self, int bytes) {
|
|||
ArenaBlock* ArenaBlock::create(int dataSize, Reference<ArenaBlock>& next) {
|
||||
ArenaBlock* b;
|
||||
if (dataSize <= SMALL - TINY_HEADER && !next) {
|
||||
if (dataSize <= 16 - TINY_HEADER) {
|
||||
b = (ArenaBlock*)FastAllocator<16>::allocate();
|
||||
b->tinySize = 16;
|
||||
INSTRUMENT_ALLOCATE("Arena16");
|
||||
} else if (dataSize <= 32 - TINY_HEADER) {
|
||||
static_assert(sizeof(ArenaBlock) <= 32); // Need to allocate at least sizeof(ArenaBlock) for an ArenaBlock*. See
|
||||
// https://github.com/apple/foundationdb/issues/6753
|
||||
if (dataSize <= 32 - TINY_HEADER) {
|
||||
b = (ArenaBlock*)FastAllocator<32>::allocate();
|
||||
b->tinySize = 32;
|
||||
INSTRUMENT_ALLOCATE("Arena32");
|
||||
|
@ -442,10 +440,7 @@ void ArenaBlock::destroy() {
|
|||
|
||||
void ArenaBlock::destroyLeaf() {
|
||||
if (isTiny()) {
|
||||
if (tinySize <= 16) {
|
||||
FastAllocator<16>::release(this);
|
||||
INSTRUMENT_RELEASE("Arena16");
|
||||
} else if (tinySize <= 32) {
|
||||
if (tinySize <= 32) {
|
||||
FastAllocator<32>::release(this);
|
||||
INSTRUMENT_RELEASE("Arena32");
|
||||
} else {
|
||||
|
|
|
@ -835,20 +835,20 @@ TEST_CASE("/flow/Tracing/FastUDPMessagePackEncoding") {
|
|||
auto index = 147;
|
||||
// We & out the bits here that contain the length the initial 4 higher order bits are
|
||||
// to signify this is a string of len <= 31 chars.
|
||||
auto firstKeyLength = static_cast<uint8_t>(data[index] & 0b00001111);
|
||||
auto firstKeyLength = static_cast<uint8_t>(data[index] & 0b00011111);
|
||||
index++;
|
||||
auto firstKey = readMPString(&data[index], firstKeyLength);
|
||||
index += firstKeyLength;
|
||||
auto firstValueLength = static_cast<uint8_t>(data[index] & 0b00001111);
|
||||
auto firstValueLength = static_cast<uint8_t>(data[index] & 0b00011111);
|
||||
index++;
|
||||
auto firstValue = readMPString(&data[index], firstValueLength);
|
||||
index += firstValueLength;
|
||||
attributes[firstKey] = firstValue;
|
||||
auto secondKeyLength = static_cast<uint8_t>(data[index] & 0b00001111);
|
||||
auto secondKeyLength = static_cast<uint8_t>(data[index] & 0b00011111);
|
||||
index++;
|
||||
auto secondKey = readMPString(&data[index], secondKeyLength);
|
||||
index += secondKeyLength;
|
||||
auto secondValueLength = static_cast<uint8_t>(data[index] & 0b00001111);
|
||||
auto secondValueLength = static_cast<uint8_t>(data[index] & 0b00011111);
|
||||
index++;
|
||||
auto secondValue = readMPString(&data[index], secondValueLength);
|
||||
attributes[secondKey] = secondValue;
|
||||
|
|
Loading…
Reference in New Issue