[cmake-developers] New command 'file(LOCK_DIRECTORY ...)'
Ruslan Baratov
ruslan_baratov at yahoo.com
Fri Oct 10 07:45:14 EDT 2014
On 08-Oct-14 16:45, Brad King wrote:
> On 10/08/2014 07:52 AM, Ruslan Baratov wrote:
>> Okay :) I just not sure that I understand "to pass to some other
>> process" goal correctly.
> That was just an example of why one might want to drop management
> of the lock by CMake without actually unlocking it. Perhaps the
> code is starting a daemon and passes off responsibility for the
> unlock side to the daemon process.
Okay, got it.
>
>> * we just need to `unlock` file so the other instance will use it:
>> file(UNLOCK_FILE "/path/to/shared/file")
>> # now anybody can do the lock
> Yes. We also need the locking API to return information about
> whether we really acquired the lock.
So it can be TRY_LOCK and LOCK. But does the TRY_LOCK really needed?
With LOCK we can try to lock and spin until acquire, but what to do with
TRY_LOCK? Just give up?
>
>> * we need other process to "inherit" the lock (what for?), i.e. move
>> ownership (?):
>> file(LOCK_FILE "/path/to/shared/file")
>> execute_process(${CMAKE_COMMAND} --take-ownership "/path/to/shared/file"
>> ...)
>> # unlocked by execute_process
> I think all we need there is a way to ask CMake to take over
> responsibility for a lock that it did not originally create.
> It can also be in the file() command.
>
> Thanks,
> -Brad
>
Okay, so here is the commands inspired by C++:
file(TRY_LOCK "/path/to/file" result) # try to lock and return TRUE
on success (needed?)
file(LOCK ...) # lock until unlock (unlock by further code (what if
exit/crashed?) or by deamon)
file(LOCK_GUARD ...) # lock for scope of current function or until exit
file(UNLOCK ...) # explicit unlock of LOCK/LOCK_GUARD
Locking directory is equivalent to locking file `cmake.lock` in
directory "/path/to/shared/directory/":
file(DIRECTORY_TRY_LOCK ...)
file(DIRECTORY_LOCK "/path/to/shared/directory/") # == file(LOCK
"/path/to/shared/directory/cmake.lock")
file(DIRECTORY_LOCK_GUARD ...)
file(DIRECTORY_UNLOCK ...)
If any of this commands failed (e.g. have no permissions) - exit with
unsuccessful code (i.e. FATAL_ERROR) ?
* http://en.cppreference.com/w/cpp/thread/try_lock
* http://en.cppreference.com/w/cpp/thread/lock
* http://en.cppreference.com/w/cpp/thread/lock_guard
* http://en.cppreference.com/w/cpp/thread/mutex/unlock
More information about the cmake-developers
mailing list