casa
$Rev:20696$
|
00001 //# malloc.h: malloc functions from Doug Lea 00002 //# Copyright (C) 1996,1999,2001 00003 //# Associated Universities, Inc. Washington DC, USA. 00004 //# 00005 //# This library is free software; you can redistribute it and/or modify it 00006 //# under the terms of the GNU Library General Public License as published by 00007 //# the Free Software Foundation; either version 2 of the License, or (at your 00008 //# option) any later version. 00009 //# 00010 //# This library is distributed in the hope that it will be useful, but WITHOUT 00011 //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00012 //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public 00013 //# License for more details. 00014 //# 00015 //# You should have received a copy of the GNU Library General Public License 00016 //# along with this library; if not, write to the Free Software Foundation, 00017 //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. 00018 //# 00019 //# Correspondence concerning AIPS++ should be addressed as follows: 00020 //# Internet email: aips2-request@nrao.edu. 00021 //# Postal address: AIPS++ Project Office 00022 //# National Radio Astronomy Observatory 00023 //# 520 Edgemont Road 00024 //# Charlottesville, VA 22903-2475 USA 00025 //# 00026 //# $Id: malloc.h 21022 2011-03-01 10:07:47Z gervandiepen $ 00027 00028 #if !defined(AIPS_NO_LEA_MALLOC) 00029 00030 #ifndef CASA_MALLOC_H 00031 #define CASA_MALLOC_H 00032 00033 00034 /* 00035 A version of malloc/free/realloc written by Doug Lea and released to the 00036 public domain. Send questions/comments/complaints/performance data 00037 to dl@cs.oswego.edu 00038 00039 * VERSION 2.6.5 Wed Jun 17 15:55:16 1998 Doug Lea (dl at gee) 00040 */ 00041 00042 /* The only AIPS++ changes from the distribution are: 00043 1. Added AIPS++ copyright notice and guard. 00044 2. Compile to nothing for linux since we already get GNU malloc there. 00045 3. If AIPS_DEBUG is set compile this malloc with DEBUG on. 00046 */ 00047 00048 #if defined(AIPS_LINUX) 00049 /* IS linux. Include malloc.h so we only have to include casa/OS/malloc.h 00050 without an ifdef on OS. 00051 */ 00052 #include <malloc.h> 00053 #else 00054 /* NOT linux */ 00055 00056 #if defined(AIPS_DEBUG) 00057 /* Hopefully not too expensive. If so we can turn it off. */ 00058 #define DEBUG 1 00059 #endif 00060 00061 /* 00062 Default header file for malloc-2.8.x, written by Doug Lea 00063 and released to the public domain, as explained at 00064 http://creativecommons.org/licenses/publicdomain. 00065 00066 last update: Wed May 27 14:25:17 2009 Doug Lea (dl at gee) 00067 00068 This header is for ANSI C/C++ only. You can set any of 00069 the following #defines before including: 00070 00071 * If USE_DL_PREFIX is defined, it is assumed that malloc.c 00072 was also compiled with this option, so all routines 00073 have names starting with "dl". 00074 00075 * If HAVE_USR_INCLUDE_MALLOC_H is defined, it is assumed that this 00076 file will be #included AFTER <malloc.h>. This is needed only if 00077 your system defines a struct mallinfo that is incompatible with the 00078 standard one declared here. Otherwise, you can include this file 00079 INSTEAD of your system system <malloc.h>. At least on ANSI, all 00080 declarations should be compatible with system versions 00081 00082 * If MSPACES is defined, declarations for mspace versions are included. 00083 */ 00084 00085 #ifndef MALLOC_280_H 00086 #define MALLOC_280_H 00087 00088 #ifdef __cplusplus 00089 extern "C" { 00090 #endif 00091 00092 #include <stddef.h> /* for size_t */ 00093 00094 #ifndef ONLY_MSPACES 00095 #define ONLY_MSPACES 0 /* define to a value */ 00096 #endif /* ONLY_MSPACES */ 00097 #ifndef NO_MALLINFO 00098 #define NO_MALLINFO 0 00099 #endif /* NO_MALLINFO */ 00100 00101 00102 #if !ONLY_MSPACES 00103 00104 #ifndef USE_DL_PREFIX 00105 #define dlcalloc calloc 00106 #define dlfree free 00107 #define dlmalloc malloc 00108 #define dlmemalign memalign 00109 #define dlrealloc realloc 00110 #define dlvalloc valloc 00111 #define dlpvalloc pvalloc 00112 #define dlmallinfo mallinfo 00113 #define dlmallopt mallopt 00114 #define dlmalloc_trim malloc_trim 00115 #define dlmalloc_stats malloc_stats 00116 #define dlmalloc_usable_size malloc_usable_size 00117 #define dlmalloc_footprint malloc_footprint 00118 #define dlindependent_calloc independent_calloc 00119 #define dlindependent_comalloc independent_comalloc 00120 #endif /* USE_DL_PREFIX */ 00121 #if !NO_MALLINFO 00122 #ifndef HAVE_USR_INCLUDE_MALLOC_H 00123 #ifndef _MALLOC_H 00124 #ifndef MALLINFO_FIELD_TYPE 00125 #define MALLINFO_FIELD_TYPE size_t 00126 #endif /* MALLINFO_FIELD_TYPE */ 00127 #ifndef STRUCT_MALLINFO_DECLARED 00128 #define STRUCT_MALLINFO_DECLARED 1 00129 struct mallinfo { 00130 MALLINFO_FIELD_TYPE arena; /* non-mmapped space allocated from system */ 00131 MALLINFO_FIELD_TYPE ordblks; /* number of free chunks */ 00132 MALLINFO_FIELD_TYPE smblks; /* always 0 */ 00133 MALLINFO_FIELD_TYPE hblks; /* always 0 */ 00134 MALLINFO_FIELD_TYPE hblkhd; /* space in mmapped regions */ 00135 MALLINFO_FIELD_TYPE usmblks; /* maximum total allocated space */ 00136 MALLINFO_FIELD_TYPE fsmblks; /* always 0 */ 00137 MALLINFO_FIELD_TYPE uordblks; /* total allocated space */ 00138 MALLINFO_FIELD_TYPE fordblks; /* total free space */ 00139 MALLINFO_FIELD_TYPE keepcost; /* releasable (via malloc_trim) space */ 00140 }; 00141 #endif /* STRUCT_MALLINFO_DECLARED */ 00142 #endif /* _MALLOC_H */ 00143 #endif /* HAVE_USR_INCLUDE_MALLOC_H */ 00144 #endif /* !NO_MALLINFO */ 00145 00146 /* 00147 malloc(size_t n) 00148 Returns a pointer to a newly allocated chunk of at least n bytes, or 00149 null if no space is available, in which case errno is set to ENOMEM 00150 on ANSI C systems. 00151 00152 If n is zero, malloc returns a minimum-sized chunk. (The minimum 00153 size is 16 bytes on most 32bit systems, and 32 bytes on 64bit 00154 systems.) Note that size_t is an unsigned type, so calls with 00155 arguments that would be negative if signed are interpreted as 00156 requests for huge amounts of space, which will often fail. The 00157 maximum supported value of n differs across systems, but is in all 00158 cases less than the maximum representable value of a size_t. 00159 */ 00160 void* dlmalloc(size_t); 00161 00162 /* 00163 free(void* p) 00164 Releases the chunk of memory pointed to by p, that had been previously 00165 allocated using malloc or a related routine such as realloc. 00166 It has no effect if p is null. If p was not malloced or already 00167 freed, free(p) will by default cuase the current program to abort. 00168 */ 00169 void dlfree(void*); 00170 00171 /* 00172 calloc(size_t n_elements, size_t element_size); 00173 Returns a pointer to n_elements * element_size bytes, with all locations 00174 set to zero. 00175 */ 00176 void* dlcalloc(size_t, size_t); 00177 00178 /* 00179 realloc(void* p, size_t n) 00180 Returns a pointer to a chunk of size n that contains the same data 00181 as does chunk p up to the minimum of (n, p's size) bytes, or null 00182 if no space is available. 00183 00184 The returned pointer may or may not be the same as p. The algorithm 00185 prefers extending p in most cases when possible, otherwise it 00186 employs the equivalent of a malloc-copy-free sequence. 00187 00188 If p is null, realloc is equivalent to malloc. 00189 00190 If space is not available, realloc returns null, errno is set (if on 00191 ANSI) and p is NOT freed. 00192 00193 if n is for fewer bytes than already held by p, the newly unused 00194 space is lopped off and freed if possible. realloc with a size 00195 argument of zero (re)allocates a minimum-sized chunk. 00196 00197 The old unix realloc convention of allowing the last-free'd chunk 00198 to be used as an argument to realloc is not supported. 00199 */ 00200 00201 void* dlrealloc(void*, size_t); 00202 00203 /* 00204 memalign(size_t alignment, size_t n); 00205 Returns a pointer to a newly allocated chunk of n bytes, aligned 00206 in accord with the alignment argument. 00207 00208 The alignment argument should be a power of two. If the argument is 00209 not a power of two, the nearest greater power is used. 00210 8-byte alignment is guaranteed by normal malloc calls, so don't 00211 bother calling memalign with an argument of 8 or less. 00212 00213 Overreliance on memalign is a sure way to fragment space. 00214 */ 00215 void* dlmemalign(size_t, size_t); 00216 00217 /* 00218 valloc(size_t n); 00219 Equivalent to memalign(pagesize, n), where pagesize is the page 00220 size of the system. If the pagesize is unknown, 4096 is used. 00221 */ 00222 void* dlvalloc(size_t); 00223 00224 /* 00225 mallopt(int parameter_number, int parameter_value) 00226 Sets tunable parameters The format is to provide a 00227 (parameter-number, parameter-value) pair. mallopt then sets the 00228 corresponding parameter to the argument value if it can (i.e., so 00229 long as the value is meaningful), and returns 1 if successful else 00230 0. SVID/XPG/ANSI defines four standard param numbers for mallopt, 00231 normally defined in malloc.h. None of these are use in this malloc, 00232 so setting them has no effect. But this malloc also supports other 00233 options in mallopt: 00234 00235 Symbol param # default allowed param values 00236 M_TRIM_THRESHOLD -1 2*1024*1024 any (-1U disables trimming) 00237 M_GRANULARITY -2 page size any power of 2 >= page size 00238 M_MMAP_THRESHOLD -3 256*1024 any (or 0 if no MMAP support) 00239 */ 00240 int dlmallopt(int, int); 00241 00242 #define M_TRIM_THRESHOLD (-1) 00243 #define M_GRANULARITY (-2) 00244 #define M_MMAP_THRESHOLD (-3) 00245 00246 00247 /* 00248 malloc_footprint(); 00249 Returns the number of bytes obtained from the system. The total 00250 number of bytes allocated by malloc, realloc etc., is less than this 00251 value. Unlike mallinfo, this function returns only a precomputed 00252 result, so can be called frequently to monitor memory consumption. 00253 Even if locks are otherwise defined, this function does not use them, 00254 so results might not be up to date. 00255 */ 00256 size_t dlmalloc_footprint(); 00257 00258 #if !NO_MALLINFO 00259 /* 00260 mallinfo() 00261 Returns (by copy) a struct containing various summary statistics: 00262 00263 arena: current total non-mmapped bytes allocated from system 00264 ordblks: the number of free chunks 00265 smblks: always zero. 00266 hblks: current number of mmapped regions 00267 hblkhd: total bytes held in mmapped regions 00268 usmblks: the maximum total allocated space. This will be greater 00269 than current total if trimming has occurred. 00270 fsmblks: always zero 00271 uordblks: current total allocated space (normal or mmapped) 00272 fordblks: total free space 00273 keepcost: the maximum number of bytes that could ideally be released 00274 back to system via malloc_trim. ("ideally" means that 00275 it ignores page restrictions etc.) 00276 00277 Because these fields are ints, but internal bookkeeping may 00278 be kept as longs, the reported values may wrap around zero and 00279 thus be inaccurate. 00280 */ 00281 00282 struct mallinfo dlmallinfo(void); 00283 #endif /* NO_MALLINFO */ 00284 00285 /* 00286 independent_calloc(size_t n_elements, size_t element_size, void* chunks[]); 00287 00288 independent_calloc is similar to calloc, but instead of returning a 00289 single cleared space, it returns an array of pointers to n_elements 00290 independent elements that can hold contents of size elem_size, each 00291 of which starts out cleared, and can be independently freed, 00292 realloc'ed etc. The elements are guaranteed to be adjacently 00293 allocated (this is not guaranteed to occur with multiple callocs or 00294 mallocs), which may also improve cache locality in some 00295 applications. 00296 00297 The "chunks" argument is optional (i.e., may be null, which is 00298 probably the most typical usage). If it is null, the returned array 00299 is itself dynamically allocated and should also be freed when it is 00300 no longer needed. Otherwise, the chunks array must be of at least 00301 n_elements in length. It is filled in with the pointers to the 00302 chunks. 00303 00304 In either case, independent_calloc returns this pointer array, or 00305 null if the allocation failed. If n_elements is zero and "chunks" 00306 is null, it returns a chunk representing an array with zero elements 00307 (which should be freed if not wanted). 00308 00309 Each element must be individually freed when it is no longer 00310 needed. If you'd like to instead be able to free all at once, you 00311 should instead use regular calloc and assign pointers into this 00312 space to represent elements. (In this case though, you cannot 00313 independently free elements.) 00314 00315 independent_calloc simplifies and speeds up implementations of many 00316 kinds of pools. It may also be useful when constructing large data 00317 structures that initially have a fixed number of fixed-sized nodes, 00318 but the number is not known at compile time, and some of the nodes 00319 may later need to be freed. For example: 00320 00321 struct Node { int item; struct Node* next; }; 00322 00323 struct Node* build_list() { 00324 struct Node** pool; 00325 int n = read_number_of_nodes_needed(); 00326 if (n <= 0) return 0; 00327 pool = (struct Node**)(independent_calloc(n, sizeof(struct Node), 0); 00328 if (pool == 0) die(); 00329 // organize into a linked list... 00330 struct Node* first = pool[0]; 00331 for (i = 0; i < n-1; ++i) 00332 pool[i]->next = pool[i+1]; 00333 free(pool); // Can now free the array (or not, if it is needed later) 00334 return first; 00335 } 00336 */ 00337 void** dlindependent_calloc(size_t, size_t, void**); 00338 00339 /* 00340 independent_comalloc(size_t n_elements, size_t sizes[], void* chunks[]); 00341 00342 independent_comalloc allocates, all at once, a set of n_elements 00343 chunks with sizes indicated in the "sizes" array. It returns 00344 an array of pointers to these elements, each of which can be 00345 independently freed, realloc'ed etc. The elements are guaranteed to 00346 be adjacently allocated (this is not guaranteed to occur with 00347 multiple callocs or mallocs), which may also improve cache locality 00348 in some applications. 00349 00350 The "chunks" argument is optional (i.e., may be null). If it is null 00351 the returned array is itself dynamically allocated and should also 00352 be freed when it is no longer needed. Otherwise, the chunks array 00353 must be of at least n_elements in length. It is filled in with the 00354 pointers to the chunks. 00355 00356 In either case, independent_comalloc returns this pointer array, or 00357 null if the allocation failed. If n_elements is zero and chunks is 00358 null, it returns a chunk representing an array with zero elements 00359 (which should be freed if not wanted). 00360 00361 Each element must be individually freed when it is no longer 00362 needed. If you'd like to instead be able to free all at once, you 00363 should instead use a single regular malloc, and assign pointers at 00364 particular offsets in the aggregate space. (In this case though, you 00365 cannot independently free elements.) 00366 00367 independent_comallac differs from independent_calloc in that each 00368 element may have a different size, and also that it does not 00369 automatically clear elements. 00370 00371 independent_comalloc can be used to speed up allocation in cases 00372 where several structs or objects must always be allocated at the 00373 same time. For example: 00374 00375 struct Head { ... } 00376 struct Foot { ... } 00377 00378 void send_message(char* msg) { 00379 int msglen = strlen(msg); 00380 size_t sizes[3] = { sizeof(struct Head), msglen, sizeof(struct Foot) }; 00381 void* chunks[3]; 00382 if (independent_comalloc(3, sizes, chunks) == 0) 00383 die(); 00384 struct Head* head = (struct Head*)(chunks[0]); 00385 char* body = (char*)(chunks[1]); 00386 struct Foot* foot = (struct Foot*)(chunks[2]); 00387 // ... 00388 } 00389 00390 In general though, independent_comalloc is worth using only for 00391 larger values of n_elements. For small values, you probably won't 00392 detect enough difference from series of malloc calls to bother. 00393 00394 Overuse of independent_comalloc can increase overall memory usage, 00395 since it cannot reuse existing noncontiguous small chunks that 00396 might be available for some of the elements. 00397 */ 00398 void** dlindependent_comalloc(size_t, size_t*, void**); 00399 00400 00401 /* 00402 pvalloc(size_t n); 00403 Equivalent to valloc(minimum-page-that-holds(n)), that is, 00404 round up n to nearest pagesize. 00405 */ 00406 void* dlpvalloc(size_t); 00407 00408 /* 00409 malloc_trim(size_t pad); 00410 00411 If possible, gives memory back to the system (via negative arguments 00412 to sbrk) if there is unused memory at the `high' end of the malloc 00413 pool or in unused MMAP segments. You can call this after freeing 00414 large blocks of memory to potentially reduce the system-level memory 00415 requirements of a program. However, it cannot guarantee to reduce 00416 memory. Under some allocation patterns, some large free blocks of 00417 memory will be locked between two used chunks, so they cannot be 00418 given back to the system. 00419 00420 The `pad' argument to malloc_trim represents the amount of free 00421 trailing space to leave untrimmed. If this argument is zero, only 00422 the minimum amount of memory to maintain internal data structures 00423 will be left. Non-zero arguments can be supplied to maintain enough 00424 trailing space to service future expected allocations without having 00425 to re-obtain memory from the system. 00426 00427 Malloc_trim returns 1 if it actually released any memory, else 0. 00428 */ 00429 int dlmalloc_trim(size_t); 00430 00431 /* 00432 malloc_stats(); 00433 Prints on stderr the amount of space obtained from the system (both 00434 via sbrk and mmap), the maximum amount (which may be more than 00435 current if malloc_trim and/or munmap got called), and the current 00436 number of bytes allocated via malloc (or realloc, etc) but not yet 00437 freed. Note that this is the number of bytes allocated, not the 00438 number requested. It will be larger than the number requested 00439 because of alignment and bookkeeping overhead. Because it includes 00440 alignment wastage as being in use, this figure may be greater than 00441 zero even when no user-level chunks are allocated. 00442 00443 The reported current and maximum system memory can be inaccurate if 00444 a program makes other calls to system memory allocation functions 00445 (normally sbrk) outside of malloc. 00446 00447 malloc_stats prints only the most commonly interesting statistics. 00448 More information can be obtained by calling mallinfo. 00449 */ 00450 void dlmalloc_stats(); 00451 00452 #endif /* !ONLY_MSPACES */ 00453 00454 /* 00455 malloc_usable_size(void* p); 00456 00457 Returns the number of bytes you can actually use in 00458 an allocated chunk, which may be more than you requested (although 00459 often not) due to alignment and minimum size constraints. 00460 You can use this many bytes without worrying about 00461 overwriting other allocated objects. This is not a particularly great 00462 programming practice. malloc_usable_size can be more useful in 00463 debugging and assertions, for example: 00464 00465 p = malloc(n); 00466 assert(malloc_usable_size(p) >= 256); 00467 */ 00468 size_t dlmalloc_usable_size(void*); 00469 00470 00471 #if MSPACES 00472 00473 /* 00474 mspace is an opaque type representing an independent 00475 region of space that supports mspace_malloc, etc. 00476 */ 00477 typedef void* mspace; 00478 00479 /* 00480 create_mspace creates and returns a new independent space with the 00481 given initial capacity, or, if 0, the default granularity size. It 00482 returns null if there is no system memory available to create the 00483 space. If argument locked is non-zero, the space uses a separate 00484 lock to control access. The capacity of the space will grow 00485 dynamically as needed to service mspace_malloc requests. You can 00486 control the sizes of incremental increases of this space by 00487 compiling with a different DEFAULT_GRANULARITY or dynamically 00488 setting with mallopt(M_GRANULARITY, value). 00489 */ 00490 mspace create_mspace(size_t capacity, int locked); 00491 00492 /* 00493 destroy_mspace destroys the given space, and attempts to return all 00494 of its memory back to the system, returning the total number of 00495 bytes freed. After destruction, the results of access to all memory 00496 used by the space become undefined. 00497 */ 00498 size_t destroy_mspace(mspace msp); 00499 00500 /* 00501 create_mspace_with_base uses the memory supplied as the initial base 00502 of a new mspace. Part (less than 128*sizeof(size_t) bytes) of this 00503 space is used for bookkeeping, so the capacity must be at least this 00504 large. (Otherwise 0 is returned.) When this initial space is 00505 exhausted, additional memory will be obtained from the system. 00506 Destroying this space will deallocate all additionally allocated 00507 space (if possible) but not the initial base. 00508 */ 00509 mspace create_mspace_with_base(void* base, size_t capacity, int locked); 00510 00511 /* 00512 mspace_track_large_chunks controls whether requests for large chunks 00513 are allocated in their own untracked mmapped regions, separate from 00514 others in this mspace. By default large chunks are not tracked, 00515 which reduces fragmentation. However, such chunks are not 00516 necessarily released to the system upon destroy_mspace. Enabling 00517 tracking by setting to true may increase fragmentation, but avoids 00518 leakage when relying on destroy_mspace to release all memory 00519 allocated using this space. The function returns the previous 00520 setting. 00521 */ 00522 int mspace_track_large_chunks(mspace msp, int enable); 00523 00524 /* 00525 mspace_malloc behaves as malloc, but operates within 00526 the given space. 00527 */ 00528 void* mspace_malloc(mspace msp, size_t bytes); 00529 00530 /* 00531 mspace_free behaves as free, but operates within 00532 the given space. 00533 00534 If compiled with FOOTERS==1, mspace_free is not actually needed. 00535 free may be called instead of mspace_free because freed chunks from 00536 any space are handled by their originating spaces. 00537 */ 00538 void mspace_free(mspace msp, void* mem); 00539 00540 /* 00541 mspace_realloc behaves as realloc, but operates within 00542 the given space. 00543 00544 If compiled with FOOTERS==1, mspace_realloc is not actually 00545 needed. realloc may be called instead of mspace_realloc because 00546 realloced chunks from any space are handled by their originating 00547 spaces. 00548 */ 00549 void* mspace_realloc(mspace msp, void* mem, size_t newsize); 00550 00551 /* 00552 mspace_calloc behaves as calloc, but operates within 00553 the given space. 00554 */ 00555 void* mspace_calloc(mspace msp, size_t n_elements, size_t elem_size); 00556 00557 /* 00558 mspace_memalign behaves as memalign, but operates within 00559 the given space. 00560 */ 00561 void* mspace_memalign(mspace msp, size_t alignment, size_t bytes); 00562 00563 /* 00564 mspace_independent_calloc behaves as independent_calloc, but 00565 operates within the given space. 00566 */ 00567 void** mspace_independent_calloc(mspace msp, size_t n_elements, 00568 size_t elem_size, void* chunks[]); 00569 00570 /* 00571 mspace_independent_comalloc behaves as independent_comalloc, but 00572 operates within the given space. 00573 */ 00574 void** mspace_independent_comalloc(mspace msp, size_t n_elements, 00575 size_t sizes[], void* chunks[]); 00576 00577 /* 00578 mspace_footprint() returns the number of bytes obtained from the 00579 system for this space. 00580 */ 00581 size_t mspace_footprint(mspace msp); 00582 00583 00584 #if !NO_MALLINFO 00585 /* 00586 mspace_mallinfo behaves as mallinfo, but reports properties of 00587 the given space. 00588 */ 00589 struct mallinfo mspace_mallinfo(mspace msp); 00590 #endif /* NO_MALLINFO */ 00591 00592 /* 00593 malloc_usable_size(void* p) behaves the same as malloc_usable_size; 00594 */ 00595 size_t mspace_usable_size(void* mem); 00596 00597 /* 00598 mspace_malloc_stats behaves as malloc_stats, but reports 00599 properties of the given space. 00600 */ 00601 void mspace_malloc_stats(mspace msp); 00602 00603 /* 00604 mspace_trim behaves as malloc_trim, but 00605 operates within the given space. 00606 */ 00607 int mspace_trim(mspace msp, size_t pad); 00608 00609 /* 00610 An alias for mallopt. 00611 */ 00612 int mspace_mallopt(int, int); 00613 00614 #endif /* MSPACES */ 00615 00616 #ifdef __cplusplus 00617 }; /* end of extern "C" */ 00618 #endif 00619 00620 #endif /* MALLOC_280_H */ 00621 00622 #endif 00623 /* AIPS_LINUX */ 00624 00625 #endif 00626 /* AIPS_MALLOC */ 00627 00628 #endif 00629 /* AIPS_NO_LEA_MALLOC */