X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FSchedule.c;h=375520d011327b8d7cb885b353394db5273d06be;hb=8cc74db64356bd332a11c73788c4108e2e3c5acd;hp=22e61203a3396441acf643fa016a0e355394f589;hpb=442099ad2dbcc007b137745b9246116f06c8723d;p=ghc-hetmet.git diff --git a/rts/Schedule.c b/rts/Schedule.c index 22e6120..375520d 100644 --- a/rts/Schedule.c +++ b/rts/Schedule.c @@ -2143,6 +2143,7 @@ forkProcess(HsStablePtr *entry // inconsistent state in the child. See also #1391. ACQUIRE_LOCK(&sched_mutex); ACQUIRE_LOCK(&cap->lock); + ACQUIRE_LOCK(&cap->running_task->lock); pid = fork(); @@ -2150,6 +2151,7 @@ forkProcess(HsStablePtr *entry RELEASE_LOCK(&sched_mutex); RELEASE_LOCK(&cap->lock); + RELEASE_LOCK(&cap->running_task->lock); // just return the pid rts_unlock(cap); @@ -2160,6 +2162,7 @@ forkProcess(HsStablePtr *entry #if defined(THREADED_RTS) initMutex(&sched_mutex); initMutex(&cap->lock); + initMutex(&cap->running_task->lock); #endif // Now, all OS threads except the thread that forked are @@ -2199,6 +2202,9 @@ forkProcess(HsStablePtr *entry ACQUIRE_LOCK(&sched_mutex); for (task = all_tasks; task != NULL; task=task->all_link) { if (task != cap->running_task) { +#if defined(THREADED_RTS) + initMutex(&task->lock); // see #1391 +#endif discardTask(task); } }