aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJoris2019-09-05 21:48:06 +0200
committerJoris2019-09-05 21:48:06 +0200
commit91419f240b788339c202e0d35ef1df3cae64216b (patch)
tree99da65a72dee71e993d30ff967fa60c4b3fa0c04 /src
parent317e7b1e7319182e5caa5169119aea9fc8d660b6 (diff)
Add noise to sleep duration
Diffstat (limited to 'src')
-rw-r--r--src/executable/haskell/Service/AdListener.hs7
-rw-r--r--src/lib/haskell/Utils/Time.hs12
2 files changed, 16 insertions, 3 deletions
diff --git a/src/executable/haskell/Service/AdListener.hs b/src/executable/haskell/Service/AdListener.hs
index 9af92f4..5b4d634 100644
--- a/src/executable/haskell/Service/AdListener.hs
+++ b/src/executable/haskell/Service/AdListener.hs
@@ -71,9 +71,10 @@ sleepUntilReady conf = do
Just d -> do
sleepSeconds d
- Nothing ->
- -- TODO 04/09/2019: Add noise
- sleepSeconds . Conf.listenInterval $ conf
+ Nothing -> do
+ duration <- TimeUtils.addNoise (Conf.listenInterval conf) (Conf.listenIntervalNoise conf)
+ putStrLn . show $ duration
+ sleepSeconds duration
where
sleepSeconds =
threadDelay . (*) 1000000 . round
diff --git a/src/lib/haskell/Utils/Time.hs b/src/lib/haskell/Utils/Time.hs
index 88aeeb6..ce36293 100644
--- a/src/lib/haskell/Utils/Time.hs
+++ b/src/lib/haskell/Utils/Time.hs
@@ -1,6 +1,7 @@
module Utils.Time
( getCurrentFormattedTime
, asleepDuration
+ , addNoise
) where
import Data.Text (Text)
@@ -9,6 +10,7 @@ import Data.Time.Clock (DiffTime)
import qualified Data.Time.Clock as Clock
import qualified Data.Time.Format as Format
import qualified Data.Time.LocalTime as LocalTime
+import qualified System.Random as Random
getCurrentFormattedTime :: IO Text
getCurrentFormattedTime = do
@@ -27,3 +29,13 @@ asleepDuration from to t =
Nothing
where
day = (realToFrac Clock.nominalDay) :: DiffTime
+
+-- |Add noise to a duration.
+-- > t - (n / 2) <= addNoise t n <= t + (n / 2)
+addNoise :: DiffTime -> DiffTime -> IO DiffTime
+addNoise t n = do
+ r <- Random.randomIO :: IO Float
+ return $ t + (Clock.secondsToDiffTime . round $ (r * (fromIntegral . toSeconds $ n))) - n / 2
+
+ where
+ toSeconds dt = Clock.diffTimeToPicoseconds dt `div` 10^(12 :: Integer)