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