⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 erl_memory.c

📁 OTP是开放电信平台的简称
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -