diff options
author | John van Groningen | 2003-10-03 15:05:36 +0000 |
---|---|---|
committer | John van Groningen | 2003-10-03 15:05:36 +0000 |
commit | 4350954199fb8c74ff01d65cc2051c8d1e60ff3f (patch) | |
tree | b46c4c43a11cbb53487dd6622aae2509df8fde74 /uwrite_heap.c | |
parent | add makefiles for linux (diff) |
add files for linux
Diffstat (limited to 'uwrite_heap.c')
-rw-r--r-- | uwrite_heap.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/uwrite_heap.c b/uwrite_heap.c new file mode 100644 index 0000000..9055515 --- /dev/null +++ b/uwrite_heap.c @@ -0,0 +1,109 @@ + +#include <stdio.h> + +struct heap_info { + int *heap1_begin; + int *heap1_end; + int *heap2_begin; + int *heap2_end; + int *stack_begin; + int *stack_end; + int *text_begin; + int *data_begin; + int *small_integers; + int *characters; + int int_descriptor; + int char_descriptor; + int real_descriptor; + int bool_descriptor; + int string_descriptor; + int array_descriptor; +}; + +static int heap_written_count=0; + +#define MAX_N_HEAPS 10 + +#define MAX_PATH_LENGTH 256 + +void write_heap (struct heap_info *h) +{ + static char heap_profile_file_name_suffix[]=" Heap Profile0.hcl"; + char heap_profile_file_name[MAX_PATH_LENGTH+1]; + FILE *heap_file; + int length_application_name,file_ok; + + if (heap_written_count >= MAX_N_HEAPS) + return; + + length_application_name=readlink ("/proc/self/exe",heap_profile_file_name,MAX_PATH_LENGTH); + if (length_application_name>=0){ + int length_file_name,size_heap_profile_file_name_suffix; + + heap_profile_file_name[length_application_name]='\0'; + + size_heap_profile_file_name_suffix=sizeof (heap_profile_file_name_suffix); + length_file_name=0; + while (heap_profile_file_name[length_file_name]!='\0') + ++length_file_name; + + if (length_file_name+size_heap_profile_file_name_suffix>MAX_PATH_LENGTH){ + ++heap_written_count; + ew_print_string( "Heap file could not be created because the file name is too long.\n" ); + return; + } + + strcat (&heap_profile_file_name[length_file_name],heap_profile_file_name_suffix); + + heap_profile_file_name[length_file_name+size_heap_profile_file_name_suffix-6]='0'+heap_written_count; + } else { + ++heap_written_count; + ew_print_string( "Heap file could not be created because /proc/self/exe could not be read\n"); + return; + } + + ++heap_written_count; + + heap_file = fopen (heap_profile_file_name,"w"); + if (heap_file==NULL){ + heap_written_count = MAX_N_HEAPS; + + ew_print_string ("Heap file '"); + ew_print_string (heap_profile_file_name); + ew_print_string ("' could not be created.\n"); + + return; + } + + /* save application name */ + file_ok = fwrite (&length_application_name,sizeof (int),1,heap_file)==1; + if (file_ok) + file_ok = fwrite (heap_profile_file_name,1,length_application_name,heap_file)==length_application_name; + + /* write heap_info-structure */ + if (file_ok) + file_ok = fwrite (h,sizeof (struct heap_info),1,heap_file)==1; + + /* write stack */ + if (file_ok) + file_ok = fwrite (h->stack_begin,(int)(h->stack_end) - (int)(h->stack_begin),1,heap_file)==1; + + /* write heap1 */ + if (file_ok) + file_ok = fwrite (h->heap1_begin,(int)(h->heap1_end) - (int)(h->heap1_begin),1,heap_file)==1; + + /* write heap2 */ + if (file_ok) + file_ok = fwrite (h->heap2_begin,(int)(h->heap2_end) - (int)(h->heap2_begin),1,heap_file)==1; + + if (!file_ok){ + heap_written_count = MAX_N_HEAPS; + + ew_print_string ("Heap file '"); + ew_print_string (heap_profile_file_name); + ew_print_string ("' could not be written.\n"); + } + + fclose (heap_file); +} + |