|
|
1.1 root 1: /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2: /*
3: * The contents of this file are subject to the Mozilla Public
4: * License Version 1.1 (the "License"); you may not use this file
5: * except in compliance with the License. You may obtain a copy of
6: * the License at http://www.mozilla.org/MPL/
7: *
8: * Software distributed under the License is distributed on an "AS
9: * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
10: * implied. See the License for the specific language governing
11: * rights and limitations under the License.
12: *
13: * The Original Code is the Netscape Portable Runtime (NSPR).
14: *
15: * The Initial Developer of the Original Code is Netscape
16: * Communications Corporation. Portions created by Netscape are
17: * Copyright (C) 1998-2000 Netscape Communications Corporation. All
18: * Rights Reserved.
19: *
20: * Contributor(s):
21: *
22: * Alternatively, the contents of this file may be used under the
23: * terms of the GNU General Public License Version 2 or later (the
24: * "GPL"), in which case the provisions of the GPL are applicable
25: * instead of those above. If you wish to allow use of your
26: * version of this file only under the terms of the GPL and not to
27: * allow others to use your version of this file under the MPL,
28: * indicate your decision by deleting the provisions above and
29: * replace them with the notice and other provisions required by
30: * the GPL. If you do not delete the provisions above, a recipient
31: * may use your version of this file under either the MPL or the
32: * GPL.
33: */
34:
35: /*
36: ** File: prmem.h
37: ** Description: API to NSPR 2.0 memory management functions
38: **
39: */
40: #ifndef prmem_h___
41: #define prmem_h___
42:
43: #include "prtypes.h"
44: #include <stddef.h>
45: #include <stdlib.h>
46:
47: PR_BEGIN_EXTERN_C
48:
49: /*
50: ** Thread safe memory allocation.
51: **
52: ** NOTE: pr wraps up malloc, free, calloc, realloc so they are already
53: ** thread safe (and are not declared here - look in stdlib.h).
54: */
55:
56: /*
57: ** PR_Malloc, PR_Calloc, PR_Realloc, and PR_Free have the same signatures
58: ** as their libc equivalent malloc, calloc, realloc, and free, and have
59: ** the same semantics. (Note that the argument type size_t is replaced
60: ** by PRUint32.) Memory allocated by PR_Malloc, PR_Calloc, or PR_Realloc
61: ** must be freed by PR_Free.
62: */
63:
64: NSPR_API(void *) PR_Malloc(PRUint32 size);
65:
66: NSPR_API(void *) PR_Calloc(PRUint32 nelem, PRUint32 elsize);
67:
68: NSPR_API(void *) PR_Realloc(void *ptr, PRUint32 size);
69:
70: NSPR_API(void) PR_Free(void *ptr);
71:
72: /*
73: ** The following are some convenience macros defined in terms of
74: ** PR_Malloc, PR_Calloc, PR_Realloc, and PR_Free.
75: */
76:
77: /***********************************************************************
78: ** FUNCTION: PR_MALLOC()
79: ** DESCRIPTION:
80: ** PR_NEW() allocates an untyped item of size _size from the heap.
81: ** INPUTS: _size: size in bytes of item to be allocated
82: ** OUTPUTS: untyped pointer to the node allocated
83: ** RETURN: pointer to node or error returned from malloc().
84: ***********************************************************************/
85: #define PR_MALLOC(_bytes) (PR_Malloc((_bytes)))
86:
87: /***********************************************************************
88: ** FUNCTION: PR_NEW()
89: ** DESCRIPTION:
90: ** PR_NEW() allocates an item of type _struct from the heap.
91: ** INPUTS: _struct: a data type
92: ** OUTPUTS: pointer to _struct
93: ** RETURN: pointer to _struct or error returns from malloc().
94: ***********************************************************************/
95: #define PR_NEW(_struct) ((_struct *) PR_MALLOC(sizeof(_struct)))
96:
97: /***********************************************************************
98: ** FUNCTION: PR_REALLOC()
99: ** DESCRIPTION:
100: ** PR_REALLOC() re-allocates _ptr bytes from the heap as a _size
101: ** untyped item.
102: ** INPUTS: _ptr: pointer to node to reallocate
103: ** _size: size of node to allocate
104: ** OUTPUTS: pointer to node allocated
105: ** RETURN: pointer to node allocated
106: ***********************************************************************/
107: #define PR_REALLOC(_ptr, _size) (PR_Realloc((_ptr), (_size)))
108:
109: /***********************************************************************
110: ** FUNCTION: PR_CALLOC()
111: ** DESCRIPTION:
112: ** PR_CALLOC() allocates a _size bytes untyped item from the heap
113: ** and sets the allocated memory to all 0x00.
114: ** INPUTS: _size: size of node to allocate
115: ** OUTPUTS: pointer to node allocated
116: ** RETURN: pointer to node allocated
117: ***********************************************************************/
118: #define PR_CALLOC(_size) (PR_Calloc(1, (_size)))
119:
120: /***********************************************************************
121: ** FUNCTION: PR_NEWZAP()
122: ** DESCRIPTION:
123: ** PR_NEWZAP() allocates an item of type _struct from the heap
124: ** and sets the allocated memory to all 0x00.
125: ** INPUTS: _struct: a data type
126: ** OUTPUTS: pointer to _struct
127: ** RETURN: pointer to _struct
128: ***********************************************************************/
129: #define PR_NEWZAP(_struct) ((_struct*)PR_Calloc(1, sizeof(_struct)))
130:
131: /***********************************************************************
132: ** FUNCTION: PR_DELETE()
133: ** DESCRIPTION:
134: ** PR_DELETE() unallocates an object previosly allocated via PR_NEW()
135: ** or PR_NEWZAP() to the heap.
136: ** INPUTS: pointer to previously allocated object
137: ** OUTPUTS: the referenced object is returned to the heap
138: ** RETURN: void
139: ***********************************************************************/
140: #define PR_DELETE(_ptr) { PR_Free(_ptr); (_ptr) = NULL; }
141:
142: /***********************************************************************
143: ** FUNCTION: PR_FREEIF()
144: ** DESCRIPTION:
145: ** PR_FREEIF() conditionally unallocates an object previously allocated
146: ** vial PR_NEW() or PR_NEWZAP(). If the pointer to the object is
147: ** equal to zero (0), the object is not released.
148: ** INPUTS: pointer to previously allocated object
149: ** OUTPUTS: the referenced object is conditionally returned to the heap
150: ** RETURN: void
151: ***********************************************************************/
152: #define PR_FREEIF(_ptr) if (_ptr) PR_DELETE(_ptr)
153:
154: PR_END_EXTERN_C
155:
156: #endif /* prmem_h___ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.