[pypy-commit] stmgc c8-private-pages: fix for old-smallmalloced objs

Raemi noreply at buildbot.pypy.org
Fri Jan 16 16:57:00 CET 2015


Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: c8-private-pages
Changeset: r1539:3ae30d429859
Date: 2015-01-16 16:54 +0100
http://bitbucket.org/pypy/stmgc/changeset/3ae30d429859/

Log:	fix for old-smallmalloced objs

diff --git a/c8/stm/smallmalloc.c b/c8/stm/smallmalloc.c
--- a/c8/stm/smallmalloc.c
+++ b/c8/stm/smallmalloc.c
@@ -183,7 +183,7 @@
     memset(REAL_ADDRESS(STM_SEGMENT->segment_base, o), 0, size_rounded_up);
     o->stm_flags = GCFLAG_WRITE_BARRIER;
 
-    dprintf(("allocate_old_small(%lu): %p, seg=%d, page=%lu\n",
+    dprintf(("_stm_allocate_old_small(%lu): %p, seg=%d, page=%lu\n",
              size_rounded_up, p,
              get_segment_of_linear_address(stm_object_pages + (uintptr_t)p),
              (uintptr_t)p / 4096UL));
@@ -201,7 +201,7 @@
         return _stm_smallmalloc_keep((char*)(p - stm_object_pages));
     }
 #endif
-    abort();
+    return true;
     //return smallmalloc_keep_object_at(p);
 }
 
@@ -248,7 +248,6 @@
         }
         else if (!_smallmalloc_sweep_keep(p)) {
             /* the location should be freed now */
-            //dprintf(("free small obj %p\n", (object_t*)(p - stm_object_pages)));
 #ifdef STM_TESTS
             /* fill location with 0xdd in all segs except seg0 */
             int j;
@@ -258,6 +257,7 @@
                 if (get_page_status_in(j, page) == PAGE_ACCESSIBLE)
                     memset(get_virtual_address(j, obj), 0xdd, szword*8);
 #endif
+            //dprintf(("free small %p : %lu\n", (char*)(p - stm_object_pages), szword*8));
 
             if (flprev == NULL) {
                 flprev = (struct small_free_loc_s *)p;
@@ -273,6 +273,7 @@
             any_object_dying = true;
         }
         else {
+            //dprintf(("keep small %p : %lu\n", (char*)(p - stm_object_pages), szword*8));
             any_object_remaining = true;
         }
     }
@@ -308,7 +309,8 @@
         small_page_lists[szword] = NULL;
 
         /* process the pages that the various segments are busy filling */
-        for (i = 1; i < NB_SEGMENTS; i++) {
+        /* including sharing seg0 for old-malloced things */
+        for (i = 0; i < NB_SEGMENTS; i++) {
             struct stm_priv_segment_info_s *pseg = get_priv_segment(i);
             struct small_free_loc_s **fl =
                     &pseg->small_malloc_data.loc_free[szword];
diff --git a/c8/test/test_smallmalloc.py b/c8/test/test_smallmalloc.py
--- a/c8/test/test_smallmalloc.py
+++ b/c8/test/test_smallmalloc.py
@@ -51,7 +51,8 @@
             # allocate a page's worth of objs
             page0 = [stm_allocate_old_small(16) for i in range(0, 4096, 16)]
             assert len(set(map(pageof, page0))) == 1, "all in the same page"
-            tid = lib._get_type_id(page0[0]) # 58
+            tid = lib._get_type_id(page0[0])
+            assert tid == 58, "current way to do it"
 
             # repeatedly free a subset until no objs are left in that page
             while len(page0) > 0:
@@ -59,6 +60,8 @@
                 self.keep_me = set(random.sample(page0, len(page0) // 2))
                 self.has_been_asked_for = []
                 lib._stm_smallmalloc_sweep()
+
+                print len(page0), len(self.has_been_asked_for)
                 assert sorted(page0) == self.has_been_asked_for, "all objs were observed"
 
                 # get list of objs that were not freed


More information about the pypy-commit mailing list