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
403424proc 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