|
29 | 29 | /* Frame buffer: depth varint (max 2 bytes for 256) + 256 frames * 5 bytes/varint + margin */ |
30 | 30 | #define MAX_FRAME_BUFFER_SIZE ((MAX_STACK_DEPTH * MAX_VARINT_SIZE_U32) + MAX_VARINT_SIZE_U32 + 16) |
31 | 31 |
|
32 | | -/* File structure sizes */ |
33 | | -#define FILE_FOOTER_SIZE 32 |
34 | | - |
35 | 32 | /* Helper macro: convert PyLong to int32, using default_val if conversion fails */ |
36 | 33 | #define PYLONG_TO_INT32_OR_DEFAULT(obj, var, default_val) \ |
37 | 34 | do { \ |
@@ -588,9 +585,9 @@ static inline int |
588 | 585 | write_sample_header(BinaryWriter *writer, ThreadEntry *entry, uint8_t encoding) |
589 | 586 | { |
590 | 587 | uint8_t header[SAMPLE_HEADER_FIXED_SIZE]; |
591 | | - memcpy(header, &entry->thread_id, 8); |
592 | | - memcpy(header + 8, &entry->interpreter_id, 4); |
593 | | - header[12] = encoding; |
| 588 | + memcpy(header + SMP_OFF_THREAD_ID, &entry->thread_id, SMP_SIZE_THREAD_ID); |
| 589 | + memcpy(header + SMP_OFF_INTERPRETER_ID, &entry->interpreter_id, SMP_SIZE_INTERPRETER_ID); |
| 590 | + header[SMP_OFF_ENCODING] = encoding; |
594 | 591 | return writer_write_bytes(writer, header, SAMPLE_HEADER_FIXED_SIZE); |
595 | 592 | } |
596 | 593 |
|
@@ -649,9 +646,9 @@ write_sample_with_encoding(BinaryWriter *writer, ThreadEntry *entry, |
649 | 646 | { |
650 | 647 | /* Header: thread_id(8) + interpreter_id(4) + encoding(1) + delta(varint) + status(1) */ |
651 | 648 | uint8_t header_buf[SAMPLE_HEADER_MAX_SIZE]; |
652 | | - memcpy(header_buf, &entry->thread_id, 8); |
653 | | - memcpy(header_buf + 8, &entry->interpreter_id, 4); |
654 | | - header_buf[12] = (uint8_t)encoding_type; |
| 649 | + memcpy(header_buf + SMP_OFF_THREAD_ID, &entry->thread_id, SMP_SIZE_THREAD_ID); |
| 650 | + memcpy(header_buf + SMP_OFF_INTERPRETER_ID, &entry->interpreter_id, SMP_SIZE_INTERPRETER_ID); |
| 651 | + header_buf[SMP_OFF_ENCODING] = (uint8_t)encoding_type; |
655 | 652 | size_t varint_len = encode_varint_u64( |
656 | 653 | header_buf + SAMPLE_HEADER_FIXED_SIZE, |
657 | 654 | timestamp_delta); |
@@ -1145,17 +1142,17 @@ binary_writer_finalize(BinaryWriter *writer) |
1145 | 1142 | PyErr_SetFromErrno(PyExc_IOError); |
1146 | 1143 | return -1; |
1147 | 1144 | } |
1148 | | - uint64_t file_size = (uint64_t)footer_offset + 32; |
1149 | | - uint8_t footer[32] = {0}; |
| 1145 | + uint64_t file_size = (uint64_t)footer_offset + FILE_FOOTER_SIZE; |
| 1146 | + uint8_t footer[FILE_FOOTER_SIZE] = {0}; |
1150 | 1147 | /* Cast size_t to uint32_t before memcpy to ensure correct bytes are copied |
1151 | 1148 | * on both little-endian and big-endian systems (size_t is 8 bytes on 64-bit) */ |
1152 | 1149 | uint32_t string_count_u32 = (uint32_t)writer->string_count; |
1153 | 1150 | uint32_t frame_count_u32 = (uint32_t)writer->frame_count; |
1154 | | - memcpy(footer + 0, &string_count_u32, 4); |
1155 | | - memcpy(footer + 4, &frame_count_u32, 4); |
1156 | | - memcpy(footer + 8, &file_size, 8); |
1157 | | - /* bytes 16-31: checksum placeholder (zeros) */ |
1158 | | - if (fwrite_checked_allow_threads(footer, 32, writer->fp) < 0) { |
| 1151 | + memcpy(footer + FTR_OFF_STRINGS, &string_count_u32, FTR_SIZE_STRINGS); |
| 1152 | + memcpy(footer + FTR_OFF_FRAMES, &frame_count_u32, FTR_SIZE_FRAMES); |
| 1153 | + memcpy(footer + FTR_OFF_FILE_SIZE, &file_size, FTR_SIZE_FILE_SIZE); |
| 1154 | + /* checksum (FTR_OFF_CHECKSUM..FILE_FOOTER_SIZE-1): placeholder zeros */ |
| 1155 | + if (fwrite_checked_allow_threads(footer, FILE_FOOTER_SIZE, writer->fp) < 0) { |
1159 | 1156 | return -1; |
1160 | 1157 | } |
1161 | 1158 |
|
|
0 commit comments