[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