+/* Purge stack */
+
+SilcBool silc_stack_purge(SilcStack stack)
+{
+ SilcStackDataEntry e;
+ SilcBool ret = FALSE;
+ int i;
+
+ SILC_LOG_DEBUG(("Purge stack %p", stack));
+
+ /* Go through the default stack */
+ for (i = SILC_STACK_BLOCK_NUM - 1; i > 3; i--) {
+ if (stack->stack->data[i] &&
+ stack->stack->data[i]->bytes_left == SILC_STACK_BLOCK_SIZE(stack, i)) {
+ SILC_LOG_DEBUG(("Purge %d bytes",
+ SILC_STACK_BLOCK_SIZE(stack, i)));
+ silc_free(stack->stack->data[i]);
+ stack->stack->data[i] = NULL;
+ ret = TRUE;
+ }
+ }
+
+ silc_mutex_lock(stack->lock);
+
+ /* Remove one child stack */
+ if (silc_list_count(stack->stacks) > 2) {
+ silc_list_start(stack->stacks);
+ e = silc_list_get(stack->stacks);
+
+ SILC_LOG_DEBUG(("Remove stack blocks %p", e->data));
+ silc_list_del(stack->stacks, e);
+ ret = TRUE;
+
+ for (i = 0; i < SILC_STACK_BLOCK_NUM; i++)
+ silc_free(e->data[i]);
+ silc_free(e);
+ }
+
+ /* Go through the child stacks */
+ silc_list_start(stack->stacks);
+ while ((e = silc_list_get(stack->stacks))) {
+ for (i = SILC_STACK_BLOCK_NUM - 1; i > 3; i--) {
+ if (e->data[i]) {
+ SILC_LOG_DEBUG(("Purge %d bytes",
+ SILC_STACK_BLOCK_SIZE(stack, i)));
+ silc_free(e->data[i]);
+ e->data[i] = NULL;
+ ret = TRUE;
+ }
+ }
+ }
+
+ silc_mutex_unlock(stack->lock);
+
+ return ret;
+}
+