| 79 | return result; |
| 80 | } |
| 81 | void alignReserve(int alignment, int size) { |
| 82 | ASSERT(alignment && (alignment & (alignment - 1)) == 0); // alignment is a power of two |
| 83 | |
| 84 | if (size >= reserved) { |
| 85 | // SOMEDAY: Use a new arena and discard the old one after copying? |
| 86 | reserved = std::max(size, reserved * 2); |
| 87 | if (reserved > 1e9) { |
| 88 | printf("WOAH! Huge allocation\n"); |
| 89 | TraceEvent(SevError, "StringBufferHugeAllocation", id) |
| 90 | .detail("Alignment", alignment) |
| 91 | .detail("Reserved", reserved) |
| 92 | .backtrace(); |
| 93 | } |
| 94 | uint8_t* b = new (str.arena()) uint8_t[reserved + alignment - 1]; |
| 95 | uint8_t* e = b + (reserved + alignment - 1); |
| 96 | |
| 97 | uint8_t* p = (uint8_t*)(int64_t(b + alignment - 1) & |
| 98 | ~(alignment - 1)); // first multiple of alignment greater than or equal to b |
| 99 | ASSERT(p >= b && p + reserved <= e && int64_t(p) % alignment == 0); |
| 100 | |
| 101 | if (str.size() > 0) { |
| 102 | memcpy(p, str.begin(), str.size()); |
| 103 | } |
| 104 | str.contents() = StringRef(p, str.size()); |
| 105 | } |
| 106 | } |
| 107 | }; |
| 108 | |
| 109 | struct SyncQueue : ReferenceCounted<SyncQueue> { |