Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-18 Thread Matthew Woehlke
On 2014-12-18 11:30, Ruslan Baratov via cmake-developers wrote:
> You prefer ".cmake.lock", I prefer "cmake.lock", others prefer
> '.lock'/'.cmake'. For me it doesn't really matter. What matter is the
> *standard* cmake name.

FWIW, I do have a slight preference to using a hidden file :-).

> About "implementation complexity": 
> [...diffs elided...]

There's also the documentation, unit tests...

I don't think there is appreciable maintenance overhead, or I'd feel
more strongly about it. The point was just to consider these things.
(Having written it already also makes the question somewhat moot.)

> I'm the one who will use this feature without timeouts (it's impossible
> to predict some). E.g. cmake instance will run ExternalProject_Add with
> Qt building for > 4 hours, should I set the timeout so my jenkins jobs
> will crash? Or should I print waiting message every second?

I'd print *one* message if the lock has not been obtained "quickly".
Even in the situation you describe, if I were writing the lock, I would
probably wrap it in a helper to print why it's waiting (or else always
print a message before trying to get the lock and once the lock is
held), just so that it's obvious from the logs if a build is stuck
waiting on the lock or stuck for some other reason.

That said... I think you've convinced me that if you need a lock with no
timeout, it should *always* generate status messages, which can more
reasonably be punted to the CMakeLists.txt author.

-- 
Matthew

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-18 Thread Ruslan Baratov via cmake-developers

On 18-Dec-14 01:49, Matthew Woehlke wrote:

On 2014-12-17 16:58, Ruslan Baratov via cmake-developers wrote:

On 17-Dec-14 21:11, Matthew Woehlke wrote:

On 2014-10-13 10:39, Brad King wrote:

On 10/10/2014 07:45 AM, Ruslan Baratov wrote:

Locking directory is equivalent to locking file `cmake.lock` in
directory "/path/to/shared/directory/":

I think this can be activated buy a DIRECTORY option.

Why do we need even that? Can't CMake just test if the lock target is a
directory?

I've used boost.interprocess as a hint for implementation, as far as I
know boost::interprocess::file_lock is not able to lock directories:
   terminate called after throwing an instance of
'boost::interprocess::interprocess_exception'
 what():  Is a directory

I'm not saying that it's not possible, just trying to use well-known
cross-platform solution.

Locking a directory "as such" may not be possible (that wouldn't
surprise me). That's not what I meant, though; what I meant is, rather
than make the user say "this is a directory" to instead lock a special
file name in the directory, just have CMake check if the path is a
directory and then use that logic implicitly.

Okay, now I see what you mean :)

  Requiring the user to
specify seems superfluous when it's trivial for CMake to just check.

Example:

   file(LOCK /path/to/file) # lock /path/to/file
   file(LOCK /path/to) # lock /path/to/.cmake_lock
`file(LOCK /path/to/file DIRECTORY)` and `file(LOCK /path/to/directory)` 
will report an error instead of silently lock creation.

