[pypy-commit] stmgc default: Improve the logic behind stm_collect(1)
arigo
noreply at buildbot.pypy.org
Thu Feb 27 19:51:54 CET 2014
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r899:410c7a4975d0
Date: 2014-02-27 19:51 +0100
http://bitbucket.org/pypy/stmgc/changeset/410c7a4975d0/
Log: Improve the logic behind stm_collect(1)
diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c
--- a/c7/stm/gcpage.c
+++ b/c7/stm/gcpage.c
@@ -110,10 +110,10 @@
/************************************************************/
-static void major_collection(bool forced)
+static void major_collection_if_requested(void)
{
assert(!_has_mutex());
- if (!forced && !is_major_collection_requested())
+ if (!is_major_collection_requested())
return;
mutex_lock();
@@ -121,7 +121,7 @@
assert(STM_PSEGMENT->safe_point == SP_RUNNING);
STM_PSEGMENT->safe_point = SP_SAFE_POINT;
- while (forced || is_major_collection_requested()) {
+ while (is_major_collection_requested()) {
/* wait until the other thread is at a safe-point */
if (try_wait_for_other_safe_points()) {
/* ok */
diff --git a/c7/stm/gcpage.h b/c7/stm/gcpage.h
--- a/c7/stm/gcpage.h
+++ b/c7/stm/gcpage.h
@@ -33,7 +33,7 @@
static void teardown_gcpage(void);
static char *allocate_outside_nursery_large(uint64_t size);
-static void major_collection(bool forced);
+static void major_collection_if_requested(void);
static void major_collection_now_at_safe_point(void);
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -282,8 +282,11 @@
void stm_collect(long level)
{
+ if (level > 0)
+ force_major_collection_request();
+
minor_collection(/*commit=*/ false);
- major_collection(/*forced=*/ level > 0);
+ major_collection_if_requested();
}
diff --git a/c7/stm/pages.c b/c7/stm/pages.c
--- a/c7/stm/pages.c
+++ b/c7/stm/pages.c
@@ -8,7 +8,7 @@
static union {
struct {
uint8_t mutex_pages;
- bool major_collection_requested;
+ volatile bool major_collection_requested;
uint64_t total_allocated; /* keep track of how much memory we're
using, ignoring nurseries */
uint64_t total_allocated_bound;
@@ -61,6 +61,11 @@
return pages_ctl.major_collection_requested;
}
+static void force_major_collection_request(void)
+{
+ pages_ctl.major_collection_requested = true;
+}
+
static void reset_major_collection_requested(void)
{
assert(_has_mutex());
diff --git a/c7/stm/pages.h b/c7/stm/pages.h
--- a/c7/stm/pages.h
+++ b/c7/stm/pages.h
@@ -25,6 +25,7 @@
static void mutex_pages_unlock(void);
static uint64_t increment_total_allocated(ssize_t add_or_remove);
static bool is_major_collection_requested(void);
+static void force_major_collection_request(void);
static void reset_major_collection_requested(void);
inline static void pages_privatize(uintptr_t pagenum, uintptr_t count,
More information about the pypy-commit
mailing list