Annotation of embedaddon/rsync/lib/pool_alloc.3, revision 1.1
1.1 ! misho 1: .ds d \-\^\-
! 2: .ds o \fR[\fP
! 3: .ds c \fR]\fP
! 4: .ds | \fR|\fP
! 5: .de D
! 6: \\.B \*d\\$1
! 7: ..
! 8: .de DI
! 9: \\.BI \*d\\$1 \\$2
! 10: ..
! 11: .de DR
! 12: \\.BR \*d\\$1 \\$2
! 13: ..
! 14: .de Di
! 15: \\.BI \*d\\$1 " \\$2"
! 16: ..
! 17: .de Db
! 18: \\.B \*d\\$1 " \\$2"
! 19: ..
! 20: .de Df
! 21: \\.B \*d\*ono\*c\\$1
! 22: ..
! 23: .de See
! 24: See \fB\\$1\fP for details.
! 25: ..
! 26: .de SeeIn
! 27: See \fB\\$1\fP in \fB\\$2\fP for details.
! 28: ..
! 29: .TH POOL_ALLOC 3
! 30: .SH NAME
! 31: pool_alloc, pool_free, pool_free_old, pool_talloc, pool_tfree, pool_create, pool_destroy, pool_boundary
! 32: \- Allocate and free memory in managed allocation pools.
! 33: .SH SYNOPSIS
! 34: .B #include "pool_alloc.h"
! 35:
! 36: \fBstruct alloc_pool *pool_create(size_t \fIsize\fB, size_t \fIquantum\fB, void (*\fIbomb\fB)(char *), int \fIflags\fB);
! 37:
! 38: \fBvoid pool_destroy(struct alloc_pool *\fIpool\fB);
! 39:
! 40: \fBvoid *pool_alloc(struct alloc_pool *\fIpool\fB, size_t \fIsize\fB, char *\fImsg\fB);
! 41:
! 42: \fBvoid pool_free(struct alloc_pool *\fIpool\fB, size_t \fIsize\fB, void *\fIaddr\fB);
! 43:
! 44: \fBvoid pool_free_old(struct alloc_pool *\fIpool\fB, void *\fIaddr\fB);
! 45:
! 46: \fBvoid *pool_talloc(struct alloc_pool *\fIpool\fB, \fItype\fB), int \fIcount\fB, char *\fImsg\fB);
! 47:
! 48: \fBvoid pool_tfree(struct alloc_pool *\fIpool\fB, \fItype\fB, int \fIcount\fB, void *\fIaddr\fB);
! 49:
! 50: \fBvoid pool_boundary(struct alloc_pool *\fIpool\fB, sise_t \fIsize\fB);
! 51: .SH DESCRIPTION
! 52: .P
! 53: The pool allocation routines use
! 54: .B malloc()
! 55: for underlying memory management.
! 56: What allocation pools do is cause memory within a given pool
! 57: to be allocated in large contiguous blocks
! 58: (called extents) that will be reusable when freed. Unlike
! 59: .BR malloc() ,
! 60: the allocations are not managed individually.
! 61: Instead, each extent tracks the total free memory within the
! 62: extent. Each extent can either be used to allocate memory
! 63: or to manage the freeing of memory within that extent.
! 64: When an extent has less free memory than a given
! 65: allocation request, the current extent ceases to be used
! 66: for allocation. See also the
! 67: .B pool_boundary()
! 68: function.
! 69: .P
! 70: This form of memory management is suited to large numbers of small
! 71: related allocations that are held for a while
! 72: and then freed as a group.
! 73: Because the
! 74: underlying allocations are done in large contiguous extents,
! 75: when an extent is freed, it can release a large enough
! 76: contiguous block of memory to allow the memory to be returned
! 77: to the OS for use by whatever program needs it.
! 78: You can allocate from one or more memory pools and/or
! 79: .B malloc()
! 80: all at the same time without interfering with how pools work.
! 81: .P
! 82: .B pool_create()
! 83: Creates an allocation pool for subsequent calls to the pool
! 84: allocation functions.
! 85: When an extent is created for allocations it will be
! 86: .I size
! 87: bytes.
! 88: Allocations from the pool have their sizes rounded up to a
! 89: multiple of
! 90: .I quantum
! 91: bytes in length.
! 92: Specifying
! 93: .B 0
! 94: for
! 95: .I quantum
! 96: will produce a quantum that should meet maximal alignment
! 97: on most platforms.
! 98: If
! 99: .B POOL_QALIGN
! 100: is set in the
! 101: .IR flags ,
! 102: allocations will be aligned to addresses that are a
! 103: multiple of
! 104: .IR quantum .
! 105: If
! 106: .B POOL_CLEAR
! 107: is set in the
! 108: .IR flags ,
! 109: all allocations from the pool will be initialized to zeros.
! 110: You may specify a
! 111: .B NULL
! 112: for the
! 113: .I bomb
! 114: function pointer if you don't wish to use it. (See the
! 115: .B pool_alloc()
! 116: function for how it is used.)
! 117: .P
! 118: .B pool_destroy()
! 119: destroys an allocation
! 120: .I pool
! 121: and frees all its associated memory.
! 122: .P
! 123: .B pool_alloc()
! 124: allocates
! 125: .I size
! 126: bytes from the specified
! 127: .IR pool .
! 128: If
! 129: .I size
! 130: is
! 131: .BR 0 ,
! 132: .I quantum
! 133: bytes will be allocated.
! 134: If the pool has been created with
! 135: .BR POOL_QALIGN ,
! 136: every chunk of memory that is returned will be suitably aligned.
! 137: You can use this with the default
! 138: .I quantum
! 139: size to ensure that all memory can store a variable of any type.
! 140: If the requested memory cannot be allocated, the
! 141: .I bomb()
! 142: function will be called with
! 143: .I msg
! 144: as its sole argument (if the function was defined at the time
! 145: the pool was created), and then a
! 146: .B NULL
! 147: address is returned (assuming that the bomb function didn't exit).
! 148: .P
! 149: .B pool_free()
! 150: frees
! 151: .I size
! 152: bytes pointed to by an
! 153: .I addr
! 154: that was previously allocated in the specified
! 155: .IR pool .
! 156: If
! 157: .I size
! 158: is
! 159: .BR 0 ,
! 160: .I quantum
! 161: bytes will be freed.
! 162: The memory freed within an extent will not be reusable until
! 163: all of the memory in that extent has been freed with one
! 164: exception: the most recent pool allocation may be freed back
! 165: into the pool prior to making any further allocations.
! 166: If enough free calls are made to indicate that an extent has no
! 167: remaining allocated objects (as computed by the total freed size for
! 168: an extent), its memory will be completely freed back to the system.
! 169: If
! 170: .I addr
! 171: is
! 172: .BR 0 ,
! 173: no memory will be freed, but subsequent allocations will come
! 174: from a new extent.
! 175: .P
! 176: .B pool_free_old()
! 177: takes a boundary
! 178: .I addr
! 179: value that was returned by
! 180: .B pool_boundary()
! 181: and frees up any extents in the
! 182: .I pool
! 183: that have data allocated from that point backward in time.
! 184: NOTE: you must NOT mix calls to both
! 185: .B pool_free
! 186: and
! 187: .B pool_free_old
! 188: on the same pool!
! 189: .P
! 190: .B pool_boundary()
! 191: asks for a boundary value that can be sent to
! 192: .B pool_free_old()
! 193: at a later time to free up all memory allocated prior to a particular
! 194: moment in time.
! 195: If the extent that holds the boundary point has allocations from after the
! 196: boundary point, it will not be freed until a future
! 197: .B pool_free_old()
! 198: call encompasses the entirety of the extent's data.
! 199: If
! 200: .I len
! 201: is non-zero, the call will also check if the active extent has at least
! 202: that much free memory available in it, and if not, it will mark the
! 203: extent as inactive, forcing a new extent to be used for future allocations.
! 204: (You can specify -1 for
! 205: .I len
! 206: if you want to force a new extent to start.)
! 207: .P
! 208: .B pool_talloc()
! 209: is a macro that takes a
! 210: .I type
! 211: and a
! 212: .I count
! 213: instead of a
! 214: .IR size .
! 215: It casts the return value to the correct pointer type.
! 216: .P
! 217: .B pool_tfree
! 218: is a macro that calls
! 219: .B pool_free
! 220: on memory that was allocated by
! 221: .BR pool_talloc() .
! 222: .SH RETURN VALUE
! 223: .B pool_create()
! 224: returns a pointer to
! 225: .BR "struct alloc_pool" .
! 226: .P
! 227: .B pool_alloc()
! 228: and
! 229: .B pool_talloc()
! 230: return pointers to the allocated memory,
! 231: or NULL if the request fails.
! 232: The return type of
! 233: .B pool_alloc()
! 234: will normally require casting to the desired type but
! 235: .B pool_talloc()
! 236: will returns a pointer of the requested
! 237: .IR type .
! 238: .P
! 239: .B pool_boundary()
! 240: returns a pointer that should only be used in a call to
! 241: .BR pool_free_old() .
! 242: .P
! 243: .BR pool_free() ,
! 244: .BR pool_free_old() ,
! 245: .B pool_tfree()
! 246: and
! 247: .B pool_destroy()
! 248: return no value.
! 249: .SH SEE ALSO
! 250: .nf
! 251: malloc(3)
! 252: .SH AUTHOR
! 253: pool_alloc was created by J.W. Schultz of Pegasystems Technologies.
! 254: .SH BUGS AND ISSUES
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>