(And before anyone mentions it, I have limited sympathy for someone
locking a non-existing directory and then later trying to create it.
Don't do that :-). I'm having a very hard time coming up with a reason
why one wouldn't just create the directory first to ensure it exists.)

Just for your information:
* there is no sub-option RECURSIVE for command `file(MAKE_DIRECTORY 
...)`, so all intermediate directories will be always created if they 
not exist.
* command `file(WRITE "/path/to/some/file.txt" "some info") will create 
all directories too
* command `install` create all directories. E.g. if some developer 
(well, bad developer) will hardcode '/usr/local' in 
CMAKE_INSTALL_PREFIX, binaries will be installed into `X:/usr/local` on 
windows.


For that matter, do we even *need* this feature? If I want to lock a
"directory", is it worth the extra implementation complexity just to
save me inventing some arbitrary name for a lock file?


You prefer ".cmake.lock", I prefer "cmake.lock", others prefer 
'.lock'/'.cmake'. For me it doesn't really matter. What matter is the 
*standard* cmake name.


About "implementation complexity":

@@ -3512,7 +3512,6 @@ bool cmFileCommand::HandleLockCommand(
-  bool directory = false;
@@ -3535,10 +3534,6 @@ bool cmFileCommand::HandleLockCommand(
-if (args[i] == "DIRECTORY")
-  {
-  directory = true;
-  }
@@ -3617,11 +3612,6 @@ bool cmFileCommand::HandleLockCommand(
-  if (directory)
-{
-path += "/cmake.lock";
-}


p.s. For a lock with no timeout, maybe there can be a built-in timeout
after which CMake displays a message what it's trying to do, so that it
doesn't just hang mysteriously.

You can use `message` command:

 message(STATUS "Try to lock ${file}")
 file(LOCK ${file})

or more complex (more user-friendly):

   while(TRUE)
 file(LOCK "${file}" RESULT is_locked TIMEOUT 5)
 if(is_locked)
   message("Locked. ${resource_info}")
   break()
 endif()
 string(TIMESTAMP time_now "%S/%M")
 message("[${time_now}] Lock failed, retry... (file: ${file})")
   endwhile()

Sure. I was just thinking out loud if folks are worried about CMake
"mysteriously" hanging, this (implemented in CMake proper) would be an
option to allay those concerns.
You can use `file(LOCK ...` as a base block for creation more 
complex/verbose locks (i.e. you can add CMakeLockHelpers extra module), 
I don't see any implementation defects that can't you allow to do one.


*Developers* do the "mysterious" stuff, not cmake. You can write:

  while(TRUE)
  endwhile()

so should we print extra message on entering `while`?

Though it would be the nice feature if you can read some info about 
lockers. E.g. `CMAKE_BINARY_DIR`, username, pid and timestamp. But this 
require a lot of work: lock new file for writing (cmake.lock-info), 
write some info (what format?), unlock (allow other process read info 
file) and so on.

  (I'd also encourage anyone writing
locks, especially with no time out, to always say what they're doing
first :-). But that's somewhat a separate issue.)

I'm the one who will use this feature without timeouts (it's impossible 
to predict some). E.g. cmake instance will run ExternalProject_Add with 
Qt building for > 4 hours, should I set the timeout so my jenkins jobs 
will crash? Or should I print waiting message every second? What about > 
14400 lines of useless/endless logs? The imp

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-17 Thread Matthew Woehlke
On 2014-12-17 16:58, Ruslan Baratov via cmake-developers wrote:
> On 17-Dec-14 21:11, Matthew Woehlke wrote:
>> On 2014-10-13 10:39, Brad King wrote:
>>> On 10/10/2014 07:45 AM, Ruslan Baratov wrote:
 Locking directory is equivalent to locking file `cmake.lock` in
 directory "/path/to/shared/directory/":
>>> I think this can be activated buy a DIRECTORY option.
>> Why do we need even that? Can't CMake just test if the lock target is a
>> directory?
> I've used boost.interprocess as a hint for implementation, as far as I
> know boost::interprocess::file_lock is not able to lock directories:
>   terminate called after throwing an instance of
> 'boost::interprocess::interprocess_exception'
> what():  Is a directory
> 
> I'm not saying that it's not possible, just trying to use well-known
> cross-platform solution.

Locking a directory "as such" may not be possible (that wouldn't
surprise me). That's not what I meant, though; what I meant is, rather
than make the user say "this is a directory" to instead lock a special
file name in the directory, just have CMake check if the path is a
directory and then use that logic implicitly. Requiring the user to
specify seems superfluous when it's trivial for CMake to just check.

Example:

  file(LOCK /path/to/file) # lock /path/to/file
  file(LOCK /path/to) # lock /path/to/.cmake_lock

(And before anyone mentions it, I have limited sympathy for someone
locking a non-existing directory and then later trying to create it.
Don't do that :-). I'm having a very hard time coming up with a reason
why one wouldn't just create the directory first to ensure it exists.)

For that matter, do we even *need* this feature? If I want to lock a
"directory", is it worth the extra implementation complexity just to
save me inventing some arbitrary name for a lock file?

>> p.s. For a lock with no timeout, maybe there can be a built-in timeout
>> after which CMake displays a message what it's trying to do, so that it
>> doesn't just hang mysteriously.
>
> You can use `message` command:
> 
> message(STATUS "Try to lock ${file}")
> file(LOCK ${file})
> 
> or more complex (more user-friendly):
> 
>   while(TRUE)
> file(LOCK "${file}" RESULT is_locked TIMEOUT 5)
> if(is_locked)
>   message("Locked. ${resource_info}")
>   break()
> endif()
> string(TIMESTAMP time_now "%S/%M")
> message("[${time_now}] Lock failed, retry... (file: ${file})")
>   endwhile()

Sure. I was just thinking out loud if folks are worried about CMake
"mysteriously" hanging, this (implemented in CMake proper) would be an
option to allay those concerns. (I'd also encourage anyone writing
locks, especially with no time out, to always say what they're doing
first :-). But that's somewhat a separate issue.)

-- 
Matthew

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-17 Thread Ruslan Baratov via cmake-developers

On 17-Dec-14 21:11, Matthew Woehlke wrote:

On 2014-10-13 10:39, Brad King wrote:

On 10/10/2014 07:45 AM, Ruslan Baratov wrote:

Locking directory is equivalent to locking file `cmake.lock` in
directory "/path/to/shared/directory/":

I think this can be activated buy a DIRECTORY option.

Why do we need even that? Can't CMake just test if the lock target is a
directory?
I've used boost.interprocess as a hint for implementation, as far as I 
know boost::interprocess::file_lock is not able to lock directories:
  terminate called after throwing an instance of 
'boost::interprocess::interprocess_exception'

what():  Is a directory

I'm not saying that it's not possible, just trying to use well-known 
cross-platform solution.



p.s. For a lock with no timeout, maybe there can be a built-in timeout
after which CMake displays a message what it's trying to do, so that it
doesn't just hang mysteriously.

You can use `message` command:

message(STATUS "Try to lock ${file}")
file(LOCK ${file})

or more complex (more user-friendly):

  while(TRUE)
file(LOCK "${file}" RESULT is_locked TIMEOUT 5)
if(is_locked)
  message("Locked. ${resource_info}")
  break()
endif()
string(TIMESTAMP time_now "%S/%M")
message("[${time_now}] Lock failed, retry... (file: ${file})")
  endwhile()


Ruslo
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-17 Thread Matthew Woehlke
On 2014-10-13 10:39, Brad King wrote:
> On 10/10/2014 07:45 AM, Ruslan Baratov wrote:
>> Locking directory is equivalent to locking file `cmake.lock` in 
>> directory "/path/to/shared/directory/":
> 
> I think this can be activated buy a DIRECTORY option.

Why do we need even that? Can't CMake just test if the lock target is a
directory?

p.s. For a lock with no timeout, maybe there can be a built-in timeout
after which CMake displays a message what it's trying to do, so that it
doesn't just hang mysteriously.

-- 
Matthew

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-05 Thread Brad King
On 12/05/2014 09:51 AM, Ruslan Baratov wrote:
> Sending patch with 'long'.

Applied while also renaming to StringToLong, thanks:

 file: Use 'long' to represent the parsed LOCK TIMEOUT value
 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=97841dad

> What granularity you think is appropriate, 100 ms? 10 ms? (It will be 
> value in `cmSystemTools::Delay(...);`)

On second thought, it is easy to change this later if a case comes up
that really needs it, so let's stay with 1s for now.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-05 Thread Ruslan Baratov via cmake-developers

On 05-Dec-14 17:09, Brad King wrote:

On 12/05/2014 09:03 AM, Ruslan Baratov wrote:

Actually why not use 'strtoll' and 'long long' ?

I'm not sure that function or type exists portably on some of the
older host platforms we support.  The "long" type should be plenty
big for timeout values, and there are other strtol call sites that
already use "long" and could be converted to use a StringToLong
helper too.

Sending patch with 'long'.

Actually for the lock timeout use case would it make sense to change
to a floating point value so timeouts can be more granular?  Some
use cases may not want to block for a whole second between lock
attempts.

What granularity you think is appropriate, 100 ms? 10 ms? (It will be 
value in `cmSystemTools::Delay(...);`)


Ruslo
>From 3ed0ad891c6108fa2a03834f9fe109ee5d628847 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Fri, 5 Dec 2014 17:18:11 +0300
Subject: [PATCH] Use 'long' for StringToInt

---
 Source/cmFileCommand.cxx   |  6 +++---
 Source/cmFileLock.cxx  |  4 ++--
 Source/cmFileLock.h|  4 ++--
 Source/cmFileLockPool.cxx  |  8 
 Source/cmFileLockPool.h| 10 ++
 Source/cmFileLockUnix.cxx  |  2 +-
 Source/cmFileLockWin32.cxx |  2 +-
 Source/cmSystemTools.cxx   |  7 ---
 Source/cmSystemTools.h |  4 ++--
 9 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index a6eb8c4..42cd132 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -3521,7 +3521,7 @@ bool cmFileCommand::HandleLockCommand(
   };
   Guard guard = GUARD_PROCESS;
   std::string resultVariable;
-  unsigned timeout = static_cast(-1);
+  unsigned long timeout = static_cast(-1);
 
   // Parse arguments
   if(args.size() < 2)
@@ -3597,7 +3597,7 @@ bool cmFileCommand::HandleLockCommand(
 "expected timeout value after TIMEOUT");
 return false;
 }
-  int scanned;
+  long scanned;
   if(!cmSystemTools::StringToInt(args[i].c_str(), &scanned) || scanned < 0)
 {
 cmOStringStream e;
@@ -3605,7 +3605,7 @@ bool cmFileCommand::HandleLockCommand(
 this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
 return false;
 }
-  timeout = static_cast(scanned);
+  timeout = static_cast(scanned);
   }
 else
   {
diff --git a/Source/cmFileLock.cxx b/Source/cmFileLock.cxx
index 5f75637..e6aa5f4 100644
--- a/Source/cmFileLock.cxx
+++ b/Source/cmFileLock.cxx
@@ -28,7 +28,7 @@ cmFileLock::~cmFileLock()
 }
 
 cmFileLockResult cmFileLock::Lock(
-const std::string& filename, unsigned timeout)
+const std::string& filename, unsigned long timeout)
 {
   if (filename.empty())
 {
@@ -48,7 +48,7 @@ cmFileLockResult cmFileLock::Lock(
   cmFileLockResult result = this->OpenFile();
   if (result.IsOk())
 {
-if (timeout == static_cast(-1))
+if (timeout == static_cast(-1))
   {
   result = this->LockWithoutTimeout();
   }
diff --git a/Source/cmFileLock.h b/Source/cmFileLock.h
index 4d922a0..dd959a7 100644
--- a/Source/cmFileLock.h
+++ b/Source/cmFileLock.h
@@ -37,7 +37,7 @@ class cmFileLock
 * @brief Lock the file.
 * @param timeoutSec Lock timeout. If -1 try until success or fatal error.
 */
-  cmFileLockResult Lock(const std::string& filename, unsigned timeoutSec);
+  cmFileLockResult Lock(const std::string& filename, unsigned long timeoutSec);
 
   /**
 * @brief Unlock the file.
@@ -57,7 +57,7 @@ class cmFileLock
 
   cmFileLockResult OpenFile();
   cmFileLockResult LockWithoutTimeout();
-  cmFileLockResult LockWithTimeout(unsigned timeoutSec);
+  cmFileLockResult LockWithTimeout(unsigned long timeoutSec);
 
 #if defined(_WIN32)
   typedef HANDLE FileId;
diff --git a/Source/cmFileLockPool.cxx b/Source/cmFileLockPool.cxx
index e84e71a..551a75a 100644
--- a/Source/cmFileLockPool.cxx
+++ b/Source/cmFileLockPool.cxx
@@ -60,7 +60,7 @@ void cmFileLockPool::PopFileScope()
 }
 
 cmFileLockResult cmFileLockPool::LockFunctionScope(
-const std::string& filename, unsigned timeoutSec)
+const std::string& filename, unsigned long timeoutSec)
 {
   if (this->IsAlreadyLocked(filename))
 {
@@ -74,7 +74,7 @@ cmFileLockResult cmFileLockPool::LockFunctionScope(
 }
 
 cmFileLockResult cmFileLockPool::LockFileScope(
-const std::string& filename, unsigned timeoutSec)
+const std::string& filename, unsigned long timeoutSec)
 {
   if (this->IsAlreadyLocked(filename))
 {
@@ -85,7 +85,7 @@ cmFileLockResult cmFileLockPool::LockFileScope(
 }
 
 cmFileLockResult cmFileLockPool::LockProcessScope(
-const std::string& filename, unsigned timeoutSec)
+const std::string& filename, unsigned long timeoutSec)
 {
   if (this->IsAlreadyLocked(filename))
 {
@@ -155,7 +155,7 @@ cmFileLockPool::ScopePool::~ScopePool()
 }
 
 cmFileLockResult cmFileLockPool::ScopePool::Lock(
-const std::string& filename, unsigned timeoutSec)
+const std::string& filename, unsigned long timeoutSe

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-05 Thread Brad King
On 12/05/2014 09:38 AM, Ruslan Baratov wrote:
> Okay, just curious what version it will be?

3.2.  There is a roadmap here:

 http://www.cmake.org/Bug/roadmap_page.php

with tentative dates.

-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-05 Thread Ruslan Baratov via cmake-developers

On 05-Dec-14 17:12, Brad King wrote:

On 12/05/2014 09:10 AM, Ruslan Baratov wrote:

   file: Add LOCK subcommand to do file and directory locking
   http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e6db4c5a


Great, thank you! So will this be applied to cmake 3.1.0?

No, sorry.  The feature deadline for that was almost 2 months ago.
The release candidate period has been pretty drawn out this time :(

-Brad


Okay, just curious what version it will be?

Ruslo
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-05 Thread Brad King
On 12/05/2014 09:10 AM, Ruslan Baratov wrote:
>>   file: Add LOCK subcommand to do file and directory locking
>>   http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e6db4c5a
>>
> Great, thank you! So will this be applied to cmake 3.1.0?

No, sorry.  The feature deadline for that was almost 2 months ago.
The release candidate period has been pretty drawn out this time :(

-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-05 Thread Ruslan Baratov via cmake-developers

On 03-Dec-14 18:10, Brad King wrote:

On 12/01/2014 10:52 AM, Brad King wrote:

  cmSystemTools: Add StringToInt helper
  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5121f118

  file: Add LOCK subcommand to do file and directory locking
  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fca624ca

  Help: Add notes for topic 'file-LOCK-command'
  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=ed00a808

After some revisions:

  cmSystemTools: Add StringToInt helper
  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=05d6531c

  file: Add LOCK subcommand to do file and directory locking
  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e6db4c5a

  Help: Add notes for topic 'file-LOCK-command'
  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=93017828

-Brad

Great, thank you! So will this be applied to cmake 3.1.0?
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-05 Thread Brad King
On 12/05/2014 09:03 AM, Ruslan Baratov wrote:
> Actually why not use 'strtoll' and 'long long' ?

I'm not sure that function or type exists portably on some of the
older host platforms we support.  The "long" type should be plenty
big for timeout values, and there are other strtol call sites that
already use "long" and could be converted to use a StringToLong
helper too.

Actually for the lock timeout use case would it make sense to change
to a floating point value so timeouts can be more granular?  Some
use cases may not want to block for a whole second between lock
attempts.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-05 Thread Ruslan Baratov via cmake-developers

On 01-Dec-14 23:32, Brad King wrote:

On 12/01/2014 03:26 PM, Stephen Kelly wrote:

Existing uses of strtol also check errno. I guess your implementation should
too.

Yes, IIUC it is a range check on whether the value can be represented.
I think also you need to zero errno before strtol since errno is not 
zeroed on successful conversion.



Then the existing users should use this new method.

In that case the type should be changed to 'long' instead of 'int',
and the current call site should be updated accordingly.

Actually why not use 'strtoll' and 'long long' ?

Sending patch with 'strtoll', 'long long' and 'errno=0'.

Ruslo
>From bd907fa4e4bd1e6f17c946ab54aa17beb1fd23e8 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Fri, 5 Dec 2014 15:10:32 +0300
Subject: [PATCH] Use 'long long' for StringToInt

---
 Source/cmFileCommand.cxx   |  6 +++---
 Source/cmFileLock.cxx  |  4 ++--
 Source/cmFileLock.h|  6 --
 Source/cmFileLockPool.cxx  |  8 
 Source/cmFileLockPool.h| 10 ++
 Source/cmFileLockUnix.cxx  |  2 +-
 Source/cmFileLockWin32.cxx |  2 +-
 Source/cmSystemTools.cxx   |  7 ---
 Source/cmSystemTools.h |  4 ++--
 9 files changed, 27 insertions(+), 22 deletions(-)

diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index a6eb8c4..c86b768 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -3521,7 +3521,7 @@ bool cmFileCommand::HandleLockCommand(
   };
   Guard guard = GUARD_PROCESS;
   std::string resultVariable;
-  unsigned timeout = static_cast(-1);
+  unsigned long long timeout = static_cast(-1);
 
   // Parse arguments
   if(args.size() < 2)
@@ -3597,7 +3597,7 @@ bool cmFileCommand::HandleLockCommand(
 "expected timeout value after TIMEOUT");
 return false;
 }
-  int scanned;
+  long long scanned;
   if(!cmSystemTools::StringToInt(args[i].c_str(), &scanned) || scanned < 0)
 {
 cmOStringStream e;
@@ -3605,7 +3605,7 @@ bool cmFileCommand::HandleLockCommand(
 this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
 return false;
 }
-  timeout = static_cast(scanned);
+  timeout = static_cast(scanned);
   }
 else
   {
diff --git a/Source/cmFileLock.cxx b/Source/cmFileLock.cxx
index 5f75637..f891105 100644
--- a/Source/cmFileLock.cxx
+++ b/Source/cmFileLock.cxx
@@ -28,7 +28,7 @@ cmFileLock::~cmFileLock()
 }
 
 cmFileLockResult cmFileLock::Lock(
-const std::string& filename, unsigned timeout)
+const std::string& filename, unsigned long long timeout)
 {
   if (filename.empty())
 {
@@ -48,7 +48,7 @@ cmFileLockResult cmFileLock::Lock(
   cmFileLockResult result = this->OpenFile();
   if (result.IsOk())
 {
-if (timeout == static_cast(-1))
+if (timeout == static_cast(-1))
   {
   result = this->LockWithoutTimeout();
   }
diff --git a/Source/cmFileLock.h b/Source/cmFileLock.h
index 4d922a0..7a8e6db 100644
--- a/Source/cmFileLock.h
+++ b/Source/cmFileLock.h
@@ -37,7 +37,9 @@ class cmFileLock
 * @brief Lock the file.
 * @param timeoutSec Lock timeout. If -1 try until success or fatal error.
 */
-  cmFileLockResult Lock(const std::string& filename, unsigned timeoutSec);
+  cmFileLockResult Lock(
+  const std::string& filename, unsigned long long timeoutSec
+  );
 
   /**
 * @brief Unlock the file.
@@ -57,7 +59,7 @@ class cmFileLock
 
   cmFileLockResult OpenFile();
   cmFileLockResult LockWithoutTimeout();
-  cmFileLockResult LockWithTimeout(unsigned timeoutSec);
+  cmFileLockResult LockWithTimeout(unsigned long long timeoutSec);
 
 #if defined(_WIN32)
   typedef HANDLE FileId;
diff --git a/Source/cmFileLockPool.cxx b/Source/cmFileLockPool.cxx
index e84e71a..862f44c 100644
--- a/Source/cmFileLockPool.cxx
+++ b/Source/cmFileLockPool.cxx
@@ -60,7 +60,7 @@ void cmFileLockPool::PopFileScope()
 }
 
 cmFileLockResult cmFileLockPool::LockFunctionScope(
-const std::string& filename, unsigned timeoutSec)
+const std::string& filename, unsigned long long timeoutSec)
 {
   if (this->IsAlreadyLocked(filename))
 {
@@ -74,7 +74,7 @@ cmFileLockResult cmFileLockPool::LockFunctionScope(
 }
 
 cmFileLockResult cmFileLockPool::LockFileScope(
-const std::string& filename, unsigned timeoutSec)
+const std::string& filename, unsigned long long timeoutSec)
 {
   if (this->IsAlreadyLocked(filename))
 {
@@ -85,7 +85,7 @@ cmFileLockResult cmFileLockPool::LockFileScope(
 }
 
 cmFileLockResult cmFileLockPool::LockProcessScope(
-const std::string& filename, unsigned timeoutSec)
+const std::string& filename, unsigned long long timeoutSec)
 {
   if (this->IsAlreadyLocked(filename))
 {
@@ -155,7 +155,7 @@ cmFileLockPool::ScopePool::~ScopePool()
 }
 
 cmFileLockResult cmFileLockPool::ScopePool::Lock(
-const std::string& filename, unsigned timeoutSec)
+const std::string& filename, unsigned long long timeoutSec)
 {
   cmFileLock *lock = new cmFileLock();
   const cmFileLockRe

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-03 Thread Brad King
On 12/01/2014 10:52 AM, Brad King wrote:
>  cmSystemTools: Add StringToInt helper
>  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5121f118
> 
>  file: Add LOCK subcommand to do file and directory locking
>  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fca624ca
> 
>  Help: Add notes for topic 'file-LOCK-command'
>  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=ed00a808

After some revisions:

 cmSystemTools: Add StringToInt helper
 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=05d6531c

 file: Add LOCK subcommand to do file and directory locking
 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=e6db4c5a

 Help: Add notes for topic 'file-LOCK-command'
 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=93017828

-Brad
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-02 Thread Brad King
On 12/02/2014 10:03 AM, Brad King wrote:
> Testing went pretty well, but the RunCMake.file test fails on HP-UX
> in the LOCK-error-timeout case:
> 
>  http://open.cdash.org/testDetails.php?test=297595272&build=3594885
> 
> The relevant expect/actual lines are:
> 
>>expect-err>   Timeout reached\.
>>actual-err>   Permission denied.
> 
> Any idea why that might happen?

This may fix it:

 cmFileLockUnix: Treat EACCES like EAGAIN
 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=35bcecc0

According to 'man fcntl' locking an already-locked file may fail
with either EACCES or EAGAIN.  We were only checking the latter.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-02 Thread Brad King
On 12/01/2014 10:52 AM, Brad King wrote:
> Thanks.  I squashed the commits since the addition of the files
> cannot be tested independently, made minor tweaks, and merged
> to 'next' for testing:

Testing went pretty well, but the RunCMake.file test fails on HP-UX
in the LOCK-error-timeout case:

 http://open.cdash.org/testDetails.php?test=297595272&build=3594885

The relevant expect/actual lines are:

>expect-err>   Timeout reached\.
>actual-err>   Permission denied.

Any idea why that might happen?

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-01 Thread Brad King
On 12/01/2014 03:26 PM, Stephen Kelly wrote:
> Existing uses of strtol also check errno. I guess your implementation should 
> too. 

Yes, IIUC it is a range check on whether the value can be represented.

> Then the existing users should use this new method.

In that case the type should be changed to 'long' instead of 'int',
and the current call site should be updated accordingly.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-01 Thread Stephen Kelly
Rolf Eike Beer wrote:

> Brad King wrote:
>> On 12/01/2014 11:05 AM, Rolf Eike Beer wrote:
>> > +  char *endp;
>> > +  *value = static_cast(strtol(str, &endp, 10));
>> > +  return (*endp == '\0') && (endp != str);
>> 
>> Fine with me.  Please extend the topic accordingly.  I will squash
>> it in later.
> 
> Done.

Existing uses of strtol also check errno. I guess your implementation should 
too. 

Then the existing users should use this new method.

Thanks,

Steve.

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-01 Thread Rolf Eike Beer
Brad King wrote:
> On 12/01/2014 11:05 AM, Rolf Eike Beer wrote:
> > +  char *endp;
> > +  *value = static_cast(strtol(str, &endp, 10));
> > +  return (*endp == '\0') && (endp != str);
> 
> Fine with me.  Please extend the topic accordingly.  I will squash
> it in later.

Done.

> Be sure to include .

Already the case.

Eike
-- 

signature.asc
Description: This is a digitally signed message part.
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-01 Thread Brad King
On 12/01/2014 11:05 AM, Rolf Eike Beer wrote:
> +  char *endp;
> +  *value = static_cast(strtol(str, &endp, 10));
> +  return (*endp == '\0') && (endp != str);

Fine with me.  Please extend the topic accordingly.  I will squash
it in later.  Be sure to include .

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-01 Thread Rolf Eike Beer
Brad King wrote:
> On 11/25/2014 06:24 PM, Ruslan Baratov wrote:
> > updated
> 
> Thanks.  I squashed the commits since the addition of the files
> cannot be tested independently, made minor tweaks, and merged
> to 'next' for testing:
> 
>  cmSystemTools: Add StringToInt helper
>  http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5121f118

Since I hate *scanf() with passion, how about this:

diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 4c08e07..9852dd6 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -2927,7 +2927,7 @@ std::vector cmSystemTools::tokenize(const 
std::string& str,
 //
 bool cmSystemTools::StringToInt(const char* str, int* value)
 {
-  char unused;
-  const int result = sscanf(str, "%d%c", value, &unused);
-  return (result == 1);
+  char *endp;
+  *value = static_cast(strtol(str, &endp, 10));
+  return (*endp == '\0') && (endp != str);
 }

Eike
-- 

signature.asc
Description: This is a digitally signed message part.
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-12-01 Thread Brad King
On 11/25/2014 06:24 PM, Ruslan Baratov wrote:
> updated

Thanks.  I squashed the commits since the addition of the files
cannot be tested independently, made minor tweaks, and merged
to 'next' for testing:

 cmSystemTools: Add StringToInt helper
 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5121f118

 file: Add LOCK subcommand to do file and directory locking
 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=fca624ca

 Help: Add notes for topic 'file-LOCK-command'
 http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=ed00a808

-Brad
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-25 Thread Ruslan Baratov via cmake-developers

On 25-Nov-14 21:29, Brad King wrote:

* The background.(bat|sh) files need to have quoting to work with
   spaces in the path.  Please try running tests with a source/build
   tree with spaces.

* Instead of background scripts, can you have a parent process take
   a lock, run a child with a timed out lock, and then release the
   lock?

Test updated, no need to use 'background.*' scripts indeed.

* The error messages currently use "SetError(...); return false;".
   That is why you need the ": " to get the prompt.  Instead you can
   use IssueMessage as shown in the hunk below for one example.

's,SetError,IssueMessage,g' done
I'm not quite sure about when do I need to use 'return false'/'return 
true', so I leave 'return false' everywhere.



* Please use shorter timeouts in the test if possible to make it run
   faster.  If they become spurious/problematic then we can lengthen
   them later.

* ... Then the timeout can be just 0.1s in the child and there
   is no race.

I've set timeout to 1 sec (minimal unsigned integer).

Ruslo.
>From 6b874aa940a86f9a789cfae23a8c47d609587d61 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Wed, 26 Nov 2014 01:45:26 +0300
Subject: [PATCH 1/7] Add function cmSystemTools::StringToInt

---
 Source/cmSystemTools.cxx | 7 +++
 Source/cmSystemTools.h   | 3 +++
 2 files changed, 10 insertions(+)

diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index baac7b8..e247481 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -2923,3 +2923,10 @@ std::vector cmSystemTools::tokenize(const 
std::string& str,
 }
   return tokens;
 }
+
+//
+bool cmSystemTools::StringToInt(const char* str, int* value) {
+  char unused;
+  const int result = sscanf(str, "%d%c", value, &unused);
+  return (result == 1);
+}
diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h
index 4455dd1..763389b 100644
--- a/Source/cmSystemTools.h
+++ b/Source/cmSystemTools.h
@@ -458,6 +458,9 @@ public:
   static std::vector tokenize(const std::string& str,
const std::string& sep);
 
+  /** Convert string to int. Expected that the whole string is an integer */
+  static bool StringToInt(const char* str, int* value);
+
 #ifdef _WIN32
   struct WindowsFileRetry
   {
-- 
2.1.1

>From 569bc681c0a980b87cd94184cfb83b44122d92a0 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Wed, 26 Nov 2014 01:46:14 +0300
Subject: [PATCH 2/7] Add class cmFileLockResult

---
 Source/cmFileLockResult.cxx | 111 
 Source/cmFileLockResult.h   |  85 +
 2 files changed, 196 insertions(+)
 create mode 100644 Source/cmFileLockResult.cxx
 create mode 100644 Source/cmFileLockResult.h

diff --git a/Source/cmFileLockResult.cxx b/Source/cmFileLockResult.cxx
new file mode 100644
index 000..045e7ee
--- /dev/null
+++ b/Source/cmFileLockResult.cxx
@@ -0,0 +1,111 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#include "cmFileLockResult.h"
+
+#include 
+
+cmFileLockResult cmFileLockResult::MakeOk()
+{
+  return cmFileLockResult(OK, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeSystem()
+{
+#if defined(_WIN32)
+  const Error lastError = GetLastError();
+#else
+  const Error lastError = errno;
+#endif
+  return cmFileLockResult(SYSTEM, lastError);
+}
+
+cmFileLockResult cmFileLockResult::MakeTimeout()
+{
+  return cmFileLockResult(TIMEOUT, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
+{
+  return cmFileLockResult(ALREADY_LOCKED, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeInternal()
+{
+  return cmFileLockResult(INTERNAL, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeNoFunction()
+{
+  return cmFileLockResult(NO_FUNCTION, 0);
+}
+
+bool cmFileLockResult::IsOk() const
+{
+  return this->Type == OK;
+}
+
+std::string cmFileLockResult::GetOutputMessage() const
+{
+  switch (this->Type)
+{
+case OK:
+  return "0";
+case SYSTEM:
+#if defined(_WIN32)
+  {
+  char* errorText = NULL;
+
+  // http://stackoverflow.com/a/455533/2288008
+  DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM |
+  FORMAT_MESSAGE_ALLOCATE_BUFFER |
+  FORMAT_MESSAGE_IGNORE_INSERTS;
+  ::FormatMessageA(
+  flags,
+  NULL,
+  this->ErrorValue,
+  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+  (LPSTR)&errorText,
+  0,
+  NUL

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-25 Thread Brad King
On 11/17/2014 06:45 PM, Ruslan Baratov wrote:
> Done

Thanks.  Here are some more comments:

* Please rebase on current 'master' to resolve conflicts.

* The background.(bat|sh) files need to have quoting to work with
  spaces in the path.  Please try running tests with a source/build
  tree with spaces.

* The error messages currently use "SetError(...); return false;".
  That is why you need the ": " to get the prompt.  Instead you can
  use IssueMessage as shown in the hunk below for one example.
  Indented lines in the message will be printed as preformatted
  blocks so you do not have to worry about variations in the line
  wrapping of expected test output.

* Please use shorter timeouts in the test if possible to make it run
  faster.  If they become spurious/problematic then we can lengthen
  them later.

* Instead of background scripts, can you have a parent process take
  a lock, run a child with a timed out lock, and then release the
  lock?  Then the timeout can be just 0.1s in the child and there
  is no race.

Thanks,
-Brad


diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index 8e63892..fb64b5a 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -3679,10 +3679,10 @@ bool cmFileCommand::HandleLockCommand(
   if (resultVariable.empty() && !fileLockResult.IsOk())
 {
 cmOStringStream e;
-e << ": error locking file \"" << path << "\" (" << result << ").";
-this->SetError(e.str());
+e << "error locking file\n " << path << "\n(" << result << ").";
+this->Makefile->IssueMessage(cmake::FATAL_ERROR, e.str());
 cmSystemTools::SetFatalErrorOccured();
-return false;
+return true;
 }

   if (!resultVariable.empty())

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-18 Thread Brad King
On 11/17/2014 6:45 PM, Ruslan Baratov wrote:
> Done

Thanks for the updates.  I'll try this out again when
I get a chance.

-Brad
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-17 Thread Ruslan Baratov via cmake-developers

On 17-Nov-14 18:06, Brad King wrote:

Yes, please change to that so a proper error can be produced for the new
API when "123xyz" is given as a timeout, for example.

Function added cmSystemTools::StringToInt


Please look at adding a case to the test suite for this.  An outer
process could take the lock and then execute_process a child that
tries to take the lock with a timeout.  Then check that it fails
as expected.

Done

Ruslo
>From 9a3e5728173d2b5e4381d3c65556534298f7bb27 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Tue, 18 Nov 2014 02:32:27 +0300
Subject: [PATCH 1/7] Add function cmSystemTools::StringToInt

---
 Source/cmSystemTools.cxx | 7 +++
 Source/cmSystemTools.h   | 3 +++
 2 files changed, 10 insertions(+)

diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 3247f7f..9664983 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -2925,3 +2925,10 @@ std::vector cmSystemTools::tokenize(const 
std::string& str,
 }
   return tokens;
 }
+
+//
+bool cmSystemTools::StringToInt(const char* str, int* value) {
+  char unused;
+  const int result = sscanf(str, "%d%c", value, &unused);
+  return (result == 1);
+}
diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h
index 4455dd1..763389b 100644
--- a/Source/cmSystemTools.h
+++ b/Source/cmSystemTools.h
@@ -458,6 +458,9 @@ public:
   static std::vector tokenize(const std::string& str,
const std::string& sep);
 
+  /** Convert string to int. Expected that the whole string is an integer */
+  static bool StringToInt(const char* str, int* value);
+
 #ifdef _WIN32
   struct WindowsFileRetry
   {
-- 
2.1.1

>From 9e7e463d51a8944c8951540114e0e34824a239f5 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Tue, 18 Nov 2014 02:33:46 +0300
Subject: [PATCH 2/7] Add class cmFileLockResult

---
 Source/cmFileLockResult.cxx | 111 
 Source/cmFileLockResult.h   |  85 +
 2 files changed, 196 insertions(+)
 create mode 100644 Source/cmFileLockResult.cxx
 create mode 100644 Source/cmFileLockResult.h

diff --git a/Source/cmFileLockResult.cxx b/Source/cmFileLockResult.cxx
new file mode 100644
index 000..045e7ee
--- /dev/null
+++ b/Source/cmFileLockResult.cxx
@@ -0,0 +1,111 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#include "cmFileLockResult.h"
+
+#include 
+
+cmFileLockResult cmFileLockResult::MakeOk()
+{
+  return cmFileLockResult(OK, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeSystem()
+{
+#if defined(_WIN32)
+  const Error lastError = GetLastError();
+#else
+  const Error lastError = errno;
+#endif
+  return cmFileLockResult(SYSTEM, lastError);
+}
+
+cmFileLockResult cmFileLockResult::MakeTimeout()
+{
+  return cmFileLockResult(TIMEOUT, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
+{
+  return cmFileLockResult(ALREADY_LOCKED, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeInternal()
+{
+  return cmFileLockResult(INTERNAL, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeNoFunction()
+{
+  return cmFileLockResult(NO_FUNCTION, 0);
+}
+
+bool cmFileLockResult::IsOk() const
+{
+  return this->Type == OK;
+}
+
+std::string cmFileLockResult::GetOutputMessage() const
+{
+  switch (this->Type)
+{
+case OK:
+  return "0";
+case SYSTEM:
+#if defined(_WIN32)
+  {
+  char* errorText = NULL;
+
+  // http://stackoverflow.com/a/455533/2288008
+  DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM |
+  FORMAT_MESSAGE_ALLOCATE_BUFFER |
+  FORMAT_MESSAGE_IGNORE_INSERTS;
+  ::FormatMessageA(
+  flags,
+  NULL,
+  this->ErrorValue,
+  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+  (LPSTR)&errorText,
+  0,
+  NULL
+  );
+
+  if (errorText != NULL)
+{
+const std::string message = errorText;
+::LocalFree(errorText);
+return message;
+}
+  else
+{
+return "Internal error (FormatMessageA failed)";
+}
+  }
+#else
+  return strerror(this->ErrorValue);
+#endif
+case TIMEOUT:
+  return "Timeout reached";
+case ALREADY_LOCKED:
+  return "File already locked";
+case NO_FUNCTION:
+  return "'GUARD FUNCTION' not used in function definition";
+case INTERNAL:
+default:
+  return "Internal error";
+}
+}
+
+cm

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-17 Thread Brad King
On 11/15/2014 03:34 AM, Rolf Eike Beer wrote:
> Ruslan Baratov wrote:
>> Done. Also I've found parse issue which is based on `sscanf` behaviour,
>> e.g. string '123xyz' will be successfully parsed as a integer (%d). Same
>> issue for example in file(STRINGS) command:
> 
> I use strtol()/strtoul() for this kind of this, which also has a less 
> worrisome interface.

Yes, please change to that so a proper error can be produced for the new
API when "123xyz" is given as a timeout, for example.

The file(STRINGS) command could be fixed with a separate change.  In
order to be compatible it should do something like "%u%c" and produce
a warning if %c matched anything.

On 11/14/2014 06:27 PM, Ruslan Baratov wrote:
> On linux you can test timeout by:
>  > cat script.cmake
> file(LOCK "${CMAKE_CURRENT_LIST_DIR}/file-to-lock" TIMEOUT 5)
> execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 10)
>  > cmake -P script.cmake & # start one instance in background
>  > cmake -P script.cmake # start second instance, expected lock failed
> by timeout
> CMake Error at script.cmake:1 (file):
>file : error locking file
>"/.../file-to-lock" (Timeout
>reached).

Please look at adding a case to the test suite for this.  An outer
process could take the lock and then execute_process a child that
tries to take the lock with a timeout.  Then check that it fails
as expected.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-15 Thread Rolf Eike Beer
Am Samstag, 15. November 2014, 02:27:40 schrieb Ruslan Baratov via cmake-
developers:
> On 14-Nov-14 22:58, Brad King wrote:
> > - Please add more test cases covering all the file(LOCK)
> > 
> >argument processing error messages.
> 
> Done. Also I've found parse issue which is based on `sscanf` behaviour,
> e.g. string '123xyz' will be successfully parsed as a integer (%d). Same
> issue for example in file(STRINGS) command:

I use strtol()/strtoul() for this kind of this, which also has a less 
worrisome interface.

Eike
-- 

signature.asc
Description: This is a digitally signed message part.
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-14 Thread Ruslan Baratov via cmake-developers

On 14-Nov-14 22:58, Brad King wrote:

- Please add more test cases covering all the file(LOCK)
   argument processing error messages.
Done. Also I've found parse issue which is based on `sscanf` behaviour, 
e.g. string '123xyz' will be successfully parsed as a integer (%d). Same 
issue for example in file(STRINGS) command:


> cat script.cmake
set(tmp "${CMAKE_CURRENT_LIST_DIR}/temp-file")
file(WRITE "${tmp}" "qwertyuiopasdfghjklzxcvbnm")
file(STRINGS "${tmp}" result LIMIT_INPUT 7)
message("result(1): ${result}")
file(STRINGS "${tmp}" result LIMIT_INPUT 7abc) # expected error message
message("result(2): ${result}")
> cmake -P script.cmake
result(1): qwertyu
result(2): qwertyu



- Please squash in the attached patch to your commit that
   adds the file(LOCK) command to CMake.  We should not need
   to build it during bootstrap.

- Instead of ::sleep you can use cmSystemTools::Delay()

Done


- We need to test whether failing to lock after a timeout
   actually works.  I tried adding a line to
   Tests/RunCMake/file/LOCK.cmake:

file(LOCK "${lfile}" TIMEOUT 3)

   at the end of the file, duplicating the one before it.
   I expected to see a 3 second delay followed by a lock
   failure.  Instead it fails immediately.  Is that expected?
Yes, since we know that we already own the lock nothing will change 
after timeout - it still be locked by us.


On linux you can test timeout by:
> cat script.cmake
file(LOCK "${CMAKE_CURRENT_LIST_DIR}/file-to-lock" TIMEOUT 5)
execute_process(COMMAND "${CMAKE_COMMAND}" -E sleep 10)
> cmake -P script.cmake & # start one instance in background
> cmake -P script.cmake # start second instance, expected lock failed 
by timeout

CMake Error at script.cmake:1 (file):
  file : error locking file
  "/.../file-to-lock" (Timeout
  reached).

Ruslo
>From aa6418cd5a9bad2dfa26aae657d354d02cc39d20 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Sat, 15 Nov 2014 02:10:45 +0300
Subject: [PATCH 1/6] Add class cmFileLockResult

---
 Source/cmFileLockResult.cxx | 111 
 Source/cmFileLockResult.h   |  85 +
 2 files changed, 196 insertions(+)
 create mode 100644 Source/cmFileLockResult.cxx
 create mode 100644 Source/cmFileLockResult.h

diff --git a/Source/cmFileLockResult.cxx b/Source/cmFileLockResult.cxx
new file mode 100644
index 000..045e7ee
--- /dev/null
+++ b/Source/cmFileLockResult.cxx
@@ -0,0 +1,111 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#include "cmFileLockResult.h"
+
+#include 
+
+cmFileLockResult cmFileLockResult::MakeOk()
+{
+  return cmFileLockResult(OK, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeSystem()
+{
+#if defined(_WIN32)
+  const Error lastError = GetLastError();
+#else
+  const Error lastError = errno;
+#endif
+  return cmFileLockResult(SYSTEM, lastError);
+}
+
+cmFileLockResult cmFileLockResult::MakeTimeout()
+{
+  return cmFileLockResult(TIMEOUT, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
+{
+  return cmFileLockResult(ALREADY_LOCKED, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeInternal()
+{
+  return cmFileLockResult(INTERNAL, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeNoFunction()
+{
+  return cmFileLockResult(NO_FUNCTION, 0);
+}
+
+bool cmFileLockResult::IsOk() const
+{
+  return this->Type == OK;
+}
+
+std::string cmFileLockResult::GetOutputMessage() const
+{
+  switch (this->Type)
+{
+case OK:
+  return "0";
+case SYSTEM:
+#if defined(_WIN32)
+  {
+  char* errorText = NULL;
+
+  // http://stackoverflow.com/a/455533/2288008
+  DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM |
+  FORMAT_MESSAGE_ALLOCATE_BUFFER |
+  FORMAT_MESSAGE_IGNORE_INSERTS;
+  ::FormatMessageA(
+  flags,
+  NULL,
+  this->ErrorValue,
+  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+  (LPSTR)&errorText,
+  0,
+  NULL
+  );
+
+  if (errorText != NULL)
+{
+const std::string message = errorText;
+::LocalFree(errorText);
+return message;
+}
+  else
+{
+return "Internal error (FormatMessageA failed)";
+}
+  }
+#else
+  return strerror(this->ErrorValue);
+#endif
+case TIMEOUT:
+  return "Timeout reached";
+case ALREADY_LOCKED:
+  return "File already locked";
+case NO_FUNCTION:
+  return "'GUARD FUNCTION' not used in function definition";
+case INTERNAL:
+default:
+

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-14 Thread Brad King
On 11/14/2014 12:31 PM, Ruslan Baratov wrote:
> ConvertToWindowsExtendedPath fix + tests

Thanks.  I started testing on Linux so far.  A few more comments:

- Please add more test cases covering all the file(LOCK)
  argument processing error messages.

- Please squash in the attached patch to your commit that
  adds the file(LOCK) command to CMake.  We should not need
  to build it during bootstrap.

- Instead of ::sleep you can use cmSystemTools::Delay()

- We need to test whether failing to lock after a timeout
  actually works.  I tried adding a line to
  Tests/RunCMake/file/LOCK.cmake:

   file(LOCK "${lfile}" TIMEOUT 3)

  at the end of the file, duplicating the one before it.
  I expected to see a 3 second delay followed by a lock
  failure.  Instead it fails immediately.  Is that expected?

Thanks,
-Brad

>From 36c0d3450f3968c2f3a3ee8912c6b9a12978906e Mon Sep 17 00:00:00 2001
Message-Id: <36c0d3450f3968c2f3a3ee8912c6b9a12978906e.1415994879.git.brad.k...@kitware.com>
From: Brad King 
Date: Fri, 14 Nov 2014 14:39:46 -0500
Subject: [PATCH] file(LOCK): Drop this API during CMake bootstrap build

CMake's own build system won't need this.
---
 Source/cmFileCommand.cxx| 9 +++--
 Source/cmGlobalGenerator.h  | 6 +-
 Source/cmLocalGenerator.cxx | 4 
 Source/cmMakefile.cxx   | 4 
 bootstrap   | 3 ---
 5 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index 7d5d4c7..e060bbd 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -21,9 +21,8 @@
 
 #if defined(CMAKE_BUILD_WITH_CMAKE)
 #include "cm_curl.h"
-#endif
-
 #include "cmFileLockResult.h"
+#endif
 
 #undef GetCurrentDirectory
 #include 
@@ -3511,6 +3510,7 @@ bool cmFileCommand::HandleGenerateCommand(
 bool cmFileCommand::HandleLockCommand(
   std::vector const& args)
 {
+#if defined(CMAKE_BUILD_WITH_CMAKE)
   // Default values
   bool directory = false;
   bool release = false;
@@ -3691,6 +3691,11 @@ bool cmFileCommand::HandleLockCommand(
 }
 
   return true;
+#else
+  static_cast(args);
+  this->SetError("sub-command LOCK not implemented in boostrap cmake");
+  return false;
+#endif
 }
 
 //
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 0f79174..0847654 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -21,9 +21,9 @@
 #include "cmExportSetMap.h" // For cmExportSetMap
 #include "cmGeneratorTarget.h"
 #include "cmGeneratorExpression.h"
-#include "cmFileLockPool.h"
 
 #if defined(CMAKE_BUILD_WITH_CMAKE)
+# include "cmFileLockPool.h"
 # include 
 #endif
 
@@ -349,7 +349,9 @@ public:
   std::set const&
   GetFilenameTargetDepends(cmSourceFile* sf) const;
 
+#if defined(CMAKE_BUILD_WITH_CMAKE)
   cmFileLockPool& GetFileLockPool() { return FileLockPool; }
+#endif
 
 protected:
   virtual void Generate();
@@ -502,8 +504,10 @@ private:
   mutable std::map >
   FilenameTargetDepends;
 
+#if defined(CMAKE_BUILD_WITH_CMAKE)
   // Pool of file locks
   cmFileLockPool FileLockPool;
+#endif
 };
 
 #endif
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index 6b5d785..2de6c93 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -79,11 +79,15 @@ public:
 this->GG = lg->GetGlobalGenerator();
 this->LG = this->GG->GetCurrentLocalGenerator();
 this->GG->SetCurrentLocalGenerator(lg);
+#if defined(CMAKE_BUILD_WITH_CMAKE)
 this->GG->GetFileLockPool().PushFileScope();
+#endif
 }
   ~cmLocalGeneratorCurrent()
 {
+#if defined(CMAKE_BUILD_WITH_CMAKE)
 this->GG->GetFileLockPool().PopFileScope();
+#endif
 this->GG->SetCurrentLocalGenerator(this->LG);
 }
 };
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index a94c752..5484421 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -4426,8 +4426,10 @@ void cmMakefile::PushScope()
   this->Internal->VarStack.push(cmDefinitions(parent));
   this->Internal->VarInitStack.push(init);
   this->Internal->VarUsageStack.push(usage);
+#if defined(CMAKE_BUILD_WITH_CMAKE)
   this->GetLocalGenerator()->GetGlobalGenerator()->
 GetFileLockPool().PushFunctionScope();
+#endif
 }
 
 void cmMakefile::PopScope()
@@ -4465,8 +4467,10 @@ void cmMakefile::PopScope()
 {
 this->Internal->VarUsageStack.top().insert(*it);
 }
+#if defined(CMAKE_BUILD_WITH_CMAKE)
   this->GetLocalGenerator()->GetGlobalGenerator()->
 GetFileLockPool().PopFunctionScope();
+#endif
 }
 
 void cmMakefile::RaiseScope(const std::string& var, const char *varDef)
diff --git a/bootstrap b/bootstrap
index 19189d3..94bed0e 100755
--- a/bootstrap
+++ b/bootstrap
@@ -286,9 +286,6 @@ CMAKE_CXX_SOURCES="\
   cmSystemTools \
   cmTestGenerator \
   cmVersion \
-  cmFileLock \
-  cmFileLockPool \
-  cmFileLockResult \
   cmFileTimeComparison \
   cmGlobalUnixMakefileGenerator3 \
   cmLocalUnixMakefileGenerator3 \
-- 
2.1.1

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-14 Thread Ruslan Baratov via cmake-developers

ConvertToWindowsExtendedPath fix + tests

>From e994378d61e64136043d9db614762e79927766cb Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Fri, 14 Nov 2014 21:09:35 +0400
Subject: [PATCH 1/6] Add class cmFileLockResult

---
 Source/cmFileLockResult.cxx | 111 
 Source/cmFileLockResult.h   |  85 +
 2 files changed, 196 insertions(+)
 create mode 100644 Source/cmFileLockResult.cxx
 create mode 100644 Source/cmFileLockResult.h

diff --git a/Source/cmFileLockResult.cxx b/Source/cmFileLockResult.cxx
new file mode 100644
index 000..045e7ee
--- /dev/null
+++ b/Source/cmFileLockResult.cxx
@@ -0,0 +1,111 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#include "cmFileLockResult.h"
+
+#include 
+
+cmFileLockResult cmFileLockResult::MakeOk()
+{
+  return cmFileLockResult(OK, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeSystem()
+{
+#if defined(_WIN32)
+  const Error lastError = GetLastError();
+#else
+  const Error lastError = errno;
+#endif
+  return cmFileLockResult(SYSTEM, lastError);
+}
+
+cmFileLockResult cmFileLockResult::MakeTimeout()
+{
+  return cmFileLockResult(TIMEOUT, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
+{
+  return cmFileLockResult(ALREADY_LOCKED, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeInternal()
+{
+  return cmFileLockResult(INTERNAL, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeNoFunction()
+{
+  return cmFileLockResult(NO_FUNCTION, 0);
+}
+
+bool cmFileLockResult::IsOk() const
+{
+  return this->Type == OK;
+}
+
+std::string cmFileLockResult::GetOutputMessage() const
+{
+  switch (this->Type)
+{
+case OK:
+  return "0";
+case SYSTEM:
+#if defined(_WIN32)
+  {
+  char* errorText = NULL;
+
+  // http://stackoverflow.com/a/455533/2288008
+  DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM |
+  FORMAT_MESSAGE_ALLOCATE_BUFFER |
+  FORMAT_MESSAGE_IGNORE_INSERTS;
+  ::FormatMessageA(
+  flags,
+  NULL,
+  this->ErrorValue,
+  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+  (LPSTR)&errorText,
+  0,
+  NULL
+  );
+
+  if (errorText != NULL)
+{
+const std::string message = errorText;
+::LocalFree(errorText);
+return message;
+}
+  else
+{
+return "Internal error (FormatMessageA failed)";
+}
+  }
+#else
+  return strerror(this->ErrorValue);
+#endif
+case TIMEOUT:
+  return "Timeout reached";
+case ALREADY_LOCKED:
+  return "File already locked";
+case NO_FUNCTION:
+  return "'GUARD FUNCTION' not used in function definition";
+case INTERNAL:
+default:
+  return "Internal error";
+}
+}
+
+cmFileLockResult::cmFileLockResult(ErrorType typeValue, Error errorValue):
+Type(typeValue), ErrorValue(errorValue)
+{
+}
diff --git a/Source/cmFileLockResult.h b/Source/cmFileLockResult.h
new file mode 100644
index 000..531fb49
--- /dev/null
+++ b/Source/cmFileLockResult.h
@@ -0,0 +1,85 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#ifndef cmFileLockResult_h
+#define cmFileLockResult_h
+
+#include "cmStandardIncludes.h"
+
+#if defined(_WIN32)
+# include  // DWORD
+#endif
+
+/**
+  * @brief Result of the locking/unlocking file.
+  * @note See @c cmFileLock
+  */
+class cmFileLockResult
+{
+ public:
+#if defined(_WIN32)
+  typedef DWORD Error;
+#else
+  typedef int Error;
+#endif
+
+  /**
+* @brief Successful lock/unlock.
+*/
+  static cmFileLockResult MakeOk();
+
+  /**
+* @brief Lock/Unlock failed. Read error/GetLastError.
+*/
+  static cmFileLockResult MakeSystem();
+
+  /**
+* @brief Lock/Unlock failed. Timeout reached.
+*/
+  static cmFileLockResult MakeTimeout();
+
+  /**
+* @brief File already locked.
+*/
+  static cmFileLockResult MakeAlreadyLocked();
+
+  /**
+* @brief Internal error.
+*/
+  static cmFileLockResult MakeInternal();
+

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-13 Thread Brad King
On 11/13/2014 09:01 AM, Ruslan Baratov wrote:
>> * Please add documentation to Help/command/file.rst and anywhere else
>>that is appropriate.
> Done

Thanks.  I will try out the patch when I get a chance to provide further
feedback.

> Is it possible to run tests only from 'Tests/RunCMake/file' directory?

ctest -R RunCMake.file -V

> By the way I got the following error (Visual Studio 2013) if I include 
> 'cmFileLockResult.h' before 'cm_curl.h' in file 'cmFileCommand.cxx':
> Compiles fine if 'cmFileLockResult.h' placed after 'cm_curl.h'.

Okay.

One comment from a quick scroll through the patches:

- Use ConvertToWindowsExtendedPath for passing file paths to windows
  APIs.  That will allow use of longer path names.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-13 Thread Ruslan Baratov via cmake-developers

On 11-Nov-14 21:28, Brad King wrote:

* All headers and sources need to include cmStandardIncludes.h first,
   directly or indirectly through other headers.  It can affect the
   way certain standard library headers are preprocessed on some
   platforms, and needs to be consistent across all translation units.

* Please add the .cxx files to 'bootstrap' and Source/CMakeLists.txt
   rather than including them in cmBootstrapCommands*.cxx.

* The windows header should be included in lower case .

* The cerrno and cstdio headers need to be just errno.h and stdio.h
   to work on some of the older compilers.

* Please add documentation to Help/command/file.rst and anywhere else
   that is appropriate.

Done


* Please add test cases for all APIs and error cases, probably in
   Tests/RunCMake/file using the RunCMake infrastructure.
I added test LOCK.cmake but not quite understand how to execute it. Is 
it possible to run tests only from 'Tests/RunCMake/file' directory?


By the way I got the following error (Visual Studio 2013) if I include 
'cmFileLockResult.h' before 'cm_curl.h' in file 'cmFileCommand.cxx':


C:\Program Files (x86)\Windows Kits\8.1\Include\shared\ws2ipdef.h(202): 
error C2079: '_SOCKADDR_INET::Ipv4' uses undefined struct 'sockaddr_in'
C:\Program Files (x86)\Windows Kits\8.1\Include\shared\ws2ipdef.h(715): 
error C2011: 'ip_mreq' : 'struct' type redefinition
  C:\Program Files (x86)\Windows 
Kits\8.1\Include\um\winsock.h(355) : see declaration of 'ip_mreq'
C:\Program Files (x86)\Windows Kits\8.1\Include\um\ws2tcpip.h(696): 
error C3861: 'WSASetLastError': identifier not found
C:\Program Files (x86)\Windows Kits\8.1\Include\um\ws2tcpip.h(703): 
error C3861: 'WSASetLastError': identifier not found
C:\Program Files (x86)\Windows Kits\8.1\Include\um\ws2tcpip.h(742): 
error C3861: 'WSASetLastError': identifier not found
C:\Program Files (x86)\Windows Kits\8.1\Include\um\ws2tcpip.h(749): 
error C3861: 'WSASetLastError': identifier not found
C:\Program Files (x86)\Windows Kits\8.1\Include\um\ws2tcpip.h(793): 
error C3861: 'WSASetLastError': identifier not found
C:\Program Files (x86)\Windows Kits\8.1\Include\um\ws2tcpip.h(800): 
error C3861: 'WSASetLastError': identifier not found
C:\Program Files (x86)\Windows Kits\8.1\Include\um\ws2tcpip.h(841): 
error C3861: 'WSASetLastError': identifier not found
C:\Program Files (x86)\Windows Kits\8.1\Include\um\ws2tcpip.h(848): 
error C3861: 'WSASetLastError': identifier not found
...\cmake\Utilities\cmcurl/include/curl/curl.h(337): error C2079: 
'curl_sockaddr::addr' uses undefined struct 'sockaddr'


Compiles fine if 'cmFileLockResult.h' placed after 'cm_curl.h'.

Ruslo
>From 55514802c135595e658f1897c123c0daf291ae81 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Thu, 13 Nov 2014 17:35:36 +0400
Subject: [PATCH 1/5] Add class cmFileLockResult

---
 Source/cmFileLockResult.cxx | 111 
 Source/cmFileLockResult.h   |  85 +
 2 files changed, 196 insertions(+)
 create mode 100644 Source/cmFileLockResult.cxx
 create mode 100644 Source/cmFileLockResult.h

diff --git a/Source/cmFileLockResult.cxx b/Source/cmFileLockResult.cxx
new file mode 100644
index 000..045e7ee
--- /dev/null
+++ b/Source/cmFileLockResult.cxx
@@ -0,0 +1,111 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#include "cmFileLockResult.h"
+
+#include 
+
+cmFileLockResult cmFileLockResult::MakeOk()
+{
+  return cmFileLockResult(OK, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeSystem()
+{
+#if defined(_WIN32)
+  const Error lastError = GetLastError();
+#else
+  const Error lastError = errno;
+#endif
+  return cmFileLockResult(SYSTEM, lastError);
+}
+
+cmFileLockResult cmFileLockResult::MakeTimeout()
+{
+  return cmFileLockResult(TIMEOUT, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
+{
+  return cmFileLockResult(ALREADY_LOCKED, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeInternal()
+{
+  return cmFileLockResult(INTERNAL, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeNoFunction()
+{
+  return cmFileLockResult(NO_FUNCTION, 0);
+}
+
+bool cmFileLockResult::IsOk() const
+{
+  return this->Type == OK;
+}
+
+std::string cmFileLockResult::GetOutputMessage() const
+{
+  switch (this->Type)
+{
+case OK:
+  return "0";
+case SYSTEM:
+#if defined(_WIN32)
+  {
+  char* errorText = NULL;
+
+  // http://stackoverflow.com/a/455533/2288008
+  DWORD flags = FORMAT_MESSAGE_F

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-11 Thread Brad King
On 11/10/2014 04:49 PM, Ruslan Baratov wrote:
> On 31-Oct-14 16:39, Brad King wrote:
>> Please work on the patches.  You can use "git format-patch" to format
>> them and post here either inline or as attachments.
>>
> Done

Thanks for working on it.  Good start.  Here are some comments so far:

* All headers and sources need to include cmStandardIncludes.h first,
  directly or indirectly through other headers.  It can affect the
  way certain standard library headers are preprocessed on some
  platforms, and needs to be consistent across all translation units.

* Please add the .cxx files to 'bootstrap' and Source/CMakeLists.txt
  rather than including them in cmBootstrapCommands*.cxx.

* The windows header should be included in lower case .

* The cerrno and cstdio headers need to be just errno.h and stdio.h
  to work on some of the older compilers.

* Please add documentation to Help/command/file.rst and anywhere else
  that is appropriate.

* Please add test cases for all APIs and error cases, probably in
  Tests/RunCMake/file using the RunCMake infrastructure.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-10 Thread Ruslan Baratov via cmake-developers

Done

On 31-Oct-14 16:39, Brad King wrote:

On 10/31/2014 09:07 AM, Ruslan Baratov wrote:

Does anybody ready to implement it or you want me to send the patches?

Please work on the patches.  You can use "git format-patch" to format
them and post here either inline or as attachments.

Thanks,
-Brad



>From b235db704545bee59952c491c14a7eb4a5bdcde6 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Fri, 7 Nov 2014 17:22:48 +0400
Subject: [PATCH 1/4] Add class cmFileLockResult

---
 Source/cmFileLockResult.cxx | 102 
 Source/cmFileLockResult.h   |  77 +
 2 files changed, 179 insertions(+)
 create mode 100644 Source/cmFileLockResult.cxx
 create mode 100644 Source/cmFileLockResult.h

diff --git a/Source/cmFileLockResult.cxx b/Source/cmFileLockResult.cxx
new file mode 100644
index 000..d6cb16e
--- /dev/null
+++ b/Source/cmFileLockResult.cxx
@@ -0,0 +1,102 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#include "cmFileLockResult.h"
+
+cmFileLockResult cmFileLockResult::MakeOk()
+{
+  return cmFileLockResult(OK, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeSystem()
+{
+#if defined(_WIN32)
+  const Error lastError = GetLastError();
+#else
+  const Error lastError = errno;
+#endif
+  return cmFileLockResult(SYSTEM, lastError);
+}
+
+cmFileLockResult cmFileLockResult::MakeTimeout()
+{
+  return cmFileLockResult(TIMEOUT, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
+{
+  return cmFileLockResult(ALREADY_LOCKED, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeInternal()
+{
+  return cmFileLockResult(INTERNAL, 0);
+}
+
+bool cmFileLockResult::IsOk() const
+{
+  return this->Type == OK;
+}
+
+std::string cmFileLockResult::GetOutputMessage() const
+{
+  switch (this->Type)
+{
+case OK:
+  return "0";
+case SYSTEM:
+#if defined(_WIN32)
+  {
+  char* errorText = NULL;
+
+  // http://stackoverflow.com/a/455533/2288008
+  DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM |
+  FORMAT_MESSAGE_ALLOCATE_BUFFER |
+  FORMAT_MESSAGE_IGNORE_INSERTS;
+  ::FormatMessageA(
+  flags,
+  NULL,
+  this->ErrorValue,
+  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+  (LPSTR)&errorText,
+  0,
+  NULL
+  );
+
+  if (errorText != NULL)
+{
+const std::string message = errorText;
+::LocalFree(errorText);
+return message;
+}
+  else
+{
+return "Internal error (FormatMessageA failed)";
+}
+  }
+#else
+  return strerror(this->ErrorValue);
+#endif
+case TIMEOUT:
+  return "Timeout reached";
+case ALREADY_LOCKED:
+  return "File already locked";
+case INTERNAL:
+default:
+  return "Internal error";
+}
+}
+
+cmFileLockResult::cmFileLockResult(ErrorType typeValue, Error errorValue):
+Type(typeValue), ErrorValue(errorValue)
+{
+}
diff --git a/Source/cmFileLockResult.h b/Source/cmFileLockResult.h
new file mode 100644
index 000..4d8f794
--- /dev/null
+++ b/Source/cmFileLockResult.h
@@ -0,0 +1,77 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#ifndef cmFileLockResult_h
+#define cmFileLockResult_h
+
+#if defined(_WIN32)
+# include  // DWORD
+#endif
+
+/**
+  * @brief Result of the locking/unlocking file.
+  * @note See @c cmFileLock
+  */
+class cmFileLockResult
+{
+ public:
+#if defined(_WIN32)
+  typedef DWORD Error;
+#else
+  typedef int Error;
+#endif
+
+  /**
+* @brief Successful lock/unlock.
+*/
+  static cmFileLockResult MakeOk();
+
+  /**
+* @brief Lock/Unlock failed. Read error/GetLastError.
+*/
+  static cmFileLockResult MakeSystem();
+
+  /**
+* @brief Lock/Unlock failed. Timeout reached.
+*/
+  static cmFileLockResult MakeTimeout();
+
+  /**
+* @brief File already locked.
+*/
+  static cmFileLockResult MakeAlreadyLocked();
+
+  /**
+* @brief Internal error.
+*/
+  static cmFileLockResult 

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-11-10 Thread Ruslan Baratov via cmake-developers

Done

On 31-Oct-14 16:39, Brad King wrote:

On 10/31/2014 09:07 AM, Ruslan Baratov wrote:

Does anybody ready to implement it or you want me to send the patches?

Please work on the patches.  You can use "git format-patch" to format
them and post here either inline or as attachments.

Thanks,
-Brad



>From b235db704545bee59952c491c14a7eb4a5bdcde6 Mon Sep 17 00:00:00 2001
From: Ruslan Baratov 
Date: Fri, 7 Nov 2014 17:22:48 +0400
Subject: [PATCH 1/4] Add class cmFileLockResult

---
 Source/cmFileLockResult.cxx | 102 
 Source/cmFileLockResult.h   |  77 +
 2 files changed, 179 insertions(+)
 create mode 100644 Source/cmFileLockResult.cxx
 create mode 100644 Source/cmFileLockResult.h

diff --git a/Source/cmFileLockResult.cxx b/Source/cmFileLockResult.cxx
new file mode 100644
index 000..d6cb16e
--- /dev/null
+++ b/Source/cmFileLockResult.cxx
@@ -0,0 +1,102 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#include "cmFileLockResult.h"
+
+cmFileLockResult cmFileLockResult::MakeOk()
+{
+  return cmFileLockResult(OK, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeSystem()
+{
+#if defined(_WIN32)
+  const Error lastError = GetLastError();
+#else
+  const Error lastError = errno;
+#endif
+  return cmFileLockResult(SYSTEM, lastError);
+}
+
+cmFileLockResult cmFileLockResult::MakeTimeout()
+{
+  return cmFileLockResult(TIMEOUT, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeAlreadyLocked()
+{
+  return cmFileLockResult(ALREADY_LOCKED, 0);
+}
+
+cmFileLockResult cmFileLockResult::MakeInternal()
+{
+  return cmFileLockResult(INTERNAL, 0);
+}
+
+bool cmFileLockResult::IsOk() const
+{
+  return this->Type == OK;
+}
+
+std::string cmFileLockResult::GetOutputMessage() const
+{
+  switch (this->Type)
+{
+case OK:
+  return "0";
+case SYSTEM:
+#if defined(_WIN32)
+  {
+  char* errorText = NULL;
+
+  // http://stackoverflow.com/a/455533/2288008
+  DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM |
+  FORMAT_MESSAGE_ALLOCATE_BUFFER |
+  FORMAT_MESSAGE_IGNORE_INSERTS;
+  ::FormatMessageA(
+  flags,
+  NULL,
+  this->ErrorValue,
+  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+  (LPSTR)&errorText,
+  0,
+  NULL
+  );
+
+  if (errorText != NULL)
+{
+const std::string message = errorText;
+::LocalFree(errorText);
+return message;
+}
+  else
+{
+return "Internal error (FormatMessageA failed)";
+}
+  }
+#else
+  return strerror(this->ErrorValue);
+#endif
+case TIMEOUT:
+  return "Timeout reached";
+case ALREADY_LOCKED:
+  return "File already locked";
+case INTERNAL:
+default:
+  return "Internal error";
+}
+}
+
+cmFileLockResult::cmFileLockResult(ErrorType typeValue, Error errorValue):
+Type(typeValue), ErrorValue(errorValue)
+{
+}
diff --git a/Source/cmFileLockResult.h b/Source/cmFileLockResult.h
new file mode 100644
index 000..4d8f794
--- /dev/null
+++ b/Source/cmFileLockResult.h
@@ -0,0 +1,77 @@
+/*
+  CMake - Cross Platform Makefile Generator
+  Copyright 2014 Ruslan Baratov
+
+  Distributed under the OSI-approved BSD License (the "License");
+  see accompanying file Copyright.txt for details.
+
+  This software is distributed WITHOUT ANY WARRANTY; without even the
+  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+  See the License for more information.
+*/
+
+#ifndef cmFileLockResult_h
+#define cmFileLockResult_h
+
+#if defined(_WIN32)
+# include  // DWORD
+#endif
+
+/**
+  * @brief Result of the locking/unlocking file.
+  * @note See @c cmFileLock
+  */
+class cmFileLockResult
+{
+ public:
+#if defined(_WIN32)
+  typedef DWORD Error;
+#else
+  typedef int Error;
+#endif
+
+  /**
+* @brief Successful lock/unlock.
+*/
+  static cmFileLockResult MakeOk();
+
+  /**
+* @brief Lock/Unlock failed. Read error/GetLastError.
+*/
+  static cmFileLockResult MakeSystem();
+
+  /**
+* @brief Lock/Unlock failed. Timeout reached.
+*/
+  static cmFileLockResult MakeTimeout();
+
+  /**
+* @brief File already locked.
+*/
+  static cmFileLockResult MakeAlreadyLocked();
+
+  /**
+* @brief Internal error.
+*/
+  static cmFileLockResult 

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-31 Thread Brad King
On 10/31/2014 09:07 AM, Ruslan Baratov wrote:
> Does anybody ready to implement it or you want me to send the patches?

Please work on the patches.  You can use "git format-patch" to format
them and post here either inline or as attachments.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-31 Thread Ruslan Baratov via cmake-developers

Does anybody ready to implement it or you want me to send the patches?

Ruslo

On 29-Oct-14 16:48, Brad King wrote:

On 10/28/2014 04:28 PM, Ruslan Baratov wrote:

What do you think about this:

Thanks for drafting the signature.


file(
  LOCK 
  [DIRECTORY] # if present locked file will be /cmake.lock
(instead of )
  [RELEASE] # do explicit unlock
  [GUARD ] # if not present - set to `GUARD
PROCESS` (not used if RELEASE)
  [RESULT_VARIABLE ] # 0 on success, error message
otherwise; if not present - any error is FATAL_ERROR
  [TIMEOUT ]
  # 0 - return immediately if operation failed (try_lock),
otherwise timeout (timed_lock);
  # if not present - lock until success (or error);
  # not used if RELEASE;
)

That looks good.  The TIMEOUT unit can be 'seconds' but it should
accept a floating point value to get shorter times if possible.


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.

Great!


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.

Thanks for testing.  The windows/cygwin mixing limitation is acceptable
IMO.

Thanks,
-Brad



--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-29 Thread Brad King
On 10/28/2014 04:28 PM, Ruslan Baratov wrote:
> What do you think about this:

Thanks for drafting the signature.

> file(
>  LOCK 
>  [DIRECTORY] # if present locked file will be /cmake.lock 
> (instead of )
>  [RELEASE] # do explicit unlock
>  [GUARD ] # if not present - set to `GUARD 
> PROCESS` (not used if RELEASE)
>  [RESULT_VARIABLE ] # 0 on success, error message 
> otherwise; if not present - any error is FATAL_ERROR
>  [TIMEOUT ]
>  # 0 - return immediately if operation failed (try_lock), 
> otherwise timeout (timed_lock);
>  # if not present - lock until success (or error);
>  # not used if RELEASE;
> )

That looks good.  The TIMEOUT unit can be 'seconds' but it should
accept a floating point value to get shorter times if possible.

> 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.

Great!

> 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.

Thanks for testing.  The windows/cygwin mixing limitation is acceptable
IMO.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-28 Thread Ruslan Baratov via cmake-developers

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 
[DIRECTORY] # if present locked file will be /cmake.lock 
(instead of )

[RELEASE] # do explicit unlock
[GUARD ] # if not present - set to `GUARD 
PROCESS` (not used if RELEASE)
[RESULT_VARIABLE ] # 0 on success, error message 
otherwise; if not present - any error is FATAL_ERROR

[TIMEOUT ]
# 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 ` probably you will have a problem.


--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-13 Thread Brad King
On 10/13/2014 10:34 AM, Ben Boeckel wrote:
> Maybe we need something like the 'trap' shell builtin which runs code on
> various triggers

That would first require an 'eval' equivalent in CMake, e.g. "cmake_eval()".
This has been requested a few times.

-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-13 Thread Brad King
On 10/10/2014 07:45 AM, Ruslan Baratov wrote:
>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)

The LOCK signature should have a timeout after which it returns failure
instead of blocking forever.  One can just use a timeout of 0 to get
TRY_LOCK behavior without a separate signature for it.  Or, by leaving
out the timeout, one can ask to block forever waiting for the lock.

>file(LOCK_GUARD ...) # lock for scope of current function or until exit

I think the GUARD part can be an option to file(LOCK).  We may need more
than one to determine the scope, e.g.

  file(LOCK GUARD_FUNCTION ...)
  file(LOCK GUARD_PROCESS ...)

>file(UNLOCK ...) # explicit unlock of LOCK/LOCK_GUARD

Perhaps

  file(LOCK RELEASE ...) # unlock now
  file(LOCK UNGUARD ...) # drop guard

> Locking directory is equivalent to locking file `cmake.lock` in 
> directory "/path/to/shared/directory/":

I think this can be activated buy a DIRECTORY option.

> If any of this commands failed (e.g. have no permissions) - exit with 
> unsuccessful code (i.e. FATAL_ERROR) ?

The commands should all have an optional result argument so callers can
find out what happened.  If it is not provided, then failure can result
in a FATAL_ERROR.

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.

Also, please post a summary of how the implementation will work on each
platform.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-13 Thread Ben Boeckel
On Fri, Oct 10, 2014 at 17:59:07 +0400, Ruslan Baratov via cmake-developers 
wrote:
> > Behavior when there's a lock that still exists (by bug/mistake) after
> > CMake is done running is going to be strange and possibly
> > hard-to-diagnose / hard-to-understand.
> That's *exactly* the problem I have and why I start this discussion. 
> Currently I'm using mkdir command which return 0 only if directory 
> created by current process (just to clarify, not the cmake -E 
> make_directory). This works fine for me (tested on windows (mingw, 
> cygwin), linux and mac). But I can't (or I don't know how) make remove 
> this directory when I Ctrl+C my build (or abort the job on jenkins 
> server). My current implementation just keep spinning with message: 
> "Directory locked by cmake, build started in directory 
>  at ".

Maybe we need something like the 'trap' shell builtin which runs code on
various triggers rather than something like file/directory locks which
are…hairy (especially in the face of things like NFS or Samba)? I can
think of at least:

  - end of configure
  - end of generate
  - end of directory scope
  - end of scope (function or directory)

--Ben
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-10 Thread Ruslan Baratov via cmake-developers

On 10-Oct-14 16:58, David Cole wrote:

What is the main use case for locking files and directories from the
CMake language?

I feel slightly uncomfortable, without being able to put my finger on
exactly why, with the prospect of adding this to CMake...
I've described the situation in the first message of this thread: 
sharing resources between different cmake builds. If you want the 
particular case: I'm developing cmake-based package manager that share 
the builds of ExternalProject_Add. I'm experienced problems even when 
working on my local machine (I've started long-build in one console, 
then accidentally connect to the same shared directory in other 
console), but the main problem here is the server auto-builds which 
usually start multiple jobs simultaneously.


Behavior when there's a lock that still exists (by bug/mistake) after
CMake is done running is going to be strange and possibly
hard-to-diagnose / hard-to-understand.
That's *exactly* the problem I have and why I start this discussion. 
Currently I'm using mkdir command which return 0 only if directory 
created by current process (just to clarify, not the cmake -E 
make_directory). This works fine for me (tested on windows (mingw, 
cygwin), linux and mac). But I can't (or I don't know how) make remove 
this directory when I Ctrl+C my build (or abort the job on jenkins 
server). My current implementation just keep spinning with message: 
"Directory locked by cmake, build started in directory 
 at ".


Let's make sure the use case is quite strong before we accept the
possibility of "stale locks" in CMake.
Command `file(LOCK_GUARD ...)` will cover 100% of my needs. Other 
commands that I've mentioned used to cover suggestions from Brad K. (may 
be I've just understand them wrong).


Ruslo

Thanks, David C. On Fri, Oct 10, 2014 at 7:45 AM, Ruslan Baratov via 
cmake-developers  wrote:

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

--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

C

Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-10 Thread David Cole via cmake-developers
What is the main use case for locking files and directories from the
CMake language?

I feel slightly uncomfortable, without being able to put my finger on
exactly why, with the prospect of adding this to CMake...

Behavior when there's a lock that still exists (by bug/mistake) after
CMake is done running is going to be strange and possibly
hard-to-diagnose / hard-to-understand.

Let's make sure the use case is quite strong before we accept the
possibility of "stale locks" in CMake.


Thanks,
David C.



On Fri, Oct 10, 2014 at 7:45 AM, Ruslan Baratov via cmake-developers
 wrote:
> 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
>
> --
>
> Powered by www.kitware.com
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Kitware offers various services to support the CMake community. For more
> information on each offering, please visit:
>
> CMake Support: http://cmake.org/cmake/help/support.html
> CMake Consulting: http://cmake.org/cmake/help/consulting.html
> CMake Training Courses: http://cmake.org/cmake/help/training.html
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/cmake-developers
-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-10 Thread Ruslan Baratov via cmake-developers

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
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-08 Thread Brad King
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.

> * 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.

> * 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

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-08 Thread Ruslan Baratov via cmake-developers

On 07-Oct-14 16:25, Brad King wrote:

On 10/07/2014 02:49 AM, Ruslan Baratov wrote:

How it will looks like in terms of CMake code?

That's what I'm asking you to think through and propose ;)

Thanks,
-Brad

Okay :) I just not sure that I understand "to pass to some other 
process" goal correctly.


* 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

* 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

Ruslo
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-07 Thread Brad King
On 10/07/2014 02:49 AM, Ruslan Baratov wrote:
> How it will looks like in terms of CMake code?

That's what I'm asking you to think through and propose ;)

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-06 Thread Ruslan Baratov via cmake-developers

On 06-Oct-14 16:54, Brad King wrote:

On 10/05/2014 04:59 PM, Ruslan Baratov via cmake-developers wrote:

So it can't be resolved without some low-level management. I'm thinking
about `file` command sub-option like LOCK_DIRECTORY:
`file(LOCK_DIRECTORY "/path/to/shared-dir")`. Does it sounds doable?

I think it is a reasonable proposal.  However, more design is needed
here, including at least the following items:

* There needs to be a way to define the scope of the lock other than
   "until cmake exits".  For example, "until current function exits".

* There needs to be a way to explicitly unlock early, or



to explicitly release management of the lock (e.g. to pass to some other 
process).

How it will looks like in terms of CMake code?


* The implementation on Windows needs to be handled carefully.
   The "safe" way to delete a file there is to open it with a handle
   that is marked as delete-on-close, and then close the handle.
   That way the file is eventually deleted even if other processes
   currently have it open/locked.  I don't know if there is an
   equivalent for a directory.

Thanks,
-Brad



--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


Re: [cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-06 Thread Brad King
On 10/05/2014 04:59 PM, Ruslan Baratov via cmake-developers wrote:
> So it can't be resolved without some low-level management. I'm thinking 
> about `file` command sub-option like LOCK_DIRECTORY: 
> `file(LOCK_DIRECTORY "/path/to/shared-dir")`. Does it sounds doable?

I think it is a reasonable proposal.  However, more design is needed
here, including at least the following items:

* There needs to be a way to define the scope of the lock other than
  "until cmake exits".  For example, "until current function exits".

* There needs to be a way to explicitly unlock early, or to explicitly
  release management of the lock (e.g. to pass to some other process).

* The implementation on Windows needs to be handled carefully.
  The "safe" way to delete a file there is to open it with a handle
  that is marked as delete-on-close, and then close the handle.
  That way the file is eventually deleted even if other processes
  currently have it open/locked.  I don't know if there is an
  equivalent for a directory.

Thanks,
-Brad

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers


[cmake-developers] New command 'file(LOCK_DIRECTORY ...)'

2014-10-05 Thread Ruslan Baratov via cmake-developers

Hi,

I have CMake modules that can share resources between different 
instances. For now I manage it by invoking `mkdir 
/lock-directory` and checking the result, then removing this 
directory so the next instance can do the modification. The problem 
occurs when somebody terminate CMake. Since I can't set handler (e.g. 
SIGINT) to CMake, directory will not be removed and will be "locked" 
forever.


So it can't be resolved without some low-level management. I'm thinking 
about `file` command sub-option like LOCK_DIRECTORY: 
`file(LOCK_DIRECTORY "/path/to/shared-dir")`. Does it sounds doable?


Thanks, Ruslo
--

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers