Mercurial > hg > xemacs-beta
annotate src/sheap.c @ 5167:e374ea766cc1
clean up, rearrange allocation statistics code
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-03-21 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (assert_proper_sizing):
* alloc.c (c_readonly):
* alloc.c (malloced_storage_size):
* alloc.c (fixed_type_block_overhead):
* alloc.c (lisp_object_storage_size):
* alloc.c (inc_lrecord_stats):
* alloc.c (dec_lrecord_stats):
* alloc.c (pluralize_word):
* alloc.c (object_memory_usage_stats):
* alloc.c (Fobject_memory_usage):
* alloc.c (compute_memusage_stats_length):
* alloc.c (disksave_object_finalization_1):
* alloc.c (Fgarbage_collect):
* mc-alloc.c:
* mc-alloc.c (mc_alloced_storage_size):
* mc-alloc.h:
No functionality change here. Collect the allocations-statistics
code that was scattered throughout alloc.c into one place. Add
remaining section headings so that all sections have headings
clearly identifying the start of the section and its purpose.
Expose mc_alloced_storage_size() even when not MEMORY_USAGE_STATS;
this fixes build problems and is related to the export of
lisp_object_storage_size() and malloced_storage_size() when
non-MEMORY_USAGE_STATS in the previous change set.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Sun, 21 Mar 2010 04:41:49 -0500 |
parents | 19a72041c5ed |
children | 308d34e9f07d |
rev | line source |
---|---|
428 | 1 /* Static Heap management routines for XEmacs. |
2 Copyright (C) 1994, 1998 Free Software Foundation, Inc. | |
3 | |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to the Free | |
18 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA | |
19 02111-1307, USA.*/ | |
20 | |
21 #include <config.h> | |
22 #include "lisp.h" | |
442 | 23 |
771 | 24 #include "sysfile.h" |
25 | |
428 | 26 #include <unistd.h> |
27 #include <sheap-adjust.h> | |
28 | |
29 #define STATIC_HEAP_BASE 0x800000 | |
4840
17b3dc5500b0
changes to get old non-pdump dumping on Cygwin to work (sort of)
Ben Wing <ben@xemacs.org>
parents:
1315
diff
changeset
|
30 #define STATIC_HEAP_SLOP 0x80000 |
428 | 31 #define STATIC_HEAP_SIZE \ |
32 (STATIC_HEAP_BASE + SHEAP_ADJUSTMENT + STATIC_HEAP_SLOP) | |
33 #define BLOCKSIZE (1<<12) | |
34 #define ALLOC_UNIT (BLOCKSIZE-1) | |
35 #define ALLOC_MASK ~((unsigned long)(ALLOC_UNIT)) | |
36 #define ALIGN_ALLOC(addr) ((((unsigned long)addr) + ALLOC_UNIT) & ALLOC_MASK) | |
37 | |
38 char static_heap_buffer[STATIC_HEAP_SIZE]={0}; | |
39 char* static_heap_base=static_heap_buffer; | |
40 char* static_heap_ptr=static_heap_buffer; | |
41 unsigned long static_heap_size=STATIC_HEAP_SIZE; | |
42 int static_heap_initialized=0; | |
43 int static_heap_dumped=0; | |
44 | |
853 | 45 void *more_static_core ( ptrdiff_t increment ); |
46 void *more_static_core ( ptrdiff_t increment ) | |
428 | 47 { |
48 int size = (int) increment; | |
49 void *result; | |
50 | |
51 if (!static_heap_initialized) | |
52 { | |
53 #ifdef VALMASK | |
54 if (((unsigned long) static_heap_base & ~VALMASK) != 0) | |
55 { | |
56 printf ("error: The heap was allocated in upper memory.\n"); | |
57 exit (-1); | |
58 } | |
59 #endif | |
60 static_heap_base=(char*)ALIGN_ALLOC(static_heap_buffer); | |
61 static_heap_ptr=static_heap_base; | |
62 static_heap_size=STATIC_HEAP_SIZE - | |
63 (static_heap_base-static_heap_buffer); | |
442 | 64 #ifdef CYGWIN |
428 | 65 sbrk(BLOCKSIZE); /* force space for fork to work */ |
66 #endif | |
67 static_heap_initialized=1; | |
68 } | |
69 | |
70 result = static_heap_ptr; | |
71 | |
72 /* we don't need to align - handled by gmalloc. */ | |
73 | |
74 if (size < 0) | |
75 { | |
76 if (static_heap_ptr + size < static_heap_base) | |
77 { | |
78 return 0; | |
79 } | |
80 } | |
81 else | |
82 { | |
83 if (static_heap_ptr + size >= static_heap_base + static_heap_size) | |
84 { | |
1111 | 85 printf ( |
86 "\nRequested %d bytes, static heap exhausted! base is %p, current ptr\n" | |
4840
17b3dc5500b0
changes to get old non-pdump dumping on Cygwin to work (sort of)
Ben Wing <ben@xemacs.org>
parents:
1315
diff
changeset
|
87 "is %p, static heap size is %ld. You have exhausted the static heap. \n" |
1111 | 88 "\n" |
89 "If you are simply trying to compile, remove sheap-adjust.h\n" | |
90 "and recompile from the top level. If this doesn't\n" | |
91 "work then STATIC_HEAP_SLOP (defined in this file) is too small.\n" | |
92 "\n" | |
93 "If you want to run temacs, change SHEAP_ADJUSTMENT in sheap-adjust.h\n" | |
94 "to 0 or a +ve number. Generally you should *not* try to run temacs\n" | |
95 "with a static heap, you should dump first.\n", | |
4840
17b3dc5500b0
changes to get old non-pdump dumping on Cygwin to work (sort of)
Ben Wing <ben@xemacs.org>
parents:
1315
diff
changeset
|
96 size, static_heap_base, static_heap_ptr, static_heap_size); |
428 | 97 |
98 exit(-1); | |
99 return 0; | |
100 } | |
101 } | |
102 static_heap_ptr += size; | |
103 | |
104 return result; | |
105 } | |
106 | |
107 static void | |
903 | 108 sheap_adjust_h (long adjust) |
428 | 109 { |
771 | 110 FILE *stream = retry_fopen ("sheap-adjust.h", "w"); |
428 | 111 |
112 if (stream == NULL) | |
113 report_file_error ("Opening sheap adjustment file", | |
4952
19a72041c5ed
Mule-izing, various fixes related to char * arguments
Ben Wing <ben@xemacs.org>
parents:
4840
diff
changeset
|
114 build_ascstring ("sheap-adjust.h")); |
428 | 115 |
116 fprintf (stream, | |
117 "/*\tDo not edit this file!\n" | |
118 "\tAutomatically generated by XEmacs */\n" | |
903 | 119 "# define SHEAP_ADJUSTMENT (%ld)\n", adjust); |
771 | 120 retry_fclose (stream); |
428 | 121 } |
122 | |
442 | 123 void report_sheap_usage (int die_if_pure_storage_exceeded); |
428 | 124 void |
125 report_sheap_usage (int die_if_pure_storage_exceeded) | |
126 { | |
127 int rc = 0; | |
128 | |
903 | 129 Bytecount lost = STATIC_HEAP_SIZE |
428 | 130 - (static_heap_ptr - static_heap_buffer); |
131 char buf[200]; | |
1157 | 132 sprintf (buf, "Static heap usage: %ldk of %ldk, slop is %ldk", |
133 (long) ((static_heap_ptr - static_heap_buffer) /1024), | |
134 (long) (STATIC_HEAP_SIZE / 1024), | |
135 (long) STATIC_HEAP_SLOP / 1024); | |
428 | 136 |
1315 | 137 if (lost > STATIC_HEAP_SLOP) |
138 { | |
139 sprintf (buf + strlen (buf), " -- %ldk wasted", (long)(lost/1024)); | |
140 if (die_if_pure_storage_exceeded) | |
141 { | |
142 sheap_adjust_h(STATIC_HEAP_SLOP - lost); | |
143 sprintf (buf + strlen (buf), " -- reset to %ldk", | |
144 (long) ((STATIC_HEAP_SIZE + STATIC_HEAP_SLOP - lost) / | |
145 1024)); | |
146 rc = -1; | |
147 } | |
148 message ("%s\n", buf); | |
428 | 149 } |
150 | |
1315 | 151 if (rc < 0) |
152 { | |
153 unlink ("SATISFIED"); | |
154 stderr_out ("Static heap size adjusted, don't panic! I will restart the `make'\n"); | |
155 exit (0); | |
156 } | |
428 | 157 } |
158 | |
159 |