[Haskell-cafe] interrupting an accept()ing thread
Lukas Mai
l.mai at web.de
Thu Jul 5 21:45:17 EDT 2007
Am Freitag, 6. Juli 2007 02:13 schrieb Thomas Conway:
> Here's my solution:
>
> acceptLoop sok reqChan = do
> req <- Network.Socket.accept sok
> atomically (writeTChan reqChan req)
> acceptLoop sok reqChan
>
> mainLoop reqChan quitVar liveOpCountVar = do
> action <- atomically (quitNow `orElse` getReq)
> case action of
> Nothing -> return ()
> Just (reqSok,reqAddr) -> do
> atomically $ do
> liveOpCount <- readTVar liveOpCountVar
> writeTVar liveOpCountVar (liveOpCount + 1)
> forkIO (doSession reqSok reqAddr quitVar liveOpCountVar)
> mainLoop reqChan quitVar liveOpCountVar
> where
> quitNow = do
> q <- readTVar quitVar
> case q of
> True -> return Nothing
> False -> retry
>
> getReq = do
> req <- readTChan reqChan
> return (Just req)
>
> doit sok = do
> reqChan <- atomically newTChan
> quitVar <- atomically (newTVar False)
> liveOpCountVar <- atomically (newTVar 0)
> forkIO (acceptLoop sok reqChan)
> mainLoop reqChan quitVar liveOpCountVar
> atomically $ do
> liveOpCount <- readTVar liveOpCountVar
> if liveOpCount > 0
> then retry
> else return ()
>
> Although doSession is not included, obviously when you want to quit,
> something in doSession should set quitVar to True. Also, as suggested
> elsewhere, doSession should involve a "finally" clauses to make sure
> the live op count gets decremented.
I don't see how this solves the problem. AFAICS acceptLoop never returns
and sok is never closed. On the other hand, my program doesn't need a
liveOpCount because the subthreads take care of themselves. It's just the
accept loop I need to break somehow.
Lukas
More information about the Haskell-Cafe
mailing list