summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Sima <ben@bsima.me>2025-11-14 13:38:28 -0500
committerBen Sima <ben@bsima.me>2025-11-14 13:38:28 -0500
commit6e9f06455b04e2110bb14eb2c84689cef62ed856 (patch)
tree5880c4695b60ef19c2fa6e8d3169a3983158f045
parent4c4dc3a991ffde0aa821f8669024787fb65635ba (diff)
Thread LineManager through build functions
- Reserve line for each concurrent build - Release line on completion with success/failed state - Fix hlint eta reduce warning Task: t-1a1E3j1
-rw-r--r--.tasks/tasks.jsonl2
-rwxr-xr-xOmni/Bild.hs16
-rw-r--r--Omni/Log/Concurrent.hs22
3 files changed, 23 insertions, 17 deletions
diff --git a/.tasks/tasks.jsonl b/.tasks/tasks.jsonl
index 5bd93c2..9e357b5 100644
--- a/.tasks/tasks.jsonl
+++ b/.tasks/tasks.jsonl
@@ -78,7 +78,7 @@
{"taskCreatedAt":"2025-11-14T18:19:45.800202144Z","taskDependencies":[],"taskId":"t-1a1DGY0","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Done","taskTitle":"Implement line reservation and release logic","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:33:02.855747669Z"}
{"taskCreatedAt":"2025-11-14T18:19:45.82813327Z","taskDependencies":[],"taskId":"t-1a1DOev","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Done","taskTitle":"Implement concurrent line update with ANSI codes","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:33:02.915807677Z"}
{"taskCreatedAt":"2025-11-14T18:19:45.857123437Z","taskDependencies":[],"taskId":"t-1a1DVM5","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Done","taskTitle":"Add terminal capability detection","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:33:02.975985146Z"}
-{"taskCreatedAt":"2025-11-14T18:19:45.886073324Z","taskDependencies":[],"taskId":"t-1a1E3j1","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Open","taskTitle":"Thread LineManager through build/nixBuild functions","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:19:45.886073324Z"}
+{"taskCreatedAt":"2025-11-14T18:19:45.886073324Z","taskDependencies":[],"taskId":"t-1a1E3j1","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Done","taskTitle":"Thread LineManager through build/nixBuild functions","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:38:03.516198105Z"}
{"taskCreatedAt":"2025-11-14T18:19:45.914626247Z","taskDependencies":[],"taskId":"t-1a1EaJy","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Open","taskTitle":"Create runWithLineManager and logsToLine functions","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:19:45.914626247Z"}
{"taskCreatedAt":"2025-11-14T18:19:45.94320795Z","taskDependencies":[],"taskId":"t-1a1Eiay","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Open","taskTitle":"Test parallel builds with ANSI multi-line output","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:19:45.94320795Z"}
{"taskCreatedAt":"2025-11-14T18:19:45.971879353Z","taskDependencies":[],"taskId":"t-1a1EpCZ","taskNamespace":null,"taskParent":"t-19ZF6A8","taskStatus":"Open","taskTitle":"Add fallback for dumb terminals","taskType":"WorkTask","taskUpdatedAt":"2025-11-14T18:19:45.971879353Z"}
diff --git a/Omni/Bild.hs b/Omni/Bild.hs
index 414049b..aa79877 100755
--- a/Omni/Bild.hs
+++ b/Omni/Bild.hs
@@ -142,6 +142,7 @@ import qualified Network.HostName as HostName
import qualified Omni.Bild.Meta as Meta
import qualified Omni.Cli as Cli
import qualified Omni.Log as Log
+import qualified Omni.Log.Concurrent as LogC
import Omni.Namespace (Namespace (..))
import qualified Omni.Namespace as Namespace
import Omni.Test ((@=?))
@@ -954,12 +955,15 @@ build :: Bool -> Bool -> Int -> Int -> Analysis -> IO [Exit.ExitCode]
build andTest loud jobs cpus analysis = do
root <- Env.getEnv "CODEROOT"
let targets = Map.elems analysis
- results <- mapConcurrentlyBounded jobs (buildTarget root) targets
- pure (map fst results)
+ LogC.withLineManager jobs <| \lineMgr -> do
+ results <- mapConcurrentlyBounded jobs (buildTarget lineMgr root) targets
+ pure (map fst results)
where
- buildTarget :: FilePath -> Target -> IO (Exit.ExitCode, ByteString)
- buildTarget root target@Target {..} =
- case compiler of
+ buildTarget :: LogC.LineManager -> FilePath -> Target -> IO (Exit.ExitCode, ByteString)
+ buildTarget lineMgr root target@Target {..} = do
+ mLineNum <- LogC.reserveLine lineMgr namespace
+ let doRelease = LogC.releaseLine lineMgr mLineNum
+ result <- case compiler of
CPython -> case out of
Just _ ->
Log.info ["bild", "nix", "python", nschunk namespace]
@@ -1016,6 +1020,8 @@ build andTest loud jobs cpus analysis = do
Sbcl ->
Log.info ["bild", "dev", "lisp", nschunk namespace]
>> proc loud namespace (toNixFlag compiler) compilerFlags
+ doRelease (isSuccess (fst result) ?: (LogC.Success, LogC.Failed))
+ pure result
data Proc = Proc
{ loud :: Bool,
diff --git a/Omni/Log/Concurrent.hs b/Omni/Log/Concurrent.hs
index 2a46df5..5187367 100644
--- a/Omni/Log/Concurrent.hs
+++ b/Omni/Log/Concurrent.hs
@@ -88,13 +88,13 @@ reserveLine LineManager {..} ns =
if not lmSupportsANSI
then pure Nothing
else
- atomicModifyIORef' lmLines <| \lines ->
- case findFirstFree lines of
- Nothing -> (lines, Nothing)
+ atomicModifyIORef' lmLines <| \linesMap ->
+ case findFirstFree linesMap of
+ Nothing -> (linesMap, Nothing)
Just lineNum ->
let status = BuildStatus ns "" Building
- lines' = Map.insert lineNum (Just status) lines
- in (lines', Just lineNum)
+ linesMap' = Map.insert lineNum (Just status) linesMap
+ in (linesMap', Just lineNum)
where
findFirstFree :: Map Int (Maybe BuildStatus) -> Maybe Int
findFirstFree m =
@@ -127,16 +127,16 @@ updateLine LineManager {..} mLineNum ns output =
ANSI.hRestoreCursor IO.stderr
- modifyIORef' lmLines <| \lines ->
- Map.adjust (fmap (\bs -> bs {bsLastOutput = output})) lineNum lines
+ modifyIORef' lmLines <| \linesMap ->
+ Map.adjust (fmap (\bs -> bs {bsLastOutput = output})) lineNum linesMap
releaseLine :: LineManager -> Maybe Int -> BuildState -> IO ()
-releaseLine LineManager {..} mLineNum state =
+releaseLine LineManager {..} mLineNum buildState =
case mLineNum of
Nothing -> pure ()
Just lineNum -> do
- modifyIORef' lmLines <| \lines ->
- Map.insert lineNum Nothing lines
+ modifyIORef' lmLines <| \linesMap ->
+ Map.insert lineNum Nothing linesMap
when lmSupportsANSI <| do
current <- readIORef lmCurrentLine
@@ -145,7 +145,7 @@ releaseLine LineManager {..} mLineNum state =
ANSI.hCursorUp IO.stderr (current - lineNum)
ANSI.hClearLine IO.stderr
- let statusChar = case state of
+ let statusChar = case buildState of
Success -> "✓"
Failed -> "✗"
Building -> "…"