Annotation of embedaddon/rsync/lib/pool_alloc.3, revision 1.1.1.3

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: 
1.1.1.3 ! misho      36: \fBstruct alloc_pool *pool_create(size_t \fIsize\fB, size_t \fIquantum\fB, void (*\fIbomb\fB)(char*,char*,int), int \fIflags\fB);
1.1       misho      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.
1.1.1.2   misho      98: Unless
                     99: .B POOL_NO_QALIGN
1.1       misho     100: is set in the
                    101: .IR flags ,
                    102: allocations will be aligned to addresses that are a
                    103: multiple of
                    104: .IR quantum .
1.1.1.2   misho     105: A
                    106: .B NULL
                    107: may be specified for the
                    108: .I bomb
                    109: function pointer if it is not needed.  (See the
                    110: .B pool_alloc()
                    111: function for how it is used.)
1.1       misho     112: If
                    113: .B POOL_CLEAR
                    114: is set in the
                    115: .IR flags ,
                    116: all allocations from the pool will be initialized to zeros.
1.1.1.2   misho     117: If either
                    118: .B POOL_PREPEND
                    119: or
                    120: .B POOL_INTERN
                    121: is specified in the
                    122: .IR flags ,
                    123: each extent's data structure will be allocated at the start of the
                    124: .IR size -length
                    125: buffer (rather than as a separate, non-pool allocation), with the
                    126: former extending the
                    127: .I size
                    128: to hold the structure, and the latter subtracting the structure's
                    129: length from the indicated
                    130: .IR size .
1.1       misho     131: .P
                    132: .B pool_destroy()
                    133: destroys an allocation
                    134: .I pool
                    135: and frees all its associated memory.
                    136: .P
                    137: .B pool_alloc()
                    138: allocates
                    139: .I size
                    140: bytes from the specified
                    141: .IR pool .
                    142: If
                    143: .I size
                    144: is
                    145: .BR 0 ,
                    146: .I quantum
                    147: bytes will be allocated.
1.1.1.2   misho     148: If the pool has been created without
                    149: .BR POOL_NO_QALIGN ,
1.1       misho     150: every chunk of memory that is returned will be suitably aligned.
                    151: You can use this with the default
                    152: .I quantum
                    153: size to ensure that all memory can store a variable of any type.
                    154: If the requested memory cannot be allocated, the
                    155: .I bomb()
                    156: function will be called with
                    157: .I msg
                    158: as its sole argument (if the function was defined at the time
                    159: the pool was created), and then a
                    160: .B NULL
                    161: address is returned (assuming that the bomb function didn't exit).
                    162: .P
                    163: .B pool_free()
                    164: frees
                    165: .I size
                    166: bytes pointed to by an
                    167: .I addr
                    168: that was previously allocated in the specified
                    169: .IR pool .
                    170: If
                    171: .I size
                    172: is
                    173: .BR 0 ,
                    174: .I quantum
                    175: bytes will be freed.
                    176: The memory freed within an extent will not be reusable until
                    177: all of the memory in that extent has been freed with one
                    178: exception: the most recent pool allocation may be freed back
                    179: into the pool prior to making any further allocations.
                    180: If enough free calls are made to indicate that an extent has no
                    181: remaining allocated objects (as computed by the total freed size for
                    182: an extent), its memory will be completely freed back to the system.
                    183: If
                    184: .I addr
                    185: is
1.1.1.2   misho     186: .BR NULL ,
1.1       misho     187: no memory will be freed, but subsequent allocations will come
                    188: from a new extent.
                    189: .P
                    190: .B pool_free_old()
                    191: takes a boundary
                    192: .I addr
                    193: value that was returned by
                    194: .B pool_boundary()
                    195: and frees up any extents in the
                    196: .I pool
                    197: that have data allocated from that point backward in time.
                    198: NOTE: you must NOT mix calls to both
                    199: .B pool_free
                    200: and
                    201: .B pool_free_old
                    202: on the same pool!
                    203: .P
                    204: .B pool_boundary()
                    205: asks for a boundary value that can be sent to 
                    206: .B pool_free_old()
                    207: at a later time to free up all memory allocated prior to a particular
                    208: moment in time.
                    209: If the extent that holds the boundary point has allocations from after the
                    210: boundary point, it will not be freed until a future
                    211: .B pool_free_old()
                    212: call encompasses the entirety of the extent's data.
                    213: If
                    214: .I len
                    215: is non-zero, the call will also check if the active extent has at least
                    216: that much free memory available in it, and if not, it will mark the
                    217: extent as inactive, forcing a new extent to be used for future allocations.
                    218: (You can specify -1 for
                    219: .I len
                    220: if you want to force a new extent to start.)
                    221: .P
                    222: .B pool_talloc()
                    223: is a macro that takes a
                    224: .I type
                    225: and a
                    226: .I count
                    227: instead of a
                    228: .IR size .
                    229: It casts the return value to the correct pointer type.
                    230: .P
                    231: .B pool_tfree
                    232: is a macro that calls
                    233: .B pool_free
                    234: on memory that was allocated by
                    235: .BR pool_talloc() .
                    236: .SH RETURN VALUE
                    237: .B pool_create()
                    238: returns a pointer to
                    239: .BR "struct alloc_pool" .
                    240: .P
                    241: .B pool_alloc()
                    242: and
                    243: .B pool_talloc()
                    244: return pointers to the allocated memory,
                    245: or NULL if the request fails.
                    246: The return type of
                    247: .B pool_alloc()
                    248: will normally require casting to the desired type but
                    249: .B pool_talloc()
                    250: will returns a pointer of the requested
                    251: .IR type .
                    252: .P
                    253: .B pool_boundary()
                    254: returns a pointer that should only be used in a call to
                    255: .BR pool_free_old() .
                    256: .P
                    257: .BR pool_free() ,
                    258: .BR pool_free_old() ,
                    259: .B pool_tfree()
                    260: and
                    261: .B pool_destroy()
                    262: return no value.
                    263: .SH SEE ALSO
                    264: .nf
                    265: malloc(3)
                    266: .SH AUTHOR
                    267: pool_alloc was created by J.W. Schultz of Pegasystems Technologies.
                    268: .SH BUGS AND ISSUES

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>