[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