summaryrefslogtreecommitdiff
path: root/util/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/alloc.c')
-rw-r--r--util/alloc.c42
1 files changed, 32 insertions, 10 deletions
diff --git a/util/alloc.c b/util/alloc.c
index 2c6e1a23f6c02..908b1f42361f2 100644
--- a/util/alloc.c
+++ b/util/alloc.c
@@ -126,10 +126,40 @@ alloc_init(struct alloc_cache* alloc, struct alloc_cache* super,
}
}
+/** free the special list */
+static void
+alloc_clear_special_list(struct alloc_cache* alloc)
+{
+ alloc_special_type* p, *np;
+ /* free */
+ p = alloc->quar;
+ while(p) {
+ np = alloc_special_next(p);
+ /* deinit special type */
+ lock_rw_destroy(&p->entry.lock);
+ free(p);
+ p = np;
+ }
+}
+
+void
+alloc_clear_special(struct alloc_cache* alloc)
+{
+ if(!alloc->super) {
+ lock_quick_lock(&alloc->lock);
+ }
+ alloc_clear_special_list(alloc);
+ alloc->quar = 0;
+ alloc->num_quar = 0;
+ if(!alloc->super) {
+ lock_quick_unlock(&alloc->lock);
+ }
+}
+
void
alloc_clear(struct alloc_cache* alloc)
{
- alloc_special_type* p, *np;
+ alloc_special_type* p;
struct regional* r, *nr;
if(!alloc)
return;
@@ -147,15 +177,7 @@ alloc_clear(struct alloc_cache* alloc)
alloc->super->num_quar += alloc->num_quar;
lock_quick_unlock(&alloc->super->lock);
} else {
- /* free */
- p = alloc->quar;
- while(p) {
- np = alloc_special_next(p);
- /* deinit special type */
- lock_rw_destroy(&p->entry.lock);
- free(p);
- p = np;
- }
+ alloc_clear_special_list(alloc);
}
alloc->quar = 0;
alloc->num_quar = 0;