Author: Armin Rigo <[email protected]>
Branch: c7-fork
Changeset: r1066:c07cd6a30719
Date: 2014-03-18 11:50 +0100
http://bitbucket.org/pypy/stmgc/changeset/c07cd6a30719/
Log: Hopefully finish fork support
diff --git a/c7/stm/forksupport.c b/c7/stm/forksupport.c
--- a/c7/stm/forksupport.c
+++ b/c7/stm/forksupport.c
@@ -7,7 +7,11 @@
copy of all shared pages as soon as fork() is called. */
-static char *fork_big_copy;
+static char *fork_big_copy = NULL;
+
+static char *setup_mmap(char *reason); /* forward, in setup.c */
+static void do_or_redo_setup_after_fork(void); /* forward, in setup.c */
+static void do_or_redo_teardown_after_fork(void); /* forward, in setup.c */
static void forksupport_prepare(void)
@@ -58,7 +62,7 @@
assert(fork_big_copy != NULL);
munmap(fork_big_copy, TOTAL_MEMORY);
- stm_object_pages = NULL;
+ fork_big_copy = NULL;
mutex_pages_unlock();
s_mutex_unlock();
@@ -69,15 +73,23 @@
if (stm_object_pages == NULL)
return;
+ /* xxx the stm_thread_local_t belonging to other threads just leak.
+ Note that stm_all_thread_locals is preserved across a
+ stm_teardown/stm_setup sequence. */
+
+ mutex_pages_unlock();
+ s_mutex_unlock();
+
+ do_or_redo_teardown_after_fork();
+
+ assert(fork_big_copy != NULL);
+ assert(stm_object_pages != NULL);
mremap(fork_big_copy, TOTAL_MEMORY, TOTAL_MEMORY,
MREMAP_MAYMOVE | MREMAP_FIXED,
stm_object_pages);
+ fork_big_copy = NULL;
- ...; reset carefully a much bigger part of the state here :-(((
- memset(pages_privatized, 0, sizeof(pages_privatized));
-
- mutex_pages_unlock();
- s_mutex_unlock();
+ do_or_redo_setup_after_fork();
}
@@ -88,7 +100,8 @@
if (!fork_support_ready) {
int res = pthread_atfork(forksupport_prepare, forksupport_parent,
forksupport_child);
- assert(res == 0);
+ if (res != 0)
+ stm_fatalerror("pthread_atfork() failed: %m");
fork_support_ready = true;
}
}
diff --git a/c7/stm/forksupport.h b/c7/stm/forksupport.h
deleted file mode 100644
--- a/c7/stm/forksupport.h
+++ /dev/null
@@ -1,2 +0,0 @@
-
-static void setup_forksupport(void);
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -32,10 +32,6 @@
}
}
-static void teardown_nursery(void)
-{
-}
-
static inline bool _is_in_nursery(object_t *obj)
{
assert((uintptr_t)obj >= NURSERY_START);
diff --git a/c7/stm/pages.c b/c7/stm/pages.c
--- a/c7/stm/pages.c
+++ b/c7/stm/pages.c
@@ -25,6 +25,10 @@
static void teardown_pages(void)
{
memset(&pages_ctl, 0, sizeof(pages_ctl));
+}
+
+static void teardown_pages_1(void)
+{
memset(pages_privatized, 0, sizeof(pages_privatized));
}
diff --git a/c7/stm/setup.c b/c7/stm/setup.c
--- a/c7/stm/setup.c
+++ b/c7/stm/setup.c
@@ -35,25 +35,8 @@
return result;
}
-void stm_setup(void)
+static void do_or_redo_setup_after_fork(void)
{
- /* Check that some values are acceptable */
- assert(NB_SEGMENTS <= NB_SEGMENTS_MAX);
- assert(4096 <= ((uintptr_t)STM_SEGMENT));
- assert((uintptr_t)STM_SEGMENT == (uintptr_t)STM_PSEGMENT);
- assert(((uintptr_t)STM_PSEGMENT) + sizeof(*STM_PSEGMENT) <= 8192);
- assert(2 <= FIRST_READMARKER_PAGE);
- assert(FIRST_READMARKER_PAGE * 4096UL <= READMARKER_START);
- assert(READMARKER_START < READMARKER_END);
- assert(READMARKER_END <= 4096UL * FIRST_OBJECT_PAGE);
- assert(FIRST_OBJECT_PAGE < NB_PAGES);
- assert((NB_PAGES * 4096UL) >> 8 <= (FIRST_OBJECT_PAGE * 4096UL) >> 4);
- assert((END_NURSERY_PAGE * 4096UL) >> 8 <=
- (FIRST_READMARKER_PAGE * 4096UL));
- assert(_STM_FAST_ALLOC <= NB_NURSERY_PAGES * 4096);
-
- stm_object_pages = setup_mmap("initial stm_object_pages mmap()");
-
long i;
for (i = 1; i <= NB_SEGMENTS; i++) {
char *segment_base = get_segment_base(i);
@@ -90,20 +73,38 @@
so a null read marker means "not read" whatever the
current transaction_read_version is.
*/
+ setup_nursery();
+}
+
+void stm_setup(void)
+{
+ /* Check that some values are acceptable */
+ assert(NB_SEGMENTS <= NB_SEGMENTS_MAX);
+ assert(4096 <= ((uintptr_t)STM_SEGMENT));
+ assert((uintptr_t)STM_SEGMENT == (uintptr_t)STM_PSEGMENT);
+ assert(((uintptr_t)STM_PSEGMENT) + sizeof(*STM_PSEGMENT) <= 8192);
+ assert(2 <= FIRST_READMARKER_PAGE);
+ assert(FIRST_READMARKER_PAGE * 4096UL <= READMARKER_START);
+ assert(READMARKER_START < READMARKER_END);
+ assert(READMARKER_END <= 4096UL * FIRST_OBJECT_PAGE);
+ assert(FIRST_OBJECT_PAGE < NB_PAGES);
+ assert((NB_PAGES * 4096UL) >> 8 <= (FIRST_OBJECT_PAGE * 4096UL) >> 4);
+ assert((END_NURSERY_PAGE * 4096UL) >> 8 <=
+ (FIRST_READMARKER_PAGE * 4096UL));
+ assert(_STM_FAST_ALLOC <= NB_NURSERY_PAGES * 4096);
+
+ stm_object_pages = setup_mmap("initial stm_object_pages mmap()");
+
+ do_or_redo_setup_after_fork();
setup_sync();
- setup_nursery();
setup_gcpage();
setup_pages();
setup_forksupport();
}
-void stm_teardown(void)
+static void do_or_redo_teardown_after_fork(void)
{
- /* This function is called during testing, but normal programs don't
- need to call it. */
- assert(!_has_mutex());
-
long i;
for (i = 1; i <= NB_SEGMENTS; i++) {
struct stm_priv_segment_info_s *pr = get_priv_segment(i);
@@ -117,13 +118,24 @@
tree_free(pr->callbacks_on_abort);
}
+ teardown_core();
+ teardown_sync_1();
+ teardown_pages_1();
+}
+
+void stm_teardown(void)
+{
+ /* This function is called during testing, but normal programs don't
+ need to call it. */
+ assert(!_has_mutex());
+
+ do_or_redo_teardown_after_fork();
+
munmap(stm_object_pages, TOTAL_MEMORY);
stm_object_pages = NULL;
- teardown_core();
teardown_sync();
teardown_gcpage();
- teardown_nursery();
teardown_pages();
}
@@ -174,6 +186,7 @@
void stm_unregister_thread_local(stm_thread_local_t *tl)
{
s_mutex_lock();
+ assert(tl->prev != NULL);
assert(tl->next != NULL);
_done_shadow_stack(tl);
if (tl == stm_all_thread_locals) {
diff --git a/c7/stm/sync.c b/c7/stm/sync.c
--- a/c7/stm/sync.c
+++ b/c7/stm/sync.c
@@ -59,7 +59,10 @@
if (pthread_cond_destroy(&sync_ctl.cond[i]) != 0)
stm_fatalerror("cond destroy: %m\n");
}
+}
+static void teardown_sync_1(void)
+{
memset(&sync_ctl, 0, sizeof(sync_ctl));
}
diff --git a/c7/stmgc.c b/c7/stmgc.c
--- a/c7/stmgc.c
+++ b/c7/stmgc.c
@@ -13,7 +13,6 @@
#include "stm/extra.h"
#include "stm/fprintcolor.h"
#include "stm/weakref.h"
-#include "stm/forksupport.h"
#include "stm/misc.c"
#include "stm/list.c"
@@ -24,6 +23,7 @@
#include "stm/largemalloc.c"
#include "stm/nursery.c"
#include "stm/sync.c"
+#include "stm/forksupport.c"
#include "stm/setup.c"
#include "stm/hash_id.c"
#include "stm/core.c"
@@ -31,4 +31,3 @@
#include "stm/extra.c"
#include "stm/fprintcolor.c"
#include "stm/weakref.c"
-#include "stm/forksupport.c"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit