[pypy-commit] stmgc c5: Tweaks

arigo noreply at buildbot.pypy.org
Fri Dec 20 17:59:41 CET 2013


Author: Armin Rigo <arigo at tunes.org>
Branch: c5
Changeset: r580:f33785501e2c
Date: 2013-12-20 17:59 +0100
http://bitbucket.org/pypy/stmgc/changeset/f33785501e2c/

Log:	Tweaks

diff --git a/c5/largemalloc.c b/c5/largemalloc.c
--- a/c5/largemalloc.c
+++ b/c5/largemalloc.c
@@ -127,32 +127,39 @@
     end->prev = scan;
     scan->next = end;
 
-    mchunk_t *chunks[count];
-    size_t i;
-    for (i = 0; i < count; i++) {
-        chunks[i] = data2chunk(unsorted);
-        unsorted = unsorted->prev;
+    mchunk_t *chunk1;
+    mchunk_t *chunks[count];    /* dynamically-sized */
+    if (count == 1) {
+        chunk1 = data2chunk(unsorted);   /* common case */
+        count = 0;
     }
-    assert(unsorted == scan);
-    qsort(chunks, count, sizeof(mchunk_t *), compare_chunks);
+    else {
+        size_t i;
+        for (i = 0; i < count; i++) {
+            chunks[i] = data2chunk(unsorted);
+            unsorted = unsorted->prev;
+        }
+        assert(unsorted == scan);
+        qsort(chunks, count, sizeof(mchunk_t *), compare_chunks);
 
-    --count;
-    chunks[count]->size |= FLAG_SORTED;
-    size_t search_size = chunks[count]->size;
+        chunk1 = chunks[--count];
+    }
+    chunk1->size |= FLAG_SORTED;
+    size_t search_size = chunk1->size;
     dlist_t *head = largebins[index].next;
 
     while (1) {
         if (head == end || search_size >= data2chunk(head)->size) {
-            /* insert 'chunks[count]' here, before the current head */
-            head->prev->next = &chunks[count]->d;
-            chunks[count]->d.prev = head->prev;
-            head->prev = &chunks[count]->d;
-            chunks[count]->d.next = head;
+            /* insert 'chunk1' here, before the current head */
+            head->prev->next = &chunk1->d;
+            chunk1->d.prev = head->prev;
+            head->prev = &chunk1->d;
+            chunk1->d.next = head;
             if (count == 0)
                 break;    /* all done */
-            --count;
-            chunks[count]->size |= FLAG_SORTED;
-            search_size = chunks[count]->size;
+            chunk1 = chunks[--count];
+            chunk1->size |= FLAG_SORTED;
+            search_size = chunk1->size;
         }
         else {
             head = head->next;
@@ -317,11 +324,17 @@
         }
         if (*(size_t*)(data - 8) == END_MARKER)
             break;
-        fprintf(stderr, "  %p: %zu ]%s\n", data - 8, *(size_t*)(data - 8),
-                prev_size_if_free ? " (free)" : "");
+        fprintf(stderr, "  %p: %zu ]", data - 8, *(size_t*)(data - 8));
+        if (prev_size_if_free) {
+            fprintf(stderr, " (free %p / %p)\n",
+                    *(void **)data, *(void **)(data + 8));
+        }
+        else {
+            fprintf(stderr, "\n");
+        }
         if (!prev_size_if_free)
             assert(!((*(size_t*)(data - 8)) & FLAG_SORTED));
-        assert(*(ssize_t*)(data - 8) > 0);
+        assert(*(ssize_t*)(data - 8) >= 16);
         data += (*(size_t*)(data - 8)) & ~FLAG_SORTED;
         data += 16;
     }


More information about the pypy-commit mailing list