|
@@ -464,18 +464,6 @@ void free(void *p)
|
|
|
if (next->psize != self->csize) a_crash();
|
|
|
|
|
|
for (;;) {
|
|
|
- /* Replace middle of large chunks with fresh zero pages */
|
|
|
- if (reclaim && (self->psize & next->csize & C_INUSE)) {
|
|
|
- uintptr_t a = (uintptr_t)self + SIZE_ALIGN+PAGE_SIZE-1 & -PAGE_SIZE;
|
|
|
- uintptr_t b = (uintptr_t)next - SIZE_ALIGN & -PAGE_SIZE;
|
|
|
-#if 1
|
|
|
- __madvise((void *)a, b-a, MADV_DONTNEED);
|
|
|
-#else
|
|
|
- __mmap((void *)a, b-a, PROT_READ|PROT_WRITE,
|
|
|
- MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
|
|
|
-#endif
|
|
|
- }
|
|
|
-
|
|
|
if (self->psize & next->csize & C_INUSE) {
|
|
|
self->csize = final_size | C_INUSE;
|
|
|
next->psize = final_size | C_INUSE;
|
|
@@ -505,6 +493,9 @@ void free(void *p)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (!(mal.binmap & 1ULL<<i))
|
|
|
+ a_or_64(&mal.binmap, 1ULL<<i);
|
|
|
+
|
|
|
self->csize = final_size;
|
|
|
next->psize = final_size;
|
|
|
unlock(mal.free_lock);
|
|
@@ -514,8 +505,17 @@ void free(void *p)
|
|
|
self->next->prev = self;
|
|
|
self->prev->next = self;
|
|
|
|
|
|
- if (!(mal.binmap & 1ULL<<i))
|
|
|
- a_or_64(&mal.binmap, 1ULL<<i);
|
|
|
+ /* Replace middle of large chunks with fresh zero pages */
|
|
|
+ if (reclaim) {
|
|
|
+ uintptr_t a = (uintptr_t)self + SIZE_ALIGN+PAGE_SIZE-1 & -PAGE_SIZE;
|
|
|
+ uintptr_t b = (uintptr_t)next - SIZE_ALIGN & -PAGE_SIZE;
|
|
|
+#if 1
|
|
|
+ __madvise((void *)a, b-a, MADV_DONTNEED);
|
|
|
+#else
|
|
|
+ __mmap((void *)a, b-a, PROT_READ|PROT_WRITE,
|
|
|
+ MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);
|
|
|
+#endif
|
|
|
+ }
|
|
|
|
|
|
unlock_bin(i);
|
|
|
}
|