[cmake-developers] New command 'file(LOCK_DIRECTORY ...)'
Ruslan Baratov
ruslan_baratov at yahoo.com
Tue Oct 28 16:28:51 EDT 2014
On 13-Oct-14 18:39, Brad King wrote:
> With all the above in mind, please brainstorm and propose a more complete
> signature set. You can use the keyword/value pairing common in other
> commands to avoid needing a positional argument for every value.
What do you think about this:
file(
LOCK <path>
[DIRECTORY] # if present locked file will be <path>/cmake.lock
(instead of <path>)
[RELEASE] # do explicit unlock
[GUARD <FUNCTION|FILE|PROCESS>] # if not present - set to `GUARD
PROCESS` (not used if RELEASE)
[RESULT_VARIABLE <variable>] # 0 on success, error message
otherwise; if not present - any error is FATAL_ERROR
[TIMEOUT <seconds>]
# 0 - return immediately if operation failed (try_lock),
otherwise timeout (timed_lock);
# if not present - lock until success (or error);
# not used if RELEASE;
)
?
On 13-Oct-14 18:39, Brad King wrote:
> Also, please post a summary of how the implementation will work on each
> platform.
Boost implementation of file locking mechanism use
LockFileEx/UnlockFileEx for windows and fcntl for unix-like platforms.
These functions lock file only for current process. When process crashes
lock removed by OS automatically.
In terms of boost documentation `file(LOCK ...)` locks are exclusive and
advisory.
boost.interprocess:
http://www.boost.org/doc/libs/1_56_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock
LockFileEx:
http://msdn.microsoft.com/library/windows/desktop/aa365203%28v=vs.85%29.aspx
UnlockFileEx:
http://msdn.microsoft.com/library/windows/desktop/aa365716%28v=vs.85%29.aspx
fcntl (linux):
http://linux.die.net/man/2/fcntl
fcntl (mac):
https://developer.apple.com/library/Mac/documentation/Darwin/Reference/ManPages/man2/fcntl.2.html
I've tried (Un)LockFileEx/fcntl on windows (including mingw and cygwin),
linux and mac - works fine for me with one exception: cygwin's lock is
not visible by win32's lock. I.e. you can synchronize multiple cygwin
processes and multiple windows "normal" processes, but you can't mix them.
On 13-Oct-14 18:34, Ben Boeckel wrote:
> Maybe we need something like the 'trap' shell builtin which runs code on
> various triggers rather than something like file/directory locks...
Note that you can't set trap for SIGKILL. So if somebody will terminate
your CMake instance by `kill -9 <pid>` probably you will have a problem.
More information about the cmake-developers
mailing list