Hi All,

Can anyone tell me what System.Exit.exitWith is actually supposed to
do? As far as I can tell, it seems to be a synonym of (return ()).

Okay, I'll stop being provocative and try and be helpful.

So I have a web server, which like the one in The Literature(TM),
essentially has a main loop:

doit sok = do
   (reqSok,reqAddr) <- Network.Socket.accept sok
   forkIO (handleRequest reqSok reqAddr)
   doit sok

This is all well and good, but how do you *stop* a server? Well, you
have a request (blah blash auth blah blah) which tells it to shut
down, /quit for example.

I have a function to handle the quit request that looks something like:

quitHandler sok addr .... = do
   tidyUpEverything ....
   sendOkResponse sok
   sClose sok
   System.Exit.exitWith ExitSuccess

All nice and simple. All except one detail: it doesn't actually work.

It prints

exit: ExitSuccess

but the "doit" loop keeps going. Of course, it goes totally spacko,
because of the call to tidyUpEverything, but it doesn't exit.

So, if I set an IORef/TVar inside quitHandler which I inspect either
just before or just after the call to Network.Socket.accept, I could
exit the loop, but that only helps once the next request comes in.

I contemplated a solution involving Control.Exception.throwTo, but I
actually read the doco (!) which states the following:

<quote>
If the target thread is currently making a foreign call, then the
exception will not be raised (and hence throwTo will not return) until
the call has completed. This is the case regardless of whether the
call is inside a block or not.
</quote>

So no joy there.

Ideas anyone?

And is exitWith broken, or is it the doco that's broken?

cheers,
T.
--
Dr Thomas Conway
[EMAIL PROTECTED]

Silence is the perfectest herald of joy:
I were but little happy, if I could say how much.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to