Skip to content

Commit 257e53b

Browse files
committed
fix race conditions
1 parent c065cfa commit 257e53b

3 files changed

Lines changed: 38 additions & 9 deletions

File tree

atlas.nimble

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Package
2-
version = "0.14.4"
2+
version = "0.14.5"
33
author = "Araq"
44
description = "Atlas is a simple package cloner tool. It manages an isolated project."
55
license = "MIT"

config.nims

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ else:
1515
--path:"$nim"
1616
--nimcache:".nimcache"
1717
--d:ssl
18+
--d:useMalloc
1819
--gc:atomicArc
1920
--threads:on
2021

src/basic/gitprogresspool.nim

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ type
5353
GitProgressWorkerArgs = object
5454
jobs: seq[IndexedGitProgressJob]
5555
events: ptr GitProgressEventQueue
56+
startLock: ptr Lock
5657

5758
GitProgressJobState = object
5859
label: string
@@ -380,13 +381,19 @@ proc gitProgressWorker(args: GitProgressWorkerArgs) {.thread.} =
380381
label: job.label
381382
)
382383

383-
var process = startProcess(
384-
job.command,
385-
workingDir = job.workingDir,
386-
args = job.args,
387-
options = {poUsePath, poStdErrToStdOut}
388-
)
384+
var process: Process
389385
try:
386+
acquire(args.startLock[])
387+
try:
388+
process = startProcess(
389+
job.command,
390+
workingDir = job.workingDir,
391+
args = job.args,
392+
options = {poUsePath, poStdErrToStdOut}
393+
)
394+
finally:
395+
release(args.startLock[])
396+
390397
let readResult = readGitProgressOutput(process, indexedJob.index, job.label, args.events)
391398
let exitCode = waitForExit(process)
392399
args.events.pushEvent GitProgressEvent(
@@ -397,8 +404,22 @@ proc gitProgressWorker(args: GitProgressWorkerArgs) {.thread.} =
397404
exitCode: exitCode,
398405
progress: readResult.progress
399406
)
407+
except CatchableError as exc:
408+
args.events.pushEvent GitProgressEvent(
409+
kind: gpFinished,
410+
jobIndex: indexedJob.index,
411+
label: job.label,
412+
output: $exc.name & ": " & exc.msg,
413+
exitCode: 1,
414+
progress: GitProgressSnapshot(phase: "failed", percent: -1)
415+
)
400416
finally:
401-
close(process)
417+
if process != nil:
418+
acquire(args.startLock[])
419+
try:
420+
close(process)
421+
finally:
422+
release(args.startLock[])
402423

403424
proc runGitProgressJobs*(
404425
jobs: openArray[GitProgressJob];
@@ -423,14 +444,20 @@ proc runGitProgressJobs*(
423444
let renderInteractive = interactiveProgressEnabled(showProgress)
424445
var eventQueue: GitProgressEventQueue
425446
initLock(eventQueue.lock)
447+
var startLock: Lock
448+
initLock(startLock)
426449

427450
var workerSlices = splitJobs(jobsSeq, effectiveWorkers)
428451
var threads = newSeq[Thread[GitProgressWorkerArgs]](effectiveWorkers)
429452
for idx in 0..<effectiveWorkers:
430453
createThread(
431454
threads[idx],
432455
gitProgressWorker,
433-
GitProgressWorkerArgs(jobs: workerSlices[idx], events: addr eventQueue)
456+
GitProgressWorkerArgs(
457+
jobs: workerSlices[idx],
458+
events: addr eventQueue,
459+
startLock: addr startLock
460+
)
434461
)
435462

436463
var finished = 0
@@ -501,3 +528,4 @@ proc runGitProgressJobs*(
501528
stdout.flushFile()
502529

503530
deinitLock(eventQueue.lock)
531+
deinitLock(startLock)

0 commit comments

Comments
 (0)