[GHC] #4934: threadWaitRead works incorrectly on nonthreaded RTS
GHC
ghc-devs at haskell.org
Tue Jul 7 17:17:25 UTC 2015
#4934: threadWaitRead works incorrectly on nonthreaded RTS
------------------------------------------------+--------------------------
Reporter: slyfox | Owner:
Type: bug | Status: closed
Priority: normal | Milestone: 7.10.1
Component: Runtime System | Version: 7.0.1
Resolution: fixed | Keywords:
Operating System: Linux | Architecture: x86_64
Type of failure: Incorrect result at runtime | (amd64)
Blocked By: | Test Case:
Related Tickets: | Blocking:
------------------------------------------------+--------------------------
Comment (by Ben Gamari <ben@…>):
In [changeset:"5857e0afb5823987e84e6d3dd8d0b269b7546166/ghc"]:
{{{
#!CommitTicketReference repository="ghc"
revision="5857e0afb5823987e84e6d3dd8d0b269b7546166"
fix EBADF unqueueing in select backend (Trac #10590)
Alexander found a interesting case:
1. We have a queue of two waiters in a blocked_queue
2. first file descriptor changes state to RUNNABLE,
second changes to INVALID
3. awaitEvent function dequeued RUNNABLE thread to a
run queue and attempted to dequeue INVALID descriptor
to a run queue.
Unqueueing INVALID fails thusly:
#3 0x000000000045cf1c in barf (s=0x4c1cb0
"removeThreadFromDeQueue: not found")
at rts/RtsMessages.c:42
#4 0x000000000046848b in removeThreadFromDeQueue (...) at
rts/Threads.c:249
#5 0x000000000049a120 in removeFromQueues (...) at
rts/RaiseAsync.c:719
#6 0x0000000000499502 in throwToSingleThreaded__ (...) at
rts/RaiseAsync.c:67
#7 0x0000000000499555 in throwToSingleThreaded (..) at
rts/RaiseAsync.c:75
#8 0x000000000047c27d in awaitEvent (wait=rtsFalse) at
rts/posix/Select.c:415
The problem here is a throwToSingleThreaded function that tries
to unqueue a TSO from blocked_queue, but awaitEvent function
leaves blocked_queue in a inconsistent state while traverses
over blocked_queue:
case RTS_FD_IS_READY:
IF_DEBUG(scheduler,
debugBelch("Waking up blocked thread %lu\n",
(unsigned long)tso->id));
tso->why_blocked = NotBlocked;
tso->_link = END_TSO_QUEUE; // Here we break the
queue head
pushOnRunQueue(&MainCapability,tso);
break;
Signed-off-by: Sergei Trofimovich <siarheit at google.com>
Test Plan: tested on a sample from T10590
Reviewers: austin, bgamari, simonmar
Reviewed By: bgamari, simonmar
Subscribers: qnikst, thomie, bgamari
Differential Revision: https://phabricator.haskell.org/D1024
GHC Trac Issues: #10590, #4934
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/4934#comment:30>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list