📄 erl_memory.c
字号:
if (cpix == state->trace_info.segment_ix) strings[i++] = "segment"; else strings[i++] = state->trace_info.allocator[cpix]->name; } strings[i] = NULL; size += write_strings(pp,strings,crr_prv_str,line_prefix,max_line_size); i = 0; for (j = 0; j <= state->trace_info.max_block_type_ix; j++) if (state->trace_info.block_type[j]->allocator == aix) strings[i++] = state->trace_info.block_type[j]->name; strings[i] = NULL; size += write_strings(pp,strings,blk_tp_str,line_prefix,max_line_size); } (*state->free)((void *) strings); return size;}static voidprint_main_header(em_state *state){#if HAVE_INT_64#define MAX_WORD_SZ_STR "64"#else#define MAX_WORD_SZ_STR "32"#endif em_area area = {NULL, 0}; char *format1 = "> emem version: " EMEM_VSN_STR "\n" "> Nodename: %s\n" "> Hostname: %s\n" "> Pid: %s\n" "> Start time (UTC): "; char *format2 = "%4.4" USGND_INT_32_FSTR "-%2.2" USGND_INT_32_FSTR "-%2.2" USGND_INT_32_FSTR " %2.2" USGND_INT_32_FSTR ":%2.2" USGND_INT_32_FSTR ":%2.2" USGND_INT_32_FSTR ".%6.6" USGND_INT_32_FSTR "\n"; char *format3 = "> Trace parser version: %" USGND_INT_32_FSTR ".%" USGND_INT_32_FSTR "\n" "> Actual trace version: %" USGND_INT_32_FSTR ".%" USGND_INT_32_FSTR "\n" "> Maximum trace word size: " MAX_WORD_SZ_STR " bits\n" "> Actual trace word size: %d bits\n"; size_t size = (strlen(format1) + (state->trace_info.start_time.month ? (strlen(format2) + 7*10) : 1) + strlen(format3) + strlen(state->trace_info.nodename) + strlen(state->trace_info.hostname) + strlen(state->trace_info.pid) + 5*10 + 1); if (state->output.verbose) { size += write_allocator_info(state, NULL); } size += write_header(state, NULL, 0); /* Get area */ get_next_write_area(&area, state, &state->output.queue, size); area.size = sprintf(area.ptr, format1, state->trace_info.nodename, state->trace_info.hostname, state->trace_info.pid); if (state->trace_info.start_time.month) area.size += sprintf(area.ptr + area.size, format2, state->trace_info.start_time.year, state->trace_info.start_time.month, state->trace_info.start_time.day, state->trace_info.start_time.hour, state->trace_info.start_time.minute, state->trace_info.start_time.second, state->trace_info.start_time.micro_second); else *(area.ptr + area.size++) = '\n'; area.size += sprintf(area.ptr + area.size, format3, state->trace_info.version.parser.major, state->trace_info.version.parser.minor, state->trace_info.version.trace.major, state->trace_info.version.trace.minor, state->trace_info.bits); if (state->output.verbose) { area.size += write_allocator_info(state, area.ptr + area.size); } area.size += write_header(state, area.ptr + area.size, 0); /* Leave area */ wrote_area(&area, state, &state->output.queue);#undef MAX_WORD_SZ_STR}static voidprint_main_footer(em_state *state){ em_area area = {NULL, 0}; usgnd_int_8 *p; int i; char *stop_str = "> Trace stopped\n"; char *exit_str = "> Emulator exited with code: %" USGND_INT_32_FSTR "\n"; char *format = "> Total trace size: %" USGND_INT_MAX_FSTR " bytes\n" "> Average band width used: %" USGND_INT_MAX_FSTR " Kbit/s\n"; size_t size; usgnd_int_max tsz = state->input.total_trace_size; usgnd_int_32 secs = state->info.stop_time.secs; usgnd_int_32 usecs = state->info.stop_time.usecs; usgnd_int_max bw; /* Max size of the max value line. Each value can at most use 21 characters: largest possible usgnd_int_64 (20 digits) and one white space. */ size = state->output.values_per_line*21 + 1; switch (state->info.stop_reason) { case EMTP_STOP: size += strlen(stop_str) + 1; break; case EMTP_EXIT: size += strlen(exit_str); size += 10; /* Enough for one unsgn_int_32 */ size++; break; default: break; } size += strlen(format); size += 2*20; /* Enough for two unsgn_int_64 */ size += 2; bw = (tsz + 1023)/1024; bw *= 1000; bw /= secs*1000 + usecs/1000; bw *= 8; /* Get area */ get_next_write_area(&area, state, &state->output.queue, size); p = area.ptr; p += sprintf(p, "> %-*s", EM_TIME_FIELD_WIDTH - 2, "Maximum:"); if (state->output.total) { int six = state->trace_info.segment_ix; write_max_ever_mem_info(state, &p, &state->info.total); if (state->trace_info.have_segment_carrier_info) { if (state->info.allctr_prv_crr[six]) write_max_ever_mem_info(state, &p, state->info.allctr_prv_crr[six]); if (state->info.allctr_usd_crr[six]) write_max_ever_mem_info(state, &p, state->info.allctr_usd_crr[six]); } } for (i = 0; i < state->output.no_allctrs; i++) { int ix = state->output.allctrs[i].ix; write_max_ever_mem_info(state, &p, &state->info.allctr[ix]); if (state->info.allctr_prv_crr[ix]) write_max_ever_mem_info(state, &p, state->info.allctr_prv_crr[ix]); if (state->info.allctr_usd_crr[ix]) write_max_ever_mem_info(state, &p, state->info.allctr_usd_crr[ix]); } for (i = 0; i < state->output.no_btypes; i++) write_max_ever_mem_info(state, &p, &state->info.btype[state->output.btypes[i].ix]); p += sprintf(p, "\n"); switch (state->info.stop_reason) { case EMTP_STOP: p += sprintf(p, stop_str); break; case EMTP_EXIT: p += sprintf(p, exit_str, state->info.exit_status); break; default: break; } p += sprintf(p, format, tsz, bw); area.size = p - area.ptr; ASSERT(area.size <= size); /* Leave area */ wrote_area(&area, state, &state->output.queue);}static voidprint_info(em_state *state, usgnd_int_32 secs, char *extra){ usgnd_int_8 *p; int i; size_t size; em_area area = {NULL, 0}; /* Get area */ size = 0; if (!state->output.lines_until_header) size += state->output.header_size; /* Max size of one line of values. Each value can at most use 21 characters: largest possible usgnd_int_64 (20 digits) and one white space. */ size += state->output.values_per_line*21 + 1; if (extra) size += write_str(NULL, extra); get_next_write_area(&area, state, &state->output.queue, size); /* Write to area */ p = area.ptr; if (!state->output.lines_until_header) { memcpy((void *) area.ptr, (void *) state->output.header, state->output.header_size); p += state->output.header_size; state->output.lines_until_header = EM_LINES_UNTIL_HEADER; } else state->output.lines_until_header--; p += sprintf(p, "%*" USGND_INT_32_FSTR " ", EM_TIME_FIELD_WIDTH - 1, secs); if (state->output.total) { int six = state->trace_info.segment_ix; write_mem_info(state, &p, &state->info.total); if (state->trace_info.have_segment_carrier_info) { if (state->info.allctr_prv_crr[six]) write_mem_info(state, &p, state->info.allctr_prv_crr[six]); if (state->info.allctr_usd_crr[six]) write_mem_info(state, &p, state->info.allctr_usd_crr[six]); } } for (i = 0; i < state->output.no_allctrs; i++) { int ix = state->output.allctrs[i].ix; write_mem_info(state, &p, &state->info.allctr[ix]); if (state->info.allctr_prv_crr[ix]) write_mem_info(state, &p, state->info.allctr_prv_crr[ix]); if (state->info.allctr_usd_crr[ix]) write_mem_info(state, &p, state->info.allctr_usd_crr[ix]); } for (i = 0; i < state->output.no_btypes; i++) write_mem_info(state, &p, &state->info.btype[state->output.btypes[i].ix]); p += sprintf(p, "\n"); if (extra) p += write_str(&p, extra); ASSERT(area.size >= p - area.ptr); area.size = p - area.ptr; /* Leave area */ wrote_area(&area, state, &state->output.queue);}static voidreset_mem_info(em_mem_info *mi){ mi->size = 0; mi->min_size = 0; mi->max_size = 0; mi->max_ever_size = 0; mi->no = 0; mi->min_no = 0; mi->max_no = 0; mi->max_ever_no = 0; mi->allocs = 0; mi->reallocs = 0; mi->frees = 0;}/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ * State creation and destruction * * *\* */static voiddestroy_state(em_state *state){ int i; void (*freep)(void *); freep = state->free; if (state->block_table) emtbt_destroy_table(state->block_table); if (state->carrier_table) { for (i = -1; i <= state->trace_info.max_allocator_ix; i++) if (state->carrier_table[i]) emtbt_destroy_table(state->carrier_table[i]); state->carrier_table--; (*freep)((void *) state->carrier_table); } if (state->info.btype) { state->info.btype--; (*freep)((void *) state->info.btype); } if (state->info.allctr) { state->info.allctr--; (*freep)((void *) state->info.allctr); } if (state->info.allctr_prv_crr) { for (i = -1; i <= state->trace_info.max_allocator_ix; i++) if (state->info.allctr_prv_crr[i]) (*freep)((void *) state->info.allctr_prv_crr[i]); state->info.allctr_prv_crr--; (*freep)((void *) state->info.allctr_prv_crr); } if (state->info.allctr_usd_crr) { for (i = -1; i <= state->trace_info.max_allocator_ix; i++) if (state->info.allctr_usd_crr[i]) (*freep)((void *) state->info.allctr_usd_crr[i]); state->info.allctr_usd_crr--; (*freep)((void *) state->info.allctr_usd_crr); } emtp_state_destroy(state->trace_state); destroy_queue(state, &state->input.queue); if (state->output.btypes) (*freep)((void *) state->output.btypes); if (state->output.allctrs) (*freep)((void *) state->output.allctrs); destroy_queue(state, &state->output.queue);#if EMEM_d_SWITCH if (state->output.go.mutex) { mutex_destroy(state->output.go.mutex); (*state->free)((void *) state->output.go.mutex); state->output.go.mutex = NULL; } if (state->output.go.cond) { cond_destroy(state->output.go.cond); (*state->free)((void *) state->output.go.cond); state->output.go.cond = NULL; }#endif if (!IS_INVALID_SOCKET(state->input.socket)) { closesocket(state->input.socket); state->input.socket = INVALID_SOCKET; } (*freep)((void *) state);}static em_state *new_state(void * (*alloc)(size_t), void * (*realloc)(void *, size_t), void (*free)(void *)){ em_state *state = NULL; state = (*alloc)(sizeof(em_state)); if (!state) goto error; /* Stuff that might fail (used after the error label) */ state->trace_state = NULL; /* Init state ... */ state->alloc = alloc; state->realloc = realloc; state->free = free; state->block_table = NULL; state->carrier_table = NULL; reset_mem_info(&state->info.total); state->info.btype = NULL; state->info.allctr = NULL; state->info.allctr_prv_crr = NULL; state->info.allctr_usd_crr = NULL; state->info.stop_time.secs = 0; state->info.stop_time.usecs = 0; state->info.stop_reason = EMTP_UNDEF; state->info.exit_status = 0; state->output.next_print = 0; state->output.next_print_inc = 10; state->output.header = NULL; state->output.header_size = 0; state->output.values_per_object = 0; state->output.values_per_line = 0; state->output.field_width = 11; state->output.verbose = 0; state->output.total = 0; state->output.all_allctrs = 0; state->output.no_allctrs = 0; state->output.allctrs = NULL; state->output.all_btypes = 0; state->output.no_btypes = 0; state->output.btypes = NULL; state->output.max_min_values = 0; state->output.block_counts = 0; state->output.op_counts = 0; state->output.lines_until_header = EM_LINES_UNTIL_HEADER;#if PRINT_OPERATIONS state->output.stream = stderr;#else state->output.stream = stdout;#endif state->output.file_name = NULL;#if EMEM_d_SWITCH state->output.dir_name = NULL; state->output.erl_cmd_file = NULL; state->output.go.mutex = NULL; state->output.go.cond = NULL;#endif init_queue(state, &state->output.queue); state->output.queue.max_buf_size = 10*1024*1024; state->output.queue.name = "output"; state->trace_state = emtp_state_new(alloc, realloc, free); if (!state->trace_state) goto error; state->trace_info.version.parser.major = 0; state->trace_info.version.parser.minor = 0; state->trace_info.version.trace.major = 0; state->trace_info.version.trace.minor = 0; state->trace_info.bits = 0; state->trace_info.max_allocator_ix = 0; state->trace_info.allocator = NULL; state->trace_info.max_block_type_ix = 0; state->trace_info.block_type = NULL; state->input.listen_port = 0; state->input.socket = INVALID_SOCKET; state->input.total_trace_size = 0; state->input.error = 0; state->input.error_descr = NULL; init_queue(state, &state->input.queue); state->input.queue.max_buf_size = 10*1024*1024; state->input.queue.name = "input"; return state; error: if (state) { if (state->trace_state) emtp_state_destroy(state->trace_state); (*free)(state); } return NULL;}static emtbt_table *mk_block_table(em_state *state){ return emtbt_new_table(state->trace_info.bits == 64, state->alloc, state->realloc, state->free);}/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\ * * * *\* */#if PRINT_OPERATIONSvoid print_op(em_state *state, emtp_operation *op);#endifstatic INLINE voidupdate_max_values(em_mem_info *mi){ if (mi->max_size < mi->size) mi->max_size = mi->size; if (mi->max_no < mi->no) mi->max_no = mi->no;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -