Author: Remi Meier <remi.me...@gmail.com> Branch: c7 Changeset: r603:6de71cb85ddb Date: 2014-01-14 12:18 +0100 http://bitbucket.org/pypy/stmgc/changeset/6de71cb85ddb/
Log: start adding a nursery and redo barriers without the leader-model diff --git a/c7/core.c b/c7/core.c --- a/c7/core.c +++ b/c7/core.c @@ -18,6 +18,7 @@ #define NB_THREADS 2 #define MAP_PAGES_FLAGS (MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE) #define LARGE_OBJECT_WORDS 36 +#define NB_NURSERY_PAGES 1024 #if defined(__i386__) || defined(__x86_64__) # define HAVE_FULL_EXCHANGE_INSN @@ -42,6 +43,7 @@ struct stm_list_s *modified_objects; struct stm_list_s *new_object_ranges; struct alloc_for_size_s alloc[LARGE_OBJECT_WORDS]; + localchar_t *nursery_current; }; #define _STM_TL2 ((_thread_local2_t *)_STM_TL1) @@ -226,12 +228,20 @@ void _stm_write_slowpath(object_t *obj) { - maybe_update(CAN_CONFLICT); - _stm_privatize(((uintptr_t)obj) / 4096); + uintptr_t t0_offset = (uintptr_t)obj; + char* t0_addr = get_thread_base(0) + t0_offset; + struct object_s *t0_obj = (struct object_s *)t0_addr; + + + int previous = __sync_lock_test_and_set(&t0_obj->stm_write_lock, 1); + if (previous) + abort(); /* XXX */ + + obj->stm_flags &= ~GCFLAG_WRITE_BARRIER; + stm_read(obj); - obj->write_version = _STM_TL1->transaction_write_version; _STM_TL2->modified_objects = stm_list_append( _STM_TL2->modified_objects, obj); @@ -306,24 +316,29 @@ assert(size % 8 == 0); size_t i = size / 8; assert(2 <= i && i < LARGE_OBJECT_WORDS);//XXX - alloc_for_size_t *alloc = &_STM_TL2->alloc[i]; - localchar_t *p = alloc->next; - alloc->next = p + size; - if ((uint16_t)(uintptr_t)p == alloc->stop) - p = _stm_alloc_next_page(i); + localchar_t *current = _STM_TL2->nursery_current; + localchar_t *new_current = current + size; + if ((uintptr_t)new_current > FIRST_AFTER_NURSERY_PAGE * 4096) { + /* XXX: do minor collection */ + abort(); + } - object_t *result = (object_t *)p; - result->write_version = _STM_TL1->transaction_write_version; + object_t *result = (object_t *)current; return result; } + + + + #define TOTAL_MEMORY (NB_PAGES * 4096UL * NB_THREADS) #define READMARKER_END ((NB_PAGES * 4096UL) >> 4) #define FIRST_OBJECT_PAGE ((READMARKER_END + 4095) / 4096UL) #define READMARKER_START ((FIRST_OBJECT_PAGE * 4096UL) >> 4) #define FIRST_READMARKER_PAGE (READMARKER_START / 4096UL) +#define FIRST_AFTER_NURSERY_PAGE (FIRST_OBJECT_PAGE + NB_NURSERY_PAGES) void stm_setup(void) { @@ -368,9 +383,12 @@ if (i > 0) { int res; - res = remap_file_pages(thread_base + FIRST_OBJECT_PAGE * 4096UL, - (NB_PAGES - FIRST_OBJECT_PAGE) * 4096UL, - 0, FIRST_OBJECT_PAGE, 0); + + res = remap_file_pages( + thread_base + FIRST_AFTER_NURSERY_PAGE * 4096UL, + (NB_PAGES - FIRST_AFTER_NURSERY_PAGE) * 4096UL, + 0, FIRST_AFTER_NURSERY_PAGE, 0); + if (res != 0) { perror("remap_file_pages"); abort(); @@ -379,7 +397,7 @@ } num_threads_started = 0; - index_page_never_used = FIRST_OBJECT_PAGE; + index_page_never_used = FIRST_AFTER_NURSERY_PAGE; pending_updates = NULL; } diff --git a/c7/core.h b/c7/core.h --- a/c7/core.h +++ b/c7/core.h @@ -29,8 +29,13 @@ newly allocated objects. */ +enum { + GCFLAG_WRITE_BARRIER = (1 << 0), +}; + struct object_s { uint8_t stm_flags; /* reserved for the STM library */ + uint8_t stm_write_lock; /* 1 if writeable by some thread */ uint32_t header; /* for the user program -- only write in newly allocated objects */ }; @@ -65,7 +70,7 @@ static inline void stm_write(object_t *obj) { - if (UNLIKELY(obj->write_version != _STM_TL1->transaction_write_version)) + if (UNLIKELY(obj->stm_flags & GCFLAG_WRITE_BARRIER)) _stm_write_slowpath(obj); } _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit