packages feed

core-program 0.3.0.7 → 0.3.0.8

raw patch · 2 files changed

+25/−11 lines, 2 filesdep ~core-data

Dependency ranges changed: core-data

Files

core-program.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           core-program-version:        0.3.0.7+version:        0.3.0.8 synopsis:       Opinionated Haskell Interoperability description:    A library to help build command-line programs, both tools and                 longer-running daemons.@@ -57,7 +57,7 @@     , base >=4.11 && <5     , bytestring     , chronologique-    , core-data >=0.2.1.10+    , core-data >=0.2.1.11     , core-text >=0.3.4.0     , directory     , exceptions
lib/Core/Program/Execute.hs view
@@ -273,7 +273,7 @@     -- set up debug logger     l <-         Async.async $ do-            processTelemetryMessages forwarder tel+            processTelemetryMessages forwarder out tel      -- run actual program, ensuring to grab any otherwise uncaught exceptions.     code <-@@ -349,26 +349,40 @@ -- the technique used   by **io-streams** to just pass along a stream of Maybes, -- with Nothing signalling end-of-stream is exactly good enough for our needs. ---processTelemetryMessages :: Forwarder -> TQueue (Maybe Datum) -> IO ()-processTelemetryMessages processor tel = do+processTelemetryMessages :: Forwarder -> TQueue (Maybe Rope) -> TQueue (Maybe Datum) -> IO ()+processTelemetryMessages processor out tel = do     Safe.catch-        (loopForever action tel)+        (loopForever action out tel)         (collapseHandler "telemetry processing collapsed")   where     action = telemetryHandlerFrom processor -loopForever :: ([a] -> IO ()) -> TQueue (Maybe a) -> IO ()-loopForever action queue = do+loopForever :: ([a] -> IO ()) -> TQueue (Maybe Rope) -> TQueue (Maybe a) -> IO ()+loopForever action out queue = do+    start <- getCurrentTimeNanoseconds     -- block waiting for an item     possibleItems <- atomically $ do         cycleOverQueue [] -    -- handle it and loop, unless we're done     case possibleItems of+        -- we're done!         Nothing -> pure ()+        -- handle it and loop         Just items -> do-            action (reverse items)-            loopForever action queue+            catch+                (action (reverse items))+                ( \(e :: SomeException) -> do+                    now <- getCurrentTimeNanoseconds+                    let result =+                            formatLogMessage+                                start+                                now+                                SeverityWarn+                                ("sending telemetry failed (Exception: " <> intoRope (show e) <> "); Restarting exporter.")+                    atomically $ do+                        writeTQueue out (Just result)+                )+            loopForever action out queue   where     cycleOverQueue items =         case items of