How to to terminate runStmt in "GHC as a library"

Hi all I am trying to build a GUI for GHCi using "GHC as a library". See http://haskell.org/haskellwiki/GHC/As_a_library . One requirement is that the GUI is still responsive when executing code using GHC.runStmt. Therefore I do: forkIO $ GHC.runStmt someStatement >> return() While this works fine, it does give me one problem. How do I terminate a call to runStmt prematurely? One would think that this would work: threadId <-forkIO $ GHC.runStmt someStatement >> return() ... killThread threadId However, as runStmt also uses forkIO internally I am not killing the thread that runs "someStatement" - actually nothing seems to happen when executing the action "killThread threadId". Anybody knows how to kill the thread running "someStatement"? I have attached a more complete program which illustrates the problem described above. I have only tested the program on Debian/Linux. Greetings, Mads Lindstrøm

Mads Lindstrøm wrote:
Hi all
I am trying to build a GUI for GHCi using "GHC as a library". See http://haskell.org/haskellwiki/GHC/As_a_library .
One requirement is that the GUI is still responsive when executing code using GHC.runStmt. Therefore I do:
forkIO $ GHC.runStmt someStatement >> return()
Yikes! I'm not at all sure that we support doing anything except using the GHC API from a single thread. In fact I'm pretty sure we don't. We should document this. There's nothing stopping you from having a separate GHC API thread that communicates with the other threads in your program (this is what Visual Haskell does, incedentally), so I'm pretty sure you can still do what you want.
While this works fine, it does give me one problem. How do I terminate a call to runStmt prematurely? One would think that this would work:
threadId <-forkIO $ GHC.runStmt someStatement >> return() ... killThread threadId
However, as runStmt also uses forkIO internally I am not killing the thread that runs "someStatement" - actually nothing seems to happen when executing the action "killThread threadId".
Anybody knows how to kill the thread running "someStatement"?
The only way at the moment would be to look at Panic.interruptTargetThread, which contains a list of ThreadIds that we send ^C exceptions to (I don't think it really needs to be a list, you could probably just take the head). Also, please submit a feature request so we can figure out an extension to the API to support interrupting runStmts. Cheers, Simon
participants (2)
-
Mads Lindstrøm
-
Simon Marlow