Cache -> HashMap in Messaging.Fake

This commit is contained in:
Dmitry Zuikov 2023-01-26 19:50:03 +03:00
parent 9dfa09c462
commit d19777660c
2 changed files with 21 additions and 5 deletions

View File

@ -8,6 +8,7 @@ import HBS2.Net.Proto
import HBS2.Net.Messaging import HBS2.Net.Messaging
import Control.Concurrent.STM (atomically) -- as STM import Control.Concurrent.STM (atomically) -- as STM
import Control.Concurrent.STM.TVar
import Control.Concurrent.STM.TChan qualified as Chan import Control.Concurrent.STM.TChan qualified as Chan
import Control.Concurrent.STM.TChan (TChan,newTChanIO) import Control.Concurrent.STM.TChan (TChan,newTChanIO)
import Control.Monad.IO.Class import Control.Monad.IO.Class
@ -16,28 +17,42 @@ import Data.Cache qualified as Cache
import Data.List qualified as List import Data.List qualified as List
import Data.Maybe import Data.Maybe
import Data.Hashable import Data.Hashable
import Data.HashMap.Strict (HashMap)
import Data.HashMap.Strict as HashMap
data FakeP2P proto msg = data FakeP2P proto msg =
FakeP2P FakeP2P
{ {
blocking :: Bool blocking :: Bool
, fakeP2p :: Cache (Peer proto) (TChan (From proto,msg)) , fakeP2p :: TVar (HashMap (Peer proto) (TChan (From proto,msg)))
} }
newFakeP2P :: Bool -> IO (FakeP2P peer msg) newFakeP2P :: (Eq (Peer peer), Hashable (Peer peer)) => Bool -> IO (FakeP2P peer msg)
newFakeP2P block = newFakeP2P block =
FakeP2P block <$> Cache.newCache Nothing FakeP2P block <$> newTVarIO mempty
getChan bus whom = do
ch <- newTChanIO
atomically $ stateTVar t (alter ch)
where
t = fakeP2p bus
alter ch x = case HashMap.lookup whom x of
Just c -> (c, x)
Nothing -> (ch, HashMap.insert whom ch x)
instance ( (HasPeer proto, Hashable (Peer proto)) instance ( (HasPeer proto, Hashable (Peer proto))
) => Messaging (FakeP2P proto msg) proto msg where ) => Messaging (FakeP2P proto msg) proto msg where
sendTo bus (To whom) who msg = liftIO do sendTo bus (To whom) who msg = liftIO do
chan <- Cache.fetchWithCache (fakeP2p bus) whom $ const newTChanIO ch <- newTChanIO
chan <- getChan bus whom
atomically $ Chan.writeTChan chan (who, msg) atomically $ Chan.writeTChan chan (who, msg)
receive bus (To me) = liftIO do receive bus (To me) = liftIO do
readChan =<< Cache.fetchWithCache (fakeP2p bus) me (const newTChanIO) readChan =<< getChan bus me -- Cache.fetchWithCache (fakeP2p bus) me (const newTChanIO)
where where
readChan | blocking bus = atomically . (List.singleton <$>) . Chan.readTChan readChan | blocking bus = atomically . (List.singleton <$>) . Chan.readTChan

View File

@ -51,6 +51,7 @@ common common-deps
common shared-properties common shared-properties
ghc-options: ghc-options:
-Wall -Wall
-O2
-fno-warn-type-defaults -fno-warn-type-defaults
-- -fno-warn-unused-matches -- -fno-warn-unused-matches
-- -fno-warn-unused-do-bind -- -fno-warn-unused-do-bind