You shouldn't need forkOS, but without -threaded (and related RTS switches to enable multithreading) I think you are sunk. Without enabling multithreading support, you are saying that your program (which might use concurrency features of Haskell) will run on a single OS thread. During a foreign call that never calls back into Haskell, then, there's no place for the RTS to pre-empt and switch back to Haskell code.
It's kind of confusing with multiple things named threads; call a Haskell thread a "lightweight" thread, and an OS thread a "heavy" thread. Each heavy thread can either be executing Haskell lightweight threads, or inside a foreign out-call. Once you jump across to foreign-land, the heavy thread can't do anything (even for a "safe" out-call) until the out-call either makes an in-call back into Haskell code, or returns. Enabling -threaded allows the Haskell runtime to create more heavy threads; even without -threaded you can make as many lightweight threads as you like and the runtime will handle scheduling them for you; a heavy thread can carry many light threads. But a foreign call takes a whole heavy thread no matter what. -- ryan On Mon, Dec 22, 2008 at 1:12 PM, Günther Schmidt <red...@fedoms.com> wrote: > Hi guys, > > I just tried to forkIO-off the database code to keep the UI responsive using > Takusen with Sqlite this time. > > The problem persists though, the UI freezes. > > AFAIK the sqlite-Takusen code does not use unsafe ccall which would block > the thread, so that might not be the cause of the problem after all. > > Before you guys make the effort to "fix" this you might see if you can > reproduce the problem maybe uploading a 50 MB file into an Sqlite database, > for instance, or something else that will keep the database busy for some > time in a row. > > I did not use -threaded and forkOS though. > > Günther > > > > Am 22.12.2008, 21:59 Uhr, schrieb John Goerzen <jgoer...@complete.org>: > >> On Mon, Dec 22, 2008 at 04:28:03PM -0000, Bayley, Alistair wrote: >>> >>> > From: haskell-cafe-boun...@haskell.org >>> > [mailto:haskell-cafe-boun...@haskell.org] On Behalf Of Günther Schmidt >>> > >>> > I understand that Takusen does not use "unsafe" calls and >>> > would like to >>> > try it with that one then, but haven't find enough docs yet >>> > on how to use >>> > Takusen. >>> >>> Not a lot of detailed examples exist for Takusen. I'm hoping the >>> documentation for Database.Enumerator is a reasonable place to start. >>> http://darcs.haskell.org/takusen/doc/html/Database-Enumerator.html >>> >>> I just reviewed the Takusen code and, for no apparent reason, the ODBC >>> module specifies unsafe for all of its FFI imports, but the other modules do >>> not (so they get the default, which I assume is safe). I also was not aware >>> of unsafe calls blocking other threads. I'll change the ODBC imports to be >>> safe (or rather, unspecified). >> >> Makes sense. I will make the similar change in all HDBC backends. >> >> -- John >> > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe