Add mallinfo2 function that support sizes >= 4GB.

The current int type can easily overflow for allocation of more
than 4GB.
This commit is contained in:
Martin Liska 2020-07-07 13:58:24 +02:00
parent 85f1848937
commit e3960d1c57
3 changed files with 69 additions and 23 deletions

View File

@ -638,6 +638,8 @@ libc_hidden_proto (__libc_mallopt)
be kept as longs, the reported values may wrap around zero and be kept as longs, the reported values may wrap around zero and
thus be inaccurate. thus be inaccurate.
*/ */
struct mallinfo2 __libc_mallinfo2(void);
struct mallinfo __libc_mallinfo(void); struct mallinfo __libc_mallinfo(void);
@ -4911,7 +4913,7 @@ __malloc_usable_size (void *m)
*/ */
static void static void
int_mallinfo (mstate av, struct mallinfo *m) int_mallinfo (mstate av, struct mallinfo2 *m)
{ {
size_t i; size_t i;
mbinptr b; mbinptr b;
@ -4974,10 +4976,10 @@ int_mallinfo (mstate av, struct mallinfo *m)
} }
struct mallinfo struct mallinfo2
__libc_mallinfo (void) __libc_mallinfo2 (void)
{ {
struct mallinfo m; struct mallinfo2 m;
mstate ar_ptr; mstate ar_ptr;
if (__malloc_initialized < 0) if (__malloc_initialized < 0)
@ -4998,6 +5000,27 @@ __libc_mallinfo (void)
return m; return m;
} }
struct mallinfo
__libc_mallinfo (void)
{
struct mallinfo m;
struct mallinfo2 m2 = __libc_mallinfo2 ();
m.arena = m2.arena;
m.ordblks = m2.ordblks;
m.smblks = m2.smblks;
m.hblks = m2.hblks;
m.hblkhd = m2.hblkhd;
m.usmblks = m2.usmblks;
m.fsmblks = m2.fsmblks;
m.uordblks = m2.uordblks;
m.fordblks = m2.fordblks;
m.keepcost = m2.keepcost;
return m;
}
/* /*
------------------------------ malloc_stats ------------------------------ ------------------------------ malloc_stats ------------------------------
*/ */
@ -5016,7 +5039,7 @@ __malloc_stats (void)
stderr->_flags2 |= _IO_FLAGS2_NOTCANCEL; stderr->_flags2 |= _IO_FLAGS2_NOTCANCEL;
for (i = 0, ar_ptr = &main_arena;; i++) for (i = 0, ar_ptr = &main_arena;; i++)
{ {
struct mallinfo mi; struct mallinfo2 mi;
memset (&mi, 0, sizeof (mi)); memset (&mi, 0, sizeof (mi));
__libc_lock_lock (ar_ptr->mutex); __libc_lock_lock (ar_ptr->mutex);
@ -5632,6 +5655,8 @@ strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc) strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
strong_alias (__libc_mallinfo, __mallinfo) strong_alias (__libc_mallinfo, __mallinfo)
weak_alias (__libc_mallinfo, mallinfo) weak_alias (__libc_mallinfo, mallinfo)
strong_alias (__libc_mallinfo2, __mallinfo2)
weak_alias (__libc_mallinfo2, mallinfo2)
strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt) strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)
weak_alias (__malloc_stats, malloc_stats) weak_alias (__malloc_stats, malloc_stats)

View File

@ -97,9 +97,30 @@ struct mallinfo
int keepcost; /* top-most, releasable (via malloc_trim) space */ int keepcost; /* top-most, releasable (via malloc_trim) space */
}; };
/* SVID2/XPG mallinfo2 structure which can handle allocations
bigger than 4GB. */
struct mallinfo2
{
size_t arena; /* non-mmapped space allocated from system */
size_t ordblks; /* number of free chunks */
size_t smblks; /* number of fastbin blocks */
size_t hblks; /* number of mmapped regions */
size_t hblkhd; /* space in mmapped regions */
size_t usmblks; /* always 0, preserved for backwards compatibility */
size_t fsmblks; /* space available in freed fastbin blocks */
size_t uordblks; /* total allocated space */
size_t fordblks; /* total free space */
size_t keepcost; /* top-most, releasable (via malloc_trim) space */
};
/* Returns a copy of the updated current mallinfo. */ /* Returns a copy of the updated current mallinfo. */
__MALLOC_DEPRECATED;
extern struct mallinfo mallinfo (void) __THROW; extern struct mallinfo mallinfo (void) __THROW;
/* Returns a copy of the updated current mallinfo. */
extern struct mallinfo2 mallinfo2 (void) __THROW;
/* SVID2/XPG mallopt options */ /* SVID2/XPG mallopt options */
#ifndef M_MXFAST #ifndef M_MXFAST
# define M_MXFAST 1 /* maximum request size for "fastbins" */ # define M_MXFAST 1 /* maximum request size for "fastbins" */

View File

@ -1505,50 +1505,50 @@ installing such hooks.
@cindex allocation statistics @cindex allocation statistics
You can get information about dynamic memory allocation by calling the You can get information about dynamic memory allocation by calling the
@code{mallinfo} function. This function and its associated data type @code{mallinfo2} function. This function and its associated data type
are declared in @file{malloc.h}; they are an extension of the standard are declared in @file{malloc.h}; they are an extension of the standard
SVID/XPG version. SVID/XPG version.
@pindex malloc.h @pindex malloc.h
@deftp {Data Type} {struct mallinfo} @deftp {Data Type} {struct mallinfo2}
@standards{GNU, malloc.h} @standards{GNU, malloc.h}
This structure type is used to return information about the dynamic This structure type is used to return information about the dynamic
memory allocator. It contains the following members: memory allocator. It contains the following members:
@table @code @table @code
@item int arena @item size_t arena
This is the total size of memory allocated with @code{sbrk} by This is the total size of memory allocated with @code{sbrk} by
@code{malloc}, in bytes. @code{malloc}, in bytes.
@item int ordblks @item size_t ordblks
This is the number of chunks not in use. (The memory allocator This is the number of chunks not in use. (The memory allocator
internally gets chunks of memory from the operating system, and then size_ternally gets chunks of memory from the operating system, and then
carves them up to satisfy individual @code{malloc} requests; carves them up to satisfy individual @code{malloc} requests;
@pxref{The GNU Allocator}.) @pxref{The GNU Allocator}.)
@item int smblks @item size_t smblks
This field is unused. This field is unused.
@item int hblks @item size_t hblks
This is the total number of chunks allocated with @code{mmap}. This is the total number of chunks allocated with @code{mmap}.
@item int hblkhd @item size_t hblkhd
This is the total size of memory allocated with @code{mmap}, in bytes. This is the total size of memory allocated with @code{mmap}, in bytes.
@item int usmblks @item size_t usmblks
This field is unused and always 0. This field is unused and always 0.
@item int fsmblks @item size_t fsmblks
This field is unused. This field is unused.
@item int uordblks @item size_t uordblks
This is the total size of memory occupied by chunks handed out by This is the total size of memory occupied by chunks handed out by
@code{malloc}. @code{malloc}.
@item int fordblks @item size_t fordblks
This is the total size of memory occupied by free (not in use) chunks. This is the total size of memory occupied by free (not in use) chunks.
@item int keepcost @item size_t keepcost
This is the size of the top-most releasable chunk that normally This is the size of the top-most releasable chunk that normally
borders the end of the heap (i.e., the high end of the virtual address borders the end of the heap (i.e., the high end of the virtual address
space's data segment). space's data segment).
@ -1556,7 +1556,7 @@ space's data segment).
@end table @end table
@end deftp @end deftp
@deftypefun {struct mallinfo} mallinfo (void) @deftypefun {struct mallinfo2} mallinfo2 (void)
@standards{SVID, malloc.h} @standards{SVID, malloc.h}
@safety{@prelim{}@mtunsafe{@mtuinit{} @mtasuconst{:mallopt}}@asunsafe{@asuinit{} @asulock{}}@acunsafe{@acuinit{} @aculock{}}} @safety{@prelim{}@mtunsafe{@mtuinit{} @mtasuconst{:mallopt}}@asunsafe{@asuinit{} @asulock{}}@acunsafe{@acuinit{} @aculock{}}}
@c Accessing mp_.n_mmaps and mp_.max_mmapped_mem, modified with atomics @c Accessing mp_.n_mmaps and mp_.max_mmapped_mem, modified with atomics
@ -1564,7 +1564,7 @@ space's data segment).
@c mark the statistics as unsafe, rather than the fast-path functions @c mark the statistics as unsafe, rather than the fast-path functions
@c that collect the possibly inconsistent data. @c that collect the possibly inconsistent data.
@c __libc_mallinfo @mtuinit @mtasuconst:mallopt @asuinit @asulock @aculock @c __libc_mallinfo2 @mtuinit @mtasuconst:mallopt @asuinit @asulock @aculock
@c ptmalloc_init (once) dup @mtsenv @asulock @aculock @acsfd @acsmem @c ptmalloc_init (once) dup @mtsenv @asulock @aculock @acsfd @acsmem
@c mutex_lock dup @asulock @aculock @c mutex_lock dup @asulock @aculock
@c int_mallinfo @mtasuconst:mallopt [mp_ access on main_arena] @c int_mallinfo @mtasuconst:mallopt [mp_ access on main_arena]
@ -1577,7 +1577,7 @@ space's data segment).
@c mutex_unlock @aculock @c mutex_unlock @aculock
This function returns information about the current dynamic memory usage This function returns information about the current dynamic memory usage
in a structure of type @code{struct mallinfo}. in a structure of type @code{struct mallinfo2}.
@end deftypefun @end deftypefun
@node Summary of Malloc @node Summary of Malloc
@ -1644,7 +1644,7 @@ A pointer to a function that @code{free} uses whenever it is called.
A pointer to a function that @code{aligned_alloc}, @code{memalign}, A pointer to a function that @code{aligned_alloc}, @code{memalign},
@code{posix_memalign} and @code{valloc} use whenever they are called. @code{posix_memalign} and @code{valloc} use whenever they are called.
@item struct mallinfo mallinfo (void) @item struct mallinfo2 mallinfo2 (void)
Return information about the current dynamic memory usage. Return information about the current dynamic memory usage.
@xref{Statistics of Malloc}. @xref{Statistics of Malloc}.
@end table @end table
@ -1970,7 +1970,7 @@ In addition, very old applications may use the obsolete @code{cfree}
function. function.
Further @code{malloc}-related functions such as @code{mallopt} or Further @code{malloc}-related functions such as @code{mallopt} or
@code{mallinfo} will not have any effect or return incorrect statistics @code{mallinfo2} will not have any effect or return incorrect statistics
when a replacement @code{malloc} is in use. However, failure to replace when a replacement @code{malloc} is in use. However, failure to replace
these functions typically does not result in crashes or other incorrect these functions typically does not result in crashes or other incorrect
application behavior, but may result in static linking failures. application behavior, but may result in static linking failures.