void* amqpalloc_realloc(void* ptr, size_t size) { void* result; if (!alloc_trace) { result = realloc(ptr, size); } else { result = trace_realloc(ptr, size); } return result; }
int trace_read (const char *filename) { FILE *trace = fopen(filename, "r"); assert_inner(trace, "fopen"); void *trace_buf = NULL; unsigned long trace_bufsize = 0; size_t n = fread(&trace_bufsize, sizeof(unsigned long), 1, trace); assert_set_errno(ENOTSUP, n == 1, "fread"); trace_buf = malloc(trace_bufsize); assert_inner(trace_buf, "malloc"); n = fread(trace_buf, 1, trace_bufsize, trace); assert_set_errno(ENOTSUP, n == trace_bufsize, "fread"); assert_set_errno(ENOTSUP, feof(trace), "feof"); unsigned int trace_ended = 0; unsigned long trace_index = 0; while (trace_index < trace_bufsize) { char sign = *((char*)(trace_buf + trace_index)); trace_index += sizeof(char); switch (sign) { case 'e': trace_enter(trace_buf + trace_index); trace_index += 2 * sizeof(uintptr_t) + sizeof(unsigned long long); break; case 'x': trace_exit(trace_buf + trace_index); trace_index += sizeof(unsigned long long); break; case '+': trace_malloc(trace_buf + trace_index); trace_index += sizeof(size_t) + 2 * sizeof(uintptr_t) + sizeof(unsigned long long); break; case '*': trace_realloc(trace_buf + trace_index); trace_index += sizeof(size_t) + 3 * sizeof(uintptr_t) + sizeof(unsigned long long); break; case '-': trace_free(trace_buf + trace_index); trace_index += 2 * sizeof(uintptr_t) + sizeof(unsigned long long); break; case 'E': trace_end(trace_buf + trace_index); trace_index += sizeof(unsigned long long); trace_ended = 1; assert_set_errno(ENOTSUP, trace_bufsize == trace_index, "END not at end"); break; default: assert_set_errno(ENOTSUP, 0, "sign switch"); break; } } if (!trace_ended) assert_set_errno(ENOTSUP, 0, "no END at end"); free(trace_buf); fclose(trace); return 0; }