diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-01-25 10:22:04 +0100 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-01-27 19:45:23 +0100 |
| commit | 66bfcd8ad4ef16dcd0e287004dc08f8948589bce (patch) | |
| tree | 337a1658cc4ff76c14254a0d69aafd6c61765a14 /src/Erebos/Network.hs | |
| parent | 7e0685f049f8981c4f11c3c83caacf85bc855577 (diff) | |
Deferred object loading
Diffstat (limited to 'src/Erebos/Network.hs')
| -rw-r--r-- | src/Erebos/Network.hs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/Erebos/Network.hs b/src/Erebos/Network.hs index b5cfa6b..3a6f259 100644 --- a/src/Erebos/Network.hs +++ b/src/Erebos/Network.hs @@ -26,6 +26,7 @@ module Erebos.Network ( sendToPeerWith, runPeerService, modifyServiceGlobalState, + requestDataFromPeer, DataRequestResult(..), discoveryPort, ) where @@ -1063,6 +1064,19 @@ modifyServiceGlobalState server proxy f = do throwErebosError $ UnhandledService svc +data DataRequestResult + = DataRequestFulfilled Ref + | DataRequestRejected + | DataRequestInvalid + +requestDataFromPeer :: MonadIO m => Peer -> RefDigest -> (DataRequestResult -> ExceptT ErebosError IO ()) -> m () +requestDataFromPeer peer@Peer {..} dgst callback = do + liftIO $ atomically $ do + wref <- WaitingRef peerStorage_ (partialRefFromDigest peerInStorage dgst) (callback . DataRequestFulfilled) <$> newTVar (Left []) + putTMVar peerWaitingRefs . (wref :) =<< takeTMVar peerWaitingRefs + writeTQueue (serverDataResponse peerServer_) ( peer, Nothing ) + + foreign import ccall unsafe "Network/ifaddrs.h erebos_join_multicast" cJoinMulticast :: CInt -> Ptr CSize -> IO (Ptr Word32) foreign import ccall unsafe "Network/ifaddrs.h erebos_local_addresses" cLocalAddresses :: Ptr CSize -> IO (Ptr InetAddress) foreign import ccall unsafe "Network/ifaddrs.h erebos_broadcast_addresses" cBroadcastAddresses :: IO (Ptr Word32) |