Author: Armin Rigo <[email protected]>
Branch: nogil-unsafe-2
Changeset: r90429:7be972407621
Date: 2017-02-28 17:22 +0100
http://bitbucket.org/pypy/pypy/changeset/7be972407621/
Log: (remi, arigo) general process, still completely crashing
diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py
--- a/rpython/memory/gc/incminimark.py
+++ b/rpython/memory/gc/incminimark.py
@@ -506,7 +506,7 @@
if gc_increment_step > 0:
self.gc_increment_step = gc_increment_step
else:
- self.gc_increment_step = newsize * 4
+ self.gc_increment_step = r_uint(newsize) * 4
#
nursery_debug = env.read_uint_from_env('PYPY_GC_NURSERY_DEBUG')
if nursery_debug > 0:
@@ -514,7 +514,6 @@
else:
self.gc_nursery_debug = False
self._minor_collection() # to empty the nursery
- llarena.arena_free(self.nursery)
self.nursery_size = newsize
self.allocate_nursery()
#
@@ -556,6 +555,17 @@
def allocate_nursery(self):
debug_start("gc-set-nursery-size")
debug_print("nursery size:", self.nursery_size)
+ #
+ if self.nursery: # free the old nursery
+ llarena.arena_free(self.nursery)
+ self.nursery = llmemory.NULL
+ ll_assert(not self.surviving_pinned_objects.non_empty(),
+ "pinned objects too early in the process")
+ self.nursery_barriers.delete()
+ self.nursery_barriers = self.AddressDeque()
+ self.set_nursery_free(llmemory.NULL)
+ self.set_nursery_top(llmemory.NULL)
+ #
self.nursery = self._alloc_nursery()
# initialize the threshold
self.min_heap_size = max(self.min_heap_size, self.nursery_size *
@@ -645,10 +655,10 @@
@property
def nursery_top(self):
- raise AssertionError, "fix caller"
+ XXX # fix caller
@property
def nursery_free(self):
- raise AssertionError, "fix caller"
+ XXX # fix caller
def malloc_fixedsize(self, typeid, size,
@@ -752,10 +762,15 @@
#
# Get the memory from the nursery. If there is not enough space
# there, do a collect first.
- result = self.nursery_free
- ll_assert(result != llmemory.NULL, "uninitialized nursery")
- self.nursery_free = new_free = result + totalsize
- if new_free > self.nursery_top:
+ result = self.get_nursery_free()
+ if not we_are_translated() and result == llmemory.NULL:
+ # can't do arithmetic from NULL when non-translated
+ grab_next_block = True
+ else:
+ new_free = result + totalsize
+ self.set_nursery_free(new_free)
+ grab_next_block = new_free > self.get_nursery_top()
+ if grab_next_block:
result = self.collect_and_reserve(totalsize)
#
# Build the object.
@@ -916,8 +931,10 @@
#
#
if self.debug_tiny_nursery >= 0: # for debugging
- if self.nursery_top - self.nursery_free > self.debug_tiny_nursery:
- self.nursery_free = self.nursery_top - self.debug_tiny_nursery
+ if (self.get_nursery_top() - self.get_nursery_free() >
+ self.debug_tiny_nursery):
+ self.set_nursery_free(self.get_nursery_top() -
+ self.debug_tiny_nursery)
#
rthread.release_NOAUTO(self.ll_lock)
return result
@@ -1078,7 +1095,7 @@
if self.next_major_collection_threshold < 0:
# cannot trigger a full collection now, but we can ensure
# that one will occur very soon
- self.nursery_free = self.nursery_top
+ self.set_nursery_free(self.get_nursery_top())
def can_optimize_clean_setarrayitems(self):
if self.card_page_indices > 0:
@@ -1185,7 +1202,7 @@
# Check if the object at 'addr' is young.
if not self.is_valid_gc_object(addr):
return False # filter out tagged pointers explicitly.
- if self.nursery <= addr < self.nursery_top:
+ if self.is_in_nursery(addr):
return True # addr is in the nursery
# Else, it may be in the set 'young_rawmalloced_objects'
return (bool(self.young_rawmalloced_objects) and
@@ -1675,8 +1692,8 @@
# nursery_top
if we_are_translated():
def zero_nursery_pointers(arg, tl):
- (tl + NURSERY_FREE.offset).address[0] = llmemory.NULL
- (tl + NURSERY_TOP.offset).address[0] = llmemory.NULL
+ (tl + NURSERY_FREE._offset).address[0] = llmemory.NULL
+ (tl + NURSERY_TOP._offset).address[0] = llmemory.NULL
rthread.enum_all_threadlocals(zero_nursery_pointers, None)
else:
self.zero_nursery_pointers_in_all_threads()
@@ -2299,7 +2316,7 @@
debug_print("starting gc state: ", GC_STATES[self.gc_state])
# Debugging checks
if self.pinned_objects_in_nursery == 0:
- ll_assert(self.nursery_free == self.nursery,
+ ll_assert(self.get_nursery_free() == llmemory.NULL,
"nursery not empty in major_collection_step()")
else:
# XXX try to add some similar check to the above one for the case
diff --git a/rpython/translator/c/src/threadlocal.c
b/rpython/translator/c/src/threadlocal.c
--- a/rpython/translator/c/src/threadlocal.c
+++ b/rpython/translator/c/src/threadlocal.c
@@ -214,7 +214,7 @@
/* in this situation, we always have one full 'struct pypy_threadlocal_s'
available, managed by gcc. */
-__thread struct pypy_threadlocal_s pypy_threadlocal;
+__thread struct pypy_threadlocal_s pypy_threadlocal = { 0 };
char *_RPython_ThreadLocals_Build(void)
{
diff --git a/rpython/translator/c/test/test_standalone.py
b/rpython/translator/c/test/test_standalone.py
--- a/rpython/translator/c/test/test_standalone.py
+++ b/rpython/translator/c/test/test_standalone.py
@@ -1123,7 +1123,7 @@
def compile(self, entry_point, no__thread=True):
t = TranslationContext(self.config)
- t.config.translation.gc = "semispace"
+ t.config.translation.gc = "incminimark"
t.config.translation.gcrootfinder = self.gcrootfinder
t.config.translation.thread = True
t.config.translation.no__thread = no__thread
@@ -1438,7 +1438,7 @@
def bootstrap():
rthread.gc_thread_start()
x = None
- for i in range(1000):
+ for i in range(1000000):
x = X(x)
os.write(1, "hi there\n")
rthread.gc_thread_die()
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit