silc_stack_alloc automatically aligns the stack size.
[silc.git] / lib / silcutil / silcstack.h
index c60cd7b7221b76b92855b49ffaa805c39edc6336..c4415a17c15978d385ebddeb8ba70cce903ae372 100644 (file)
@@ -125,8 +125,7 @@ typedef void (*SilcStackOomHandler)(SilcStack stack, void *context);
  *    allocation by various routines.  Returns the pointer to the stack
  *    that must be freed with silc_stack_free function when it is not
  *    needed anymore.  If the `stack_size' is zero (0) by default a
- *    1 kilobyte (1024 bytes) stack is allocated.  If the `stack_size'
- *    is non-zero the byte value must be multiple by 8.
+ *    1 kilobyte (1024 bytes) stack is allocated.
  *
  *    If `parent' is non-NULL the created stack is a child of the `parent'
  *    stack.  All of childs the memory is allocated from the `parent' and
@@ -281,16 +280,17 @@ void *silc_stack_malloc(SilcStack stack, SilcUInt32 size);
  * SYNOPSIS
  *
  *    void *silc_stack_realloc(SilcStack stack, SilcUInt32 old_size,
- *                             *void *ptr, SilcUInt32 size);
+ *                             void *ptr, SilcUInt32 size);
  *
  * DESCRIPTION
  *
  *    Attempts to reallocate memory by changing the size of the `ptr' into
  *    `size'.  This routine works only if the previous allocation to `stack'
  *    was `ptr'.  If there is another memory allocation between allocating
- *    `ptr' and this call this routine will return NULL.  NULL is also
- *    returned if the `size' does not fit into the current stack block.
- *    If NULL is returned the old memory remains intact.
+ *    `ptr' and this call this routine will return NULL (and silc_errno is
+ *    set to SILC_ERR_INVALID_ARGUMENT).  NULL is also returned if the `size'
+ *    does not fit into the current stack block.  If NULL is returned the old
+ *    memory remains intact.
  *
  * NOTES
  *
@@ -365,6 +365,25 @@ void silc_stack_set_alignment(SilcStack stack, SilcUInt32 alignment);
  ***/
 SilcUInt32 silc_stack_get_alignment(SilcStack stack);
 
+/****f* silcutil/SilcStackAPI/silc_stack_purge
+ *
+ * SYNOPSIS
+ *
+ *    SilcBool silc_stack_purge(SilcStack stack);
+ *
+ * DESCRIPTION
+ *
+ *    Purges the `stack' from extra unused memory.  This purges only `stack'
+ *    and not its parent if `stack' is a child.  This purges only large
+ *    allocations.  The 1024, 2048, 4096 and 8192 bytes of allocations remain.
+ *    Call this multiple times to purge even more.  Returns FALSE when there
+ *    is no more to purge.  This does not purge memory blocks that currently
+ *    have allocations.  No memory allocations from the stack are lost, so
+ *    this is always safe to call.
+ *
+ ***/
+SilcBool silc_stack_purge(SilcStack stack);
+
 #include "silcstack_i.h"
 
 #endif /* SILCSTACK_H */