Author: Remi Meier
Branch: c7
Changeset: r674:50820e18ee9b
Date: 2014-01-24 16:19 +0100
http://bitbucket.org/pypy/stmgc/changeset/50820e18ee9b/

Log:    fixes, all tests seem to pass

diff --git a/c7/core.c b/c7/core.c
--- a/c7/core.c
+++ b/c7/core.c
@@ -69,7 +69,8 @@
             assert(write_locks[lock_idx]);
             write_locks[lock_idx] = 0;
 
-            _stm_move_object(REAL_ADDRESS(local_base, item),
+            _stm_move_object(item,
+                             REAL_ADDRESS(local_base, item),
                              REAL_ADDRESS(remote_base, item));
         }));
     
@@ -102,6 +103,7 @@
     _stm_chunk_pages((struct object_s*)REAL_ADDRESS(get_thread_base(0), obj),
                      &pagenum2, &pages);
     assert(pagenum == pagenum2);
+    assert(pages == (stmcb_size(real_address(obj)) +4095) / 4096);
     for (pagenum2 += pages - 1; pagenum2 >= pagenum; pagenum2--)
         stm_pages_privatize(pagenum2);
 
diff --git a/c7/largemalloc.c b/c7/largemalloc.c
--- a/c7/largemalloc.c
+++ b/c7/largemalloc.c
@@ -90,9 +90,11 @@
 
 static dlist_t largebins[N_BINS];
 static mchunk_t *first_chunk, *last_chunk;
+uint8_t alloc_lock = 0;
 
 void _stm_chunk_pages(struct object_s *data, uintptr_t *start, uintptr_t *num)
 {
+    /* expects object_s in thread0-space */
     /* returns the start page and number of pages that the *payload*
        spans over. the CHUNK_HEADER is not included in the calculations */
     mchunk_t *chunk = data2chunk((char*)data);
@@ -107,13 +109,15 @@
     return chunk->size & ~FLAG_SORTED;
 }
 
-void _stm_move_object(char *src, char *dst)
+void _stm_move_object(object_t* obj, char *src, char *dst)
 {
+    /* XXX: should be thread-safe... */
+    
     /* only copies if page is PRIVATE
        XXX: various optimizations for objects with
        multiple pages. E.g. using pagecopy or
        memcpy over multiple PRIVATE pages. */
-    char *end = src + _stm_data_size((struct object_s*)src);
+    char *end = src + _stm_data_size((struct 
object_s*)REAL_ADDRESS(get_thread_base(0), obj));
     uintptr_t pagenum, num;
     struct object_s *t0_obj = (struct 
object_s*)REAL_ADDRESS(get_thread_base(0), _stm_tl_address(src));
     _stm_chunk_pages(t0_obj, &pagenum, &num);
@@ -218,6 +222,9 @@
 
 object_t *stm_large_malloc(size_t request_size)
 {
+    while (__sync_lock_test_and_set(&alloc_lock, 1))
+        spin_loop();
+    
     /* 'request_size' should already be a multiple of the word size here */
     assert((request_size & (sizeof(char *)-1)) == 0);
 
@@ -254,6 +261,8 @@
     }
 
     /* not enough memory. */
+    alloc_lock = 0;
+    abort();
     return NULL;
 
  found:
@@ -283,11 +292,16 @@
     }
     mscan->size = request_size;
     mscan->prev_size = BOTH_CHUNKS_USED;
+    
+    alloc_lock = 0;
     return (object_t *)(((char *)&mscan->d) - get_thread_base(0));
 }
 
 void stm_large_free(object_t *tldata)
 {
+    while (__sync_lock_test_and_set(&alloc_lock, 1))
+        spin_loop();
+    
     char *data = _stm_real_address(tldata);
     mchunk_t *chunk = data2chunk(data);
     assert((chunk->size & (sizeof(char *) - 1)) == 0);
@@ -346,6 +360,8 @@
     }
 
     insert_unsorted(chunk);
+
+    alloc_lock = 0;
 }
 
 
@@ -411,6 +427,8 @@
 
 int stm_largemalloc_resize_arena(size_t new_size)
 {
+    /* XXX not thread-safe regarding all functions here... */
+    
     assert(new_size >= 2 * sizeof(struct malloc_chunk));
     assert((new_size & 31) == 0);
 
diff --git a/c7/largemalloc.h b/c7/largemalloc.h
--- a/c7/largemalloc.h
+++ b/c7/largemalloc.h
@@ -10,7 +10,7 @@
 void _stm_large_dump(void);
 char *_stm_largemalloc_data_start(void);
 
-void _stm_move_object(char *src, char *dst);
+void _stm_move_object(object_t *obj, char *src, char *dst);
 size_t _stm_data_size(struct object_s *data);
 void _stm_chunk_pages(struct object_s *data, uintptr_t *start, uintptr_t *num);
                 
diff --git a/c7/nursery.c b/c7/nursery.c
--- a/c7/nursery.c
+++ b/c7/nursery.c
@@ -34,6 +34,7 @@
 object_t *_stm_allocate_old(size_t size)
 {
     object_t* o = stm_large_malloc(size);
+    memset(real_address(o), 0, size);
     o->stm_flags |= GCFLAG_WRITE_BARRIER;
     return o;
 }
@@ -166,8 +167,9 @@
             /* remove the flag (they are now committed) */
             item->stm_flags &= ~GCFLAG_NOT_COMMITTED;
 
-            _stm_move_object(REAL_ADDRESS(local_base, item),
-                             REAL_ADDRESS(remote_base, item));
+            _stm_move_object(item,
+                REAL_ADDRESS(local_base, item),
+                REAL_ADDRESS(remote_base, item));
         }));
 }
 
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -104,7 +104,7 @@
 void _stm_large_dump(void);
 char *_stm_largemalloc_data_start(void);
 
-void _stm_move_object(char *src, char *dst);
+void _stm_move_object(object_t* obj, char *src, char *dst);
 size_t _stm_data_size(struct object_s *data);
 void _stm_chunk_pages(struct object_s *data, uintptr_t *start, uintptr_t *num);
 
diff --git a/duhton/Makefile b/duhton/Makefile
--- a/duhton/Makefile
+++ b/duhton/Makefile
@@ -5,6 +5,7 @@
             ../c7/pages.c \
             ../c7/nursery.c \
             ../c7/stmsync.c \
+            ../c7/largemalloc.c \
             ../c7/reader_writer_lock.c
 
 C7HEADERS = ../c7/*.h
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to