summaryrefslogtreecommitdiff
path: root/thread_sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'thread_sync.c')
-rw-r--r--thread_sync.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/thread_sync.c b/thread_sync.c
index b79db1fee3..e478a96b88 100644
--- a/thread_sync.c
+++ b/thread_sync.c
@@ -45,6 +45,7 @@ typedef struct rb_mutex_struct {
rb_thread_t *th;
struct rb_mutex_struct *next_mutex;
struct list_head waitq; /* protected by GVL */
+ rb_serial_t fork_gen;
} rb_mutex_t;
#if defined(HAVE_WORKING_FORK)
@@ -121,8 +122,18 @@ static rb_mutex_t *
mutex_ptr(VALUE obj)
{
rb_mutex_t *mutex;
+ rb_serial_t fork_gen = GET_VM()->fork_gen;
TypedData_Get_Struct(obj, rb_mutex_t, &mutex_data_type, mutex);
+
+ if (mutex->fork_gen != fork_gen) {
+ /* forked children can't reach into parent thread stacks */
+ mutex->fork_gen = fork_gen;
+ list_head_init(&mutex->waitq);
+ mutex->next_mutex = 0;
+ mutex->th = 0;
+ }
+
return mutex;
}