[[!comment format=mdwn username="joey" subject="""design""" date="2015-11-11T17:54:24Z" content=""" * annex.pidlock config setting * init can test if regular locks work and if not set annex.pidlock * Use .git/annex/lock as the lock file; create with `O_EXCL` and write pid and program name to it. (Should be able to check for stale pid and break old lock.) * Adapt Utility.LockPool to use that lock file and lock method when annex.pidlock is set. (How? It's a generic library..) * Note that for sanity, whenever Utility.LockPool would create a fine-grained lock file, that should still happen when using annex.pidlock. Just avoid locking it and use the global lock. This prevents any bugs along the lines of some code depending on the fine-grained lock file having been created (in order to delete it etc). * (We could possibly assume that, if a lock file is being created, it could be used as a pid lock file, and so use that instead of the single top-level lock file. This assumption might hold, but I don't really want to risk it. If some other code path uses the same lock file but does not allow it to be created, it would not be able to write the pid to it (because it might be eg an annex object file), then the two code paths would end up using different lock files for the same lock, which would be bad.) This will always be an exclusive lock, and a single lock at that, unlike git-annex's usual fine-grained, often shared locks. But, the LockPool builds all that stuff at the thread level using STM anyway, so multiple threads of the same process can still cooperate with shared locks etc. Commands that don't need to take any lock (eg, query commands) will interoperate as before. But, many commands that can normally run concurrently won't be able to when using annex.pidlock, and will have to either loop-wait on the lock file, or error out. """]]