35 while (page !=
nullptr) {
41 if (ctx->
next !=
nullptr) {
44 if (ctx->
prev !=
nullptr) {
67 clock_gettime(CLOCK_REALTIME, &ts);
68 event->timestamp.sec = ts.tv_sec;
69 event->timestamp.nsec = ts.tv_nsec;
109 if (ctx ==
nullptr) {
120 char real_filename[2048];
121 snprintf(real_filename, 2048,
"%s.%lu.hperf.json", filename, ctx->unique_id);
122 FILE *f = fopen(real_filename,
"w");
128 R
"({"filetype": "hperf-report", "version": 1, "unique-id": %lu, "num-events": %lu, "events": [)",
133 for (
HPerfPage *p = c->pages; p !=
nullptr; p = p->next) {
134 for (
size_t i = 0; i < p->num_events; i++) {
135 auto event = &p->data[i];
141 switch (event->type) {
146 R
"({"type": "func-enter", "timestamp": {"sec": %llu, "nsec": %llu}, "func-name": "%s"})",
147 event->timestamp.sec,
148 event->timestamp.nsec,
156 R
"({"type": "func-leave", "timestamp": {"sec": %llu, "nsec": %llu}, "func-name": "%s"})",
157 event->timestamp.sec,
158 event->timestamp.nsec,
166 R
"({"type": "mem-alloc", "timestamp": {"sec": %llu, "nsec": %llu}, "ptr": %zu, "size": %lu})",
167 event->timestamp.sec,
168 event->timestamp.nsec,
176 R
"({"type": "mem-free", "timestamp": {"sec": %llu, "nsec": %llu}, "ptr": %zu})",
177 event->timestamp.sec,
178 event->timestamp.nsec,
179 (size_t)(data->ptr));
193 while (ctx !=
nullptr) {
HPerfContext * hperf_context_create(size_t unique_id)
HPerfContext * hperf_context_get(size_t unique_id)
void hperf_context_finalize(HPerfContext *ctx)
char hperf_report_filename[2048]
void hperf_report_func_leave(const char *func_name)
HPerfContext * hperf_contexts
void hperf_report_mem_free(void *ptr)
void hperf_write_report(const char *filename)
HPerfEvent * hperf_context_add_event(HPerfContext *ctx)
void hperf_init(const char *filename)
void hperf_report_mem_alloc(void *ptr, size_t size)
void hperf_report_func_enter(const char *func_name)
uint64_t runtime_get_thread_id()