[GHC] #10686: Process stops responding to sigINT

GHC ghc-devs at haskell.org
Sat Jul 25 11:25:46 UTC 2015


#10686: Process stops responding to sigINT
-------------------------------------+-------------------------------------
              Reporter:  hamish      |             Owner:
                  Type:  bug         |            Status:  new
              Priority:  normal      |         Milestone:
             Component:  Compiler    |           Version:  7.10.1
              Keywords:              |  Operating System:  Unknown/Multiple
          Architecture:              |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
             Test Case:              |        Blocked By:
              Blocking:              |   Related Tickets:
Differential Revisions:              |
-------------------------------------+-------------------------------------
 Every now and then the leksah-server process has required a kill -9 it to
 get rid of it.  Now Leksah is using the threaded RTS it seems to be
 happening in Leksah too.  It is worse in Leksah because child processes
 inherit the behaviour and do not terminate when sent Leksah sends them
 sigINT (which Leksah does very frequently).

 Once the problem arrises it continues until the Leksah is restarted.

 Both leksah-server and Leksah start child processes using the process
 package.

 I think process package and the GHC GC both call blockUserSignals and it
 only has one place to store savedSignals.  My guess is that two calls go
 into blockUserSignals from different threads before unblockUserSignals is
 called on either.  The result is that when unblockUserSignals is called it
 does nothing (because savedSignals was overwritten).

 Perhaps savedSignals could use some kind of thread local storage?

 Also docs seem to indicate sigprocmask should not be used at all in
 multithreaded processes.  Perhaps the GHC RTS should use
 pthread_sigprocmask instead?

 If the calling process delegates Ctrl+C the problem might be largely
 hidden.  The sigINT signal is enabled again in the child fork and the
 parent will get an exception if the child is terminated with a sigINT.
 However I believe the parent is still left in a state where it will no
 longer respond to sigINT if the child process terminates normally
 (assuming two calls in a row were made to blockUserSignals at some point).

 The work around for now in Leksah is to reenable sigINT before each
 createProcess call.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10686>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list