hprof_io.c
来自「一个小公司要求给写的很简单的任务管理系统。」· C语言 代码 · 共 1,979 行 · 第 1/4 页
C
1,979 行
/* Send out segment (up to last tag written out) */ dump_heap_segment_and_reset(gdata->heap_last_tag_position); /* Get new current position */ pos = gdata->heap_write_count + (jlong)gdata->heap_buffer_index; } } /* Save position of this tag */ gdata->heap_last_tag_position = pos; /* Write out this tag */ heap_u1(tag);}static voidheap_id(HprofId i){ heap_u4(i);}static voidheap_index_id(HprofId index){ heap_id(index);}static voidheap_name(char *name){ heap_index_id(get_name_index(name));}static void heap_printf(char *fmt, ...){ char buf[1024]; va_list args; va_start(args, fmt); (void)md_vsnprintf(buf, sizeof(buf), fmt, args); buf[sizeof(buf)-1] = 0; heap_raw(buf, (int)strlen(buf)); va_end(args);}static voidheap_element(HprofType kind, jint size, jvalue value){ if ( !HPROF_TYPE_IS_PRIMITIVE(kind) ) { HPROF_ASSERT(size==4); heap_id((HprofId)value.i); } else { switch ( size ) { case 8: HPROF_ASSERT(size==8); HPROF_ASSERT(kind==HPROF_LONG || kind==HPROF_DOUBLE); heap_u8(value.j); break; case 4: HPROF_ASSERT(size==4); HPROF_ASSERT(kind==HPROF_INT || kind==HPROF_FLOAT); heap_u4(value.i); break; case 2: HPROF_ASSERT(size==2); HPROF_ASSERT(kind==HPROF_SHORT || kind==HPROF_CHAR); heap_u2(value.s); break; case 1: HPROF_ASSERT(size==1); HPROF_ASSERT(kind==HPROF_BOOLEAN || kind==HPROF_BYTE); HPROF_ASSERT(kind==HPROF_BOOLEAN?(value.b==0 || value.b==1):1); heap_u1(value.b); break; default: HPROF_ASSERT(0); break; } }}/* Dump out all elements of an array, objects in jvalues, prims packed */static voidheap_elements(HprofType kind, jint num_elements, jint elem_size, void *elements){ int i; jvalue val; static jvalue empty_val; if ( num_elements == 0 ) { return; } switch ( kind ) { case 0: case HPROF_ARRAY_OBJECT: case HPROF_NORMAL_OBJECT: for (i = 0; i < num_elements; i++) { val = empty_val; val.i = ((ObjectIndex*)elements)[i]; heap_element(kind, elem_size, val); } break; case HPROF_BYTE: case HPROF_BOOLEAN: HPROF_ASSERT(elem_size==1); for (i = 0; i < num_elements; i++) { val = empty_val; val.b = ((jboolean*)elements)[i]; heap_element(kind, elem_size, val); } break; case HPROF_CHAR: case HPROF_SHORT: HPROF_ASSERT(elem_size==2); for (i = 0; i < num_elements; i++) { val = empty_val; val.s = ((jshort*)elements)[i]; heap_element(kind, elem_size, val); } break; case HPROF_FLOAT: case HPROF_INT: HPROF_ASSERT(elem_size==4); for (i = 0; i < num_elements; i++) { val = empty_val; val.i = ((jint*)elements)[i]; heap_element(kind, elem_size, val); } break; case HPROF_DOUBLE: case HPROF_LONG: HPROF_ASSERT(elem_size==8); for (i = 0; i < num_elements; i++) { val = empty_val; val.j = ((jlong*)elements)[i]; heap_element(kind, elem_size, val); } break; }}/* ------------------------------------------------------------------ */void io_flush(void){ HPROF_ASSERT(gdata->header!=NULL); write_flush();}void io_setup(void){ gdata->write_buffer_size = FILE_IO_BUFFER_SIZE; gdata->write_buffer = HPROF_MALLOC(gdata->write_buffer_size); gdata->write_buffer_index = 0; gdata->heap_write_count = (jlong)0; gdata->heap_last_tag_position = (jlong)0; gdata->heap_buffer_size = FILE_IO_BUFFER_SIZE; gdata->heap_buffer = HPROF_MALLOC(gdata->heap_buffer_size); gdata->heap_buffer_index = 0; if ( gdata->logflags & LOG_CHECK_BINARY ) { gdata->check_buffer_size = FILE_IO_BUFFER_SIZE; gdata->check_buffer = HPROF_MALLOC(gdata->check_buffer_size); gdata->check_buffer_index = 0; } ioname_init();}void io_cleanup(void){ if ( gdata->write_buffer != NULL ) { HPROF_FREE(gdata->write_buffer); } gdata->write_buffer_size = 0; gdata->write_buffer = NULL; gdata->write_buffer_index = 0; if ( gdata->heap_buffer != NULL ) { HPROF_FREE(gdata->heap_buffer); } gdata->heap_write_count = (jlong)0; gdata->heap_last_tag_position = (jlong)0; gdata->heap_buffer_size = 0; gdata->heap_buffer = NULL; gdata->heap_buffer_index = 0; if ( gdata->logflags & LOG_CHECK_BINARY ) { if ( gdata->check_buffer != NULL ) { HPROF_FREE(gdata->check_buffer); } gdata->check_buffer_size = 0; gdata->check_buffer = NULL; gdata->check_buffer_index = 0; } ioname_cleanup();}voidio_write_file_header(void){ HPROF_ASSERT(gdata->header!=NULL); if (gdata->output_format == 'b') { jint settings; jlong t; settings = 0; if (gdata->heap_dump || gdata->alloc_sites) { settings |= 1; } if (gdata->cpu_sampling) { settings |= 2; } t = md_get_timemillis(); write_raw(gdata->header, (int)strlen(gdata->header) + 1); write_u4((jint)sizeof(HprofId)); write_u8(t); write_header(HPROF_CONTROL_SETTINGS, 4 + 2); write_u4(settings); write_u2((unsigned short)gdata->max_trace_depth); } else if ((!gdata->cpu_timing) || (!gdata->old_timing_format)) { /* We don't want the prelude file for the old prof output format */ time_t t; char prelude_file[FILENAME_MAX]; int prelude_fd; int nbytes; t = time(0); md_get_prelude_path(prelude_file, sizeof(prelude_file), PRELUDE_FILE); prelude_fd = md_open(prelude_file); if (prelude_fd < 0) { char buf[FILENAME_MAX+80]; (void)md_snprintf(buf, sizeof(buf), "Can't open %s", prelude_file); buf[sizeof(buf)-1] = 0; HPROF_ERROR(JNI_TRUE, buf); } write_printf("%s, created %s\n", gdata->header, ctime(&t)); do { char buf[1024]; /* File is small, small buffer ok here */ nbytes = md_read(prelude_fd, buf, sizeof(buf)); if ( nbytes < 0 ) { system_error("read", nbytes, errno); break; } if (nbytes == 0) { break; } write_raw(buf, nbytes); } while ( nbytes > 0 ); md_close(prelude_fd); write_printf("\n--------\n\n"); write_flush(); }}voidio_write_file_footer(void){ HPROF_ASSERT(gdata->header!=NULL);}voidio_write_class_load(SerialNumber class_serial_num, ObjectIndex index, SerialNumber trace_serial_num, char *sig){ CHECK_CLASS_SERIAL_NO(class_serial_num); CHECK_TRACE_SERIAL_NO(trace_serial_num); if (gdata->output_format == 'b') { IoNameIndex name_index; char *class_name; class_name = signature_to_name(sig); name_index = write_name_first(class_name); write_header(HPROF_LOAD_CLASS, (2 * (jint)sizeof(HprofId)) + (4 * 2)); write_u4(class_serial_num); write_index_id(index); write_u4(trace_serial_num); write_index_id(name_index); HPROF_FREE(class_name); }}voidio_write_class_unload(SerialNumber class_serial_num, ObjectIndex index){ CHECK_CLASS_SERIAL_NO(class_serial_num); if (gdata->output_format == 'b') { write_header(HPROF_UNLOAD_CLASS, 4); write_u4(class_serial_num); }}voidio_write_sites_header(const char * comment_str, jint flags, double cutoff, jint total_live_bytes, jint total_live_instances, jlong total_alloced_bytes, jlong total_alloced_instances, jint count){ if ( gdata->output_format == 'b') { write_header(HPROF_ALLOC_SITES, 2 + (8 * 4) + (count * (4 * 6 + 1))); write_u2((unsigned short)flags); write_u4(*(int *)(&cutoff)); write_u4(total_live_bytes); write_u4(total_live_instances); write_u8(total_alloced_bytes); write_u8(total_alloced_instances); write_u4(count); } else { time_t t; t = time(0); write_printf("SITES BEGIN (ordered by %s) %s", comment_str, ctime(&t)); write_printf( " percent live alloc'ed stack class\n"); write_printf( " rank self accum bytes objs bytes objs trace name\n"); }}voidio_write_sites_elem(jint index, double ratio, double accum_percent, char *sig, SerialNumber class_serial_num, SerialNumber trace_serial_num, jint n_live_bytes, jint n_live_instances, jint n_alloced_bytes, jint n_alloced_instances){ CHECK_CLASS_SERIAL_NO(class_serial_num); CHECK_TRACE_SERIAL_NO(trace_serial_num); if ( gdata->output_format == 'b') { HprofType kind; jint size; type_array(sig, &kind, &size); write_u1(kind); write_u4(class_serial_num); write_u4(trace_serial_num); write_u4(n_live_bytes); write_u4(n_live_instances); write_u4(n_alloced_bytes); write_u4(n_alloced_instances); } else { char *class_name; class_name = signature_to_name(sig); write_printf("%5u %5.2f%% %5.2f%% %9u %4u %9u %5u %5u %s\n", index, ratio * 100.0, accum_percent * 100.0, n_live_bytes, n_live_instances, n_alloced_bytes, n_alloced_instances, trace_serial_num, class_name); HPROF_FREE(class_name); }}voidio_write_sites_footer(void){ if (gdata->output_format == 'b') { not_implemented(); } else { write_printf("SITES END\n"); }}voidio_write_thread_start(SerialNumber thread_serial_num, ObjectIndex thread_obj_id, SerialNumber trace_serial_num, char *thread_name, char *thread_group_name, char *thread_parent_name){ CHECK_THREAD_SERIAL_NO(thread_serial_num); CHECK_TRACE_SERIAL_NO(trace_serial_num); if (gdata->output_format == 'b') { IoNameIndex tname_index; IoNameIndex gname_index; IoNameIndex pname_index; tname_index = write_name_first(thread_name); gname_index = write_name_first(thread_group_name); pname_index = write_name_first(thread_parent_name); write_header(HPROF_START_THREAD, ((jint)sizeof(HprofId) * 4) + (4 * 2)); write_u4(thread_serial_num); write_index_id(thread_obj_id); write_u4(trace_serial_num); write_index_id(tname_index); write_index_id(gname_index); write_index_id(pname_index); } else if ( (!gdata->cpu_timing) || (!gdata->old_timing_format)) { /* We don't want thread info for the old prof output format */ write_printf("THREAD START " "(obj=%x, id = %d, name=\"%s\", group=\"%s\")\n", thread_obj_id, thread_serial_num, (thread_name==NULL?"":thread_name), (thread_group_name==NULL?"":thread_group_name)); }}voidio_write_thread_end(SerialNumber thread_serial_num){ CHECK_THREAD_SERIAL_NO(thread_serial_num); if (gdata->output_format == 'b') { write_header(HPROF_END_THREAD, 4); write_u4(thread_serial_num); } else if ( (!gdata->cpu_timing) || (!gdata->old_timing_format)) { /* we don't want thread info for the old prof output format */ write_printf("THREAD END (id = %d)\n", thread_serial_num); }}voidio_write_frame(FrameIndex index, SerialNumber frame_serial_num, char *mname, char *msig, char *sname, SerialNumber class_serial_num, jint lineno){ CHECK_CLASS_SERIAL_NO(class_serial_num); if (gdata->output_format == 'b') { IoNameIndex mname_index; IoNameIndex msig_index; IoNameIndex sname_index; mname_index = write_name_first(mname); msig_index = write_name_first(msig); sname_index = write_name_first(sname); write_header(HPROF_FRAME, ((jint)sizeof(HprofId) * 4) + (4 * 2)); write_index_id(index); write_index_id(mname_index); write_index_id(msig_index); write_index_id(sname_index); write_u4(class_serial_num); write_u4(lineno); }}voidio_write_trace_header(SerialNumber trace_serial_num, SerialNumber thread_serial_num, jint n_frames, char *phase_str){ CHECK_TRACE_SERIAL_NO(trace_serial_num); if (gdata->output_format == 'b') { write_header(HPROF_TRACE, ((jint)sizeof(HprofId) * n_frames) + (4 * 3)); write_u4(trace_serial_num); write_u4(thread_serial_num); write_u4(n_frames); } else { write_printf("TRACE %u:", trace_serial_num); if (thread_serial_num) { write_printf(" (thread=%d)", thread_serial_num); } if ( phase_str != NULL ) { write_printf(" (from %s phase of JVM)", phase_str); } write_printf("\n"); if (n_frames == 0) { write_printf("\t<empty>\n"); } }}voidio_write_trace_elem(SerialNumber trace_serial_num, FrameIndex frame_index, SerialNumber frame_serial_num, char *csig, char *mname, char *sname, jint lineno){ if (gdata->output_format == 'b') { write_index_id(frame_index); } else { char *class_name; char linebuf[32]; if (lineno == -2) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?