have setConcurrency stop any running git coprocesses
When non-concurrent git coprocesses have been started, setConcurrency used to not stop them, and so could leak processes when enabling concurrency, eg when forkState is called. I do not think that ever actually happened, given where setConcurrency is called. And it probably would only leak one of each process, since it never downgrades from concurrent to non-concurrent.
This commit is contained in:
parent
261947683b
commit
15d617f7e1
3 changed files with 39 additions and 12 deletions
|
@ -17,6 +17,7 @@ import qualified Annex.Queue
|
|||
import Annex.Action
|
||||
import Types.Concurrency
|
||||
import Types.CatFileHandles
|
||||
import Annex.CatFile
|
||||
import Annex.CheckAttr
|
||||
import Annex.CheckIgnore
|
||||
|
||||
|
@ -32,18 +33,31 @@ setConcurrency' NonConcurrent f =
|
|||
{ Annex.concurrency = f NonConcurrent
|
||||
}
|
||||
setConcurrency' c f = do
|
||||
cfh <- getState Annex.catfilehandles
|
||||
cfh' <- case cfh of
|
||||
CatFileHandlesNonConcurrent _ -> liftIO catFileHandlesPool
|
||||
CatFileHandlesPool _ -> pure cfh
|
||||
cah <- mkConcurrentCheckAttrHandle c
|
||||
cih <- mkConcurrentCheckIgnoreHandle c
|
||||
Annex.changeState $ \s -> s
|
||||
{ Annex.concurrency = f c
|
||||
, Annex.catfilehandles = cfh'
|
||||
, Annex.checkattrhandle = Just cah
|
||||
, Annex.checkignorehandle = Just cih
|
||||
}
|
||||
oldc <- Annex.getState Annex.concurrency
|
||||
case oldc of
|
||||
ConcurrencyCmdLine NonConcurrent -> fromnonconcurrent
|
||||
ConcurrencyGitConfig NonConcurrent -> fromnonconcurrent
|
||||
_
|
||||
| oldc == newc -> return ()
|
||||
| otherwise ->
|
||||
Annex.changeState $ \s -> s
|
||||
{ Annex.concurrency = newc
|
||||
}
|
||||
where
|
||||
newc = f c
|
||||
fromnonconcurrent = do
|
||||
catFileStop
|
||||
checkAttrStop
|
||||
checkIgnoreStop
|
||||
cfh <- liftIO catFileHandlesPool
|
||||
cah <- mkConcurrentCheckAttrHandle c
|
||||
cih <- mkConcurrentCheckIgnoreHandle c
|
||||
Annex.changeState $ \s -> s
|
||||
{ Annex.concurrency = newc
|
||||
, Annex.catfilehandles = cfh
|
||||
, Annex.checkattrhandle = Just cah
|
||||
, Annex.checkignorehandle = Just cih
|
||||
}
|
||||
|
||||
{- Allows forking off a thread that uses a copy of the current AnnexState
|
||||
- to run an Annex action.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue