void XRaySymbolPoolFree(struct XRaySymbolPool* pool) { struct XRaySymbolPoolNode* n = pool->head; while (NULL != n) { struct XRaySymbolPoolNode* c = n; n = n->next; XRayFree(c); } XRayFree(pool); }
/* Frees a symbol table. */ void XRaySymbolTableFree(struct XRaySymbolTable* symtab) { XRayStringPoolFree(symtab->string_pool); XRaySymbolPoolFree(symtab->symbol_pool); XRayHashTableFree(symtab->hash_table); symtab->num_symbols = 0; XRayFree(symtab); }
/* re-inserts all the elements into the new table */ void XRayHashTableGrow(struct XRayHashTable *table) { struct XRayHashTableEntry *old_array = table->array; int old_size = table->size; int new_size = old_size * 2; int i; printf("XRay: Growing a hash table...\n"); XRayHashTableInit(table, new_size); for (i = 0; i < old_size; ++i) { void *data = old_array[i].data; if (NULL != data) { uint32_t key = old_array[i].key; XRayHashTableInsert(table, data, key); } } XRayFree(old_array); }
void XRayBrowserTraceReport(struct XRayTraceCapture* capture) { const void* cat_enabled = ppb_trace_event_interface->GetCategoryEnabled( "xray"); struct XRaySymbolTable* symbols = XRayGetSymbolTable(capture); int32_t thread_id = XRayGetSavedThreadID(capture); int head = XRayFrameGetHead(capture); int frame = XRayFrameGetTail(capture); while(frame != head) { struct XRayTimestampPair start_time = XRayFrameGetStartTimestampPair( capture, frame); struct XRayTimestampPair end_time = XRayFrameGetEndTimestampPair( capture, frame); double pdiff = (end_time.pepper - start_time.pepper); double odiff = (end_time.xray - start_time.xray); double scale_a = pdiff / odiff; double scale_b = ((double)end_time.pepper) - (scale_a * end_time.xray); printf("Xray timestamp calibration frame %d: %f %f\n", frame, scale_a, scale_b); int start = XRayFrameGetTraceStartIndex(capture, frame); int end = XRayFrameGetTraceEndIndex(capture, frame); struct XRayTraceBufferEntry** stack_base = XRayMalloc( sizeof(struct XRayTraceBufferEntry*) * (XRAY_TRACE_STACK_SIZE + 1)); struct XRayTraceBufferEntry** stack_top = stack_base; *stack_top = NULL; uint32_t num_args = 0; const char* arg_names[] = {"annotation"}; uint8_t arg_types[] = {TRACE_VALUE_TYPE_COPY_STRING}; uint64_t arg_values[] = {0}; char annotation[XRAY_TRACE_ANNOTATION_LENGTH]; int i; for(i = start; i != end; i = XRayTraceNextEntry(capture, i)) { if (XRayTraceIsAnnotation(capture, i)) { continue; } uint32_t depth = XRAY_EXTRACT_DEPTH( XRayTraceGetEntry(capture, i)->depth_addr); while(*stack_top && XRAY_EXTRACT_DEPTH((*stack_top)->depth_addr) >= depth) { struct XRayTraceBufferEntry* e = *(stack_top--); ppb_trace_event_interface->AddTraceEventWithThreadIdAndTimestamp( 'E', cat_enabled, XRayGetName(symbols, e), 0, thread_id, (scale_a * e->end_tick) + scale_b, 0, NULL, NULL, NULL, 0 ); } num_args = 0; struct XRayTraceBufferEntry* e = XRayTraceGetEntry(capture, i); uint32_t annotation_index = e->annotation_index; if (annotation_index) { XRayTraceCopyToString(capture, annotation_index, annotation); union TraceValue val; val.as_string = (const char*)annotation; arg_values[0] = val.as_uint; num_args = 1; } ppb_trace_event_interface->AddTraceEventWithThreadIdAndTimestamp( 'B', cat_enabled, XRayGetName(symbols, e), 0, thread_id, (scale_a * e->start_tick) + scale_b, num_args, arg_names, arg_types, arg_values, 0 ); *(++stack_top) = e; } while(*stack_top) { struct XRayTraceBufferEntry* e = *(stack_top--); ppb_trace_event_interface->AddTraceEventWithThreadIdAndTimestamp( 'E', cat_enabled, XRayGetName(symbols, e), 0, thread_id, (scale_a * e->end_tick) + scale_b, 0, NULL, NULL, NULL, 0 ); } frame = XRayFrameGetNext(capture, frame); XRayFree(stack_base); } }