diff options
Diffstat (limited to 'Presence')
-rw-r--r-- | Presence/Server.hs | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/Presence/Server.hs b/Presence/Server.hs index 4cbaaa7d..5e54ff27 100644 --- a/Presence/Server.hs +++ b/Presence/Server.hs | |||
@@ -3,6 +3,9 @@ | |||
3 | {-# LANGUAGE StandaloneDeriving #-} | 3 | {-# LANGUAGE StandaloneDeriving #-} |
4 | {-# LANGUAGE OverloadedStrings #-} | 4 | {-# LANGUAGE OverloadedStrings #-} |
5 | {-# LANGUAGE TupleSections #-} | 5 | {-# LANGUAGE TupleSections #-} |
6 | #ifdef TEST | ||
7 | {-# LANGUAGE FlexibleInstances #-} | ||
8 | #endif | ||
6 | ----------------------------------------------------------------------------- | 9 | ----------------------------------------------------------------------------- |
7 | -- | | 10 | -- | |
8 | -- Module : Server | 11 | -- Module : Server |
@@ -57,6 +60,9 @@ import Network.BSD | |||
57 | ( getProtocolNumber | 60 | ( getProtocolNumber |
58 | ) | 61 | ) |
59 | import Debug.Trace | 62 | import Debug.Trace |
63 | import Data.Time.Clock (UTCTime,getCurrentTime) | ||
64 | import Data.Time.Format (formatTime) | ||
65 | import System.Locale (defaultTimeLocale) | ||
60 | 66 | ||
61 | todo = error "unimplemented" | 67 | todo = error "unimplemented" |
62 | 68 | ||
@@ -154,10 +160,15 @@ data ConnectionEvent b | |||
154 | | RequiresPing | 160 | | RequiresPing |
155 | -- ^ 'pingInterval' miliseconds of idle was experienced | 161 | -- ^ 'pingInterval' miliseconds of idle was experienced |
156 | 162 | ||
157 | {- | 163 | #ifdef TEST |
164 | instance Show (IO a) where show _ = "<IO action>" | ||
165 | instance Show (STM a) where show _ = "<STM action>" | ||
166 | instance Eq (ByteString -> IO Bool) where (==) _ _ = True | ||
167 | instance Eq (IO (Maybe ByteString)) where (==) _ _ = True | ||
168 | instance Eq (STM Bool) where (==) _ _ = True | ||
158 | deriving instance Show b => Show (ConnectionEvent b) | 169 | deriving instance Show b => Show (ConnectionEvent b) |
159 | deriving instance Eq b => Eq (ConnectionEvent b) | 170 | deriving instance Eq b => Eq (ConnectionEvent b) |
160 | -} | 171 | #endif |
161 | 172 | ||
162 | -- | This object accepts commands and signals events and maintains | 173 | -- | This object accepts commands and signals events and maintains |
163 | -- the list of currently listening ports and established connections. | 174 | -- the list of currently listening ports and established connections. |
@@ -267,7 +278,7 @@ server = do | |||
267 | doit server (Connect addr params) = liftIO $ do | 278 | doit server (Connect addr params) = liftIO $ do |
268 | void . forkIO $ do | 279 | void . forkIO $ do |
269 | proto <- getProtocolNumber "tcp" | 280 | proto <- getProtocolNumber "tcp" |
270 | sock <- bracketOnError | 281 | bracketOnError |
271 | (socket (socketFamily addr) Stream proto) | 282 | (socket (socketFamily addr) Stream proto) |
272 | (\sock -> do -- only done if there's an error | 283 | (\sock -> do -- only done if there's an error |
273 | -- Weird hack: puting the would-be peer address | 284 | -- Weird hack: puting the would-be peer address |
@@ -277,8 +288,8 @@ server = do | |||
277 | atomically | 288 | atomically |
278 | $ writeTChan (serverEvent server) | 289 | $ writeTChan (serverEvent server) |
279 | $ (conkey,ConnectFailure addr)) | 290 | $ (conkey,ConnectFailure addr)) |
280 | $ \sock -> do connect sock addr | 291 | $ \sock -> do |
281 | return sock | 292 | connect sock addr |
282 | me <- getSocketName sock | 293 | me <- getSocketName sock |
283 | conkey <- makeConnKey params (sock,me) | 294 | conkey <- makeConnKey params (sock,me) |
284 | h <- socketToHandle sock ReadWriteMode | 295 | h <- socketToHandle sock ReadWriteMode |
@@ -370,21 +381,22 @@ newConnection server params conkey h inout = do | |||
370 | kont <- updateConMap conkey new what | 381 | kont <- updateConMap conkey new what |
371 | putTMVar started () | 382 | putTMVar started () |
372 | return kont | 383 | return kont |
373 | {- | 384 | #ifdef TEST |
374 | -- enable this for 'Got' events | 385 | -- enable this for 'Got' events |
375 | forkIO $ do -- inout==In || duplex params then forkIO $ do | 386 | forkIO $ do -- inout==In || duplex params then forkIO $ do |
376 | -- warn $ "waiting read thread: " <> bshow (conkey,inout) | 387 | warn $ "waiting gots thread: " <> bshow (conkey,inout) |
377 | atomically $ takeTMVar started | 388 | atomically $ takeTMVar started |
378 | -- pingBump pinglogic -- start the ping timer | 389 | -- pingBump pinglogic -- start the ping timer |
379 | fix $ \loop -> do | 390 | fix $ \loop -> do |
380 | -- warn $ "read thread: " <> bshow (conkey,inout) | 391 | -- warn $ "read thread: " <> bshow (conkey,inout) |
381 | mb <- threadsRead new | 392 | mb <- threadsRead new |
382 | -- pingBump pinglogic | 393 | -- pingBump pinglogic |
383 | -- warn $ "got: " <> bshow (mb,(conkey,inout)) | 394 | warn $ "got: " <> bshow (mb,(conkey,inout)) |
384 | maybe (return ()) | 395 | maybe (return ()) |
385 | (atomically . forward >=> const loop) | 396 | (atomically . forward >=> const loop) |
386 | mb | 397 | mb |
387 | -} | 398 | warn $ "quit-gots: " <> bshow (conkey,inout) |
399 | #endif | ||
388 | return () | 400 | return () |
389 | where | 401 | where |
390 | 402 | ||
@@ -408,9 +420,23 @@ newConnection server params conkey h inout = do | |||
408 | $ Map.delete conkey | 420 | $ Map.delete conkey |
409 | -- warn $ "fin-EOF "<>bshow conkey | 421 | -- warn $ "fin-EOF "<>bshow conkey |
410 | 422 | ||
411 | sendPing PingTimeOut = do atomically (connClose newCon) | 423 | sendPing PingTimeOut = do |
412 | eof | 424 | {- |
425 | let me = connPingTimer newCon | ||
426 | utc <- getCurrentTime | ||
427 | let utc' = formatTime defaultTimeLocale "%s" utc | ||
428 | warn $ "TIMEOUT " <> bshow utc' <> " " <> bshow (pingIdle me, pingTimeOut me) | ||
429 | -} | ||
430 | atomically (connClose newCon) | ||
431 | eof | ||
432 | |||
413 | sendPing PingIdle = do | 433 | sendPing PingIdle = do |
434 | {- | ||
435 | let me = connPingTimer newCon | ||
436 | utc <- getCurrentTime | ||
437 | let utc' = formatTime defaultTimeLocale "%s" utc | ||
438 | warn $ "IDLE" <> bshow utc' <> " " <> bshow (pingIdle me, pingTimeOut me) | ||
439 | -} | ||
414 | atomically $ announce (conkey,RequiresPing) | 440 | atomically $ announce (conkey,RequiresPing) |
415 | handleEOF conkey mvar newCon | 441 | handleEOF conkey mvar newCon |
416 | 442 | ||
@@ -701,7 +727,20 @@ pingBump me = do | |||
701 | (1000*pingIdle me,PingIdle) | 727 | (1000*pingIdle me,PingIdle) |
702 | takeTMVar (pingStarted me) | 728 | takeTMVar (pingStarted me) |
703 | when b $ throwTo (pingThread me) $ ErrorCall "" | 729 | when b $ throwTo (pingThread me) $ ErrorCall "" |
730 | {- | ||
731 | utc <- getCurrentTime | ||
732 | let utc' = formatTime defaultTimeLocale "%s" utc | ||
733 | warn $ "BUMP " <> bshow utc' <> " " <> bshow (pingIdle me, pingTimeOut me) | ||
734 | -} | ||
704 | atomically $ putTMVar (pingStarted me) b | 735 | atomically $ putTMVar (pingStarted me) b |
736 | {- | ||
737 | pingBump me = do | ||
738 | b <- atomically $ do | ||
739 | when (pingIdle me /= 0) $ | ||
740 | putTMVar (pingDelay me) (1000*pingIdle me,PingIdle) | ||
741 | readTMVar (pingStarted me) | ||
742 | when b $ throwTo (pingThread me) $ ErrorCall "" | ||
743 | -} | ||
705 | 744 | ||
706 | pingWait :: PingMachine -> STM PingEvent | 745 | pingWait :: PingMachine -> STM PingEvent |
707 | pingWait me = do | 746 | pingWait me = do |