1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* xalloc.h -- malloc with out-of-memory checking 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 305436638acc7c010349a69c3395f1a57c642dc62Ying Wang Copyright (C) 1990-2000, 2003-2004, 2006-2012 Free Software Foundation, Inc. 4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 505436638acc7c010349a69c3395f1a57c642dc62Ying Wang This program is free software: you can redistribute it and/or modify 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project it under the terms of the GNU General Public License as published by 705436638acc7c010349a69c3395f1a57c642dc62Ying Wang the Free Software Foundation; either version 3 of the License, or 805436638acc7c010349a69c3395f1a57c642dc62Ying Wang (at your option) any later version. 9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is distributed in the hope that it will be useful, 11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GNU General Public License for more details. 14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project You should have received a copy of the GNU General Public License 1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef XALLOC_H_ 1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XALLOC_H_ 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <stddef.h> 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "xalloc-oversized.h" 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang_GL_INLINE_HEADER_BEGIN 2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifndef XALLOC_INLINE 2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define XALLOC_INLINE _GL_INLINE 2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern "C" { 3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ >= 3 3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__)) 3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_MALLOC 3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) 4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args)) 4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else 4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define _GL_ATTRIBUTE_ALLOC_SIZE(args) 4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This function is always triggered when memory is exhausted. 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project It must be defined by the application, either explicitly 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project or by using gnulib's xalloc-die module. This is the 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project function to call when one wants the program to die because of a 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project memory allocation failure. */ 5205436638acc7c010349a69c3395f1a57c642dc62Ying Wangextern _Noreturn void xalloc_die (void); 5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 5405436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xmalloc (size_t s) 5505436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); 5605436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xzalloc (size_t s) 5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); 5805436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xcalloc (size_t n, size_t s) 5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); 6005436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xrealloc (void *p, size_t s) 6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_ALLOC_SIZE ((2)); 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid *x2realloc (void *p, size_t *pn); 6305436638acc7c010349a69c3395f1a57c642dc62Ying Wangvoid *xmemdup (void const *p, size_t s) 6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((2)); 6505436638acc7c010349a69c3395f1a57c642dc62Ying Wangchar *xstrdup (char const *str) 6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_MALLOC; 6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* In the following macros, T must be an elementary or structure/union or 6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang typedef'ed type, or a pointer to such a type. To apply one of the 7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang following macros to a function pointer or array type, you need to typedef 7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang it first and use the typedef name. */ 7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate an object of type T dynamically, with error checking. */ 7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* extern t *XMALLOC (typename t); */ 7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XMALLOC(t) ((t *) xmalloc (sizeof (t))) 7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate memory for N elements of type T, with error checking. */ 7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* extern t *XNMALLOC (size_t n, typename t); */ 7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XNMALLOC(n, t) \ 8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((t *) (sizeof (t) == 1 ? xmalloc (n) : xnmalloc (n, sizeof (t)))) 8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate an object of type T dynamically, with error checking, 8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang and zero it. */ 8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* extern t *XZALLOC (typename t); */ 8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XZALLOC(t) ((t *) xzalloc (sizeof (t))) 8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate memory for N elements of type T, with error checking, 8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang and zero it. */ 8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* extern t *XCALLOC (size_t n, typename t); */ 9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define XCALLOC(n, t) \ 9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang ((t *) (sizeof (t) == 1 ? xzalloc (n) : xcalloc (n, sizeof (t)))) 9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Allocate an array of N objects, each with S bytes of memory, 9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang dynamically, with error checking. S must be nonzero. */ 9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 9705436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void *xnmalloc (size_t n, size_t s) 9805436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1, 2)); 9905436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void * 10005436638acc7c010349a69c3395f1a57c642dc62Ying Wangxnmalloc (size_t n, size_t s) 10105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 10205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (xalloc_oversized (n, s)) 10305436638acc7c010349a69c3395f1a57c642dc62Ying Wang xalloc_die (); 10405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return xmalloc (n * s); 10505436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 10605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 10705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Change the size of an allocated block of memory P to an array of N 10805436638acc7c010349a69c3395f1a57c642dc62Ying Wang objects each of S bytes, with error checking. S must be nonzero. */ 10905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 11005436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void *xnrealloc (void *p, size_t n, size_t s) 11105436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_ALLOC_SIZE ((2, 3)); 11205436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void * 11305436638acc7c010349a69c3395f1a57c642dc62Ying Wangxnrealloc (void *p, size_t n, size_t s) 11405436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 11505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (xalloc_oversized (n, s)) 11605436638acc7c010349a69c3395f1a57c642dc62Ying Wang xalloc_die (); 11705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return xrealloc (p, n * s); 11805436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 11905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* If P is null, allocate a block of at least *PN such objects; 12105436638acc7c010349a69c3395f1a57c642dc62Ying Wang otherwise, reallocate P so that it contains more than *PN objects 12205436638acc7c010349a69c3395f1a57c642dc62Ying Wang each of S bytes. *PN must be nonzero unless P is null, and S must 12305436638acc7c010349a69c3395f1a57c642dc62Ying Wang be nonzero. Set *PN to the new number of objects, and return the 12405436638acc7c010349a69c3395f1a57c642dc62Ying Wang pointer to the new block. *PN is never set to zero, and the 12505436638acc7c010349a69c3395f1a57c642dc62Ying Wang returned pointer is never null. 12605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 12705436638acc7c010349a69c3395f1a57c642dc62Ying Wang Repeated reallocations are guaranteed to make progress, either by 12805436638acc7c010349a69c3395f1a57c642dc62Ying Wang allocating an initial block with a nonzero size, or by allocating a 12905436638acc7c010349a69c3395f1a57c642dc62Ying Wang larger block. 13005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13105436638acc7c010349a69c3395f1a57c642dc62Ying Wang In the following implementation, nonzero sizes are increased by a 13205436638acc7c010349a69c3395f1a57c642dc62Ying Wang factor of approximately 1.5 so that repeated reallocations have 13305436638acc7c010349a69c3395f1a57c642dc62Ying Wang O(N) overall cost rather than O(N**2) cost, but the 13405436638acc7c010349a69c3395f1a57c642dc62Ying Wang specification for this function does not guarantee that rate. 13505436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13605436638acc7c010349a69c3395f1a57c642dc62Ying Wang Here is an example of use: 13705436638acc7c010349a69c3395f1a57c642dc62Ying Wang 13805436638acc7c010349a69c3395f1a57c642dc62Ying Wang int *p = NULL; 13905436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t used = 0; 14005436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t allocated = 0; 14105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 14205436638acc7c010349a69c3395f1a57c642dc62Ying Wang void 14305436638acc7c010349a69c3395f1a57c642dc62Ying Wang append_int (int value) 14405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 14505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (used == allocated) 14605436638acc7c010349a69c3395f1a57c642dc62Ying Wang p = x2nrealloc (p, &allocated, sizeof *p); 14705436638acc7c010349a69c3395f1a57c642dc62Ying Wang p[used++] = value; 14805436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 14905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15005436638acc7c010349a69c3395f1a57c642dc62Ying Wang This causes x2nrealloc to allocate a block of some nonzero size the 15105436638acc7c010349a69c3395f1a57c642dc62Ying Wang first time it is called. 15205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15305436638acc7c010349a69c3395f1a57c642dc62Ying Wang To have finer-grained control over the initial size, set *PN to a 15405436638acc7c010349a69c3395f1a57c642dc62Ying Wang nonzero value before calling this function with P == NULL. For 15505436638acc7c010349a69c3395f1a57c642dc62Ying Wang example: 15605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 15705436638acc7c010349a69c3395f1a57c642dc62Ying Wang int *p = NULL; 15805436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t used = 0; 15905436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t allocated = 0; 16005436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t allocated1 = 1000; 16105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 16205436638acc7c010349a69c3395f1a57c642dc62Ying Wang void 16305436638acc7c010349a69c3395f1a57c642dc62Ying Wang append_int (int value) 16405436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 16505436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (used == allocated) 16605436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 16705436638acc7c010349a69c3395f1a57c642dc62Ying Wang p = x2nrealloc (p, &allocated1, sizeof *p); 16805436638acc7c010349a69c3395f1a57c642dc62Ying Wang allocated = allocated1; 16905436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 17005436638acc7c010349a69c3395f1a57c642dc62Ying Wang p[used++] = value; 17105436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 17205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 17305436638acc7c010349a69c3395f1a57c642dc62Ying Wang */ 17405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 17505436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE void * 17605436638acc7c010349a69c3395f1a57c642dc62Ying Wangx2nrealloc (void *p, size_t *pn, size_t s) 17705436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 17805436638acc7c010349a69c3395f1a57c642dc62Ying Wang size_t n = *pn; 17905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 18005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (! p) 18105436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 18205436638acc7c010349a69c3395f1a57c642dc62Ying Wang if (! n) 18305436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 18405436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* The approximate size to use for initial small allocation 18505436638acc7c010349a69c3395f1a57c642dc62Ying Wang requests, when the invoking code specifies an old size of 18605436638acc7c010349a69c3395f1a57c642dc62Ying Wang zero. This is the largest "small" request for the GNU C 18705436638acc7c010349a69c3395f1a57c642dc62Ying Wang library malloc. */ 18805436638acc7c010349a69c3395f1a57c642dc62Ying Wang enum { DEFAULT_MXFAST = 64 * sizeof (size_t) / 4 }; 18905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 19005436638acc7c010349a69c3395f1a57c642dc62Ying Wang n = DEFAULT_MXFAST / s; 19105436638acc7c010349a69c3395f1a57c642dc62Ying Wang n += !n; 19205436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 19305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 19405436638acc7c010349a69c3395f1a57c642dc62Ying Wang else 19505436638acc7c010349a69c3395f1a57c642dc62Ying Wang { 19605436638acc7c010349a69c3395f1a57c642dc62Ying Wang /* Set N = ceil (1.5 * N) so that progress is made if N == 1. 19705436638acc7c010349a69c3395f1a57c642dc62Ying Wang Check for overflow, so that N * S stays in size_t range. 19805436638acc7c010349a69c3395f1a57c642dc62Ying Wang The check is slightly conservative, but an exact check isn't 19905436638acc7c010349a69c3395f1a57c642dc62Ying Wang worth the trouble. */ 20005436638acc7c010349a69c3395f1a57c642dc62Ying Wang if ((size_t) -1 / 3 * 2 / s <= n) 20105436638acc7c010349a69c3395f1a57c642dc62Ying Wang xalloc_die (); 20205436638acc7c010349a69c3395f1a57c642dc62Ying Wang n += (n + 1) / 2; 20305436638acc7c010349a69c3395f1a57c642dc62Ying Wang } 20405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 20505436638acc7c010349a69c3395f1a57c642dc62Ying Wang *pn = n; 20605436638acc7c010349a69c3395f1a57c642dc62Ying Wang return xrealloc (p, n * s); 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 20805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 20905436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return a pointer to a new buffer of N bytes. This is like xmalloc, 21005436638acc7c010349a69c3395f1a57c642dc62Ying Wang except it returns char *. */ 21105436638acc7c010349a69c3395f1a57c642dc62Ying Wang 21205436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE char *xcharalloc (size_t n) 21305436638acc7c010349a69c3395f1a57c642dc62Ying Wang _GL_ATTRIBUTE_MALLOC _GL_ATTRIBUTE_ALLOC_SIZE ((1)); 21405436638acc7c010349a69c3395f1a57c642dc62Ying WangXALLOC_INLINE char * 21505436638acc7c010349a69c3395f1a57c642dc62Ying Wangxcharalloc (size_t n) 21605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 21705436638acc7c010349a69c3395f1a57c642dc62Ying Wang return XNMALLOC (n, char); 21805436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 21905436638acc7c010349a69c3395f1a57c642dc62Ying Wang 22005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#ifdef __cplusplus 22105436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 22205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 22305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* C++ does not allow conversions from void * to other pointer types 22405436638acc7c010349a69c3395f1a57c642dc62Ying Wang without a cast. Use templates to work around the problem when 22505436638acc7c010349a69c3395f1a57c642dc62Ying Wang possible. */ 22605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 22705436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T * 22805436638acc7c010349a69c3395f1a57c642dc62Ying Wangxrealloc (T *p, size_t s) 22905436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 23005436638acc7c010349a69c3395f1a57c642dc62Ying Wang return (T *) xrealloc ((void *) p, s); 23105436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 23205436638acc7c010349a69c3395f1a57c642dc62Ying Wang 23305436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T * 23405436638acc7c010349a69c3395f1a57c642dc62Ying Wangxnrealloc (T *p, size_t n, size_t s) 23505436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 23605436638acc7c010349a69c3395f1a57c642dc62Ying Wang return (T *) xnrealloc ((void *) p, n, s); 23705436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 23805436638acc7c010349a69c3395f1a57c642dc62Ying Wang 23905436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T * 24005436638acc7c010349a69c3395f1a57c642dc62Ying Wangx2realloc (T *p, size_t *pn) 24105436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 24205436638acc7c010349a69c3395f1a57c642dc62Ying Wang return (T *) x2realloc ((void *) p, pn); 24305436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 24405436638acc7c010349a69c3395f1a57c642dc62Ying Wang 24505436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T * 24605436638acc7c010349a69c3395f1a57c642dc62Ying Wangx2nrealloc (T *p, size_t *pn, size_t s) 24705436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 24805436638acc7c010349a69c3395f1a57c642dc62Ying Wang return (T *) x2nrealloc ((void *) p, pn, s); 24905436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 25005436638acc7c010349a69c3395f1a57c642dc62Ying Wang 25105436638acc7c010349a69c3395f1a57c642dc62Ying Wangtemplate <typename T> inline T * 25205436638acc7c010349a69c3395f1a57c642dc62Ying Wangxmemdup (T const *p, size_t s) 25305436638acc7c010349a69c3395f1a57c642dc62Ying Wang{ 25405436638acc7c010349a69c3395f1a57c642dc62Ying Wang return (T *) xmemdup ((void const *) p, s); 25505436638acc7c010349a69c3395f1a57c642dc62Ying Wang} 25605436638acc7c010349a69c3395f1a57c642dc62Ying Wang 25705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif 258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* !XALLOC_H_ */ 261