/*============================================================================
  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 cmFileLockPool_h
#define cmFileLockPool_h

#include "cmStandardIncludes.h"

class cmFileLockResult;
class cmFileLock;

class cmFileLockPool
{
 public:
  cmFileLockPool();
  ~cmFileLockPool();

  //@{
  /**
    * @brief Function scope control.
    */
  void PushFunctionScope();
  void PopFunctionScope();
  //@}

  //@{
  /**
    * @brief File scope control.
    */
  void PushFileScope();
  void PopFileScope();
  //@}

  //@{
  /**
    * @brief Lock the file in given scope.
    * @param timeoutSec Lock timeout. If -1 try until success or fatal error.
    */
  cmFileLockResult LockFunctionScope(
      const std::string& filename, unsigned long timeoutSec
  );
  cmFileLockResult LockFileScope(
      const std::string& filename, unsigned long timeoutSec
  );
  cmFileLockResult LockProcessScope(
      const std::string& filename, unsigned long timeoutSec
  );
  //@}

  /**
    * @brief Unlock the file explicitly.
    */
  cmFileLockResult Release(const std::string& filename);

 private:
  cmFileLockPool(const cmFileLockPool&);
  cmFileLockPool& operator=(const cmFileLockPool&);

  bool IsAlreadyLocked(const std::string& filename) const;

  class ScopePool
  {
   public:
    ScopePool();
    ~ScopePool();

    cmFileLockResult Lock(
        const std::string& filename, unsigned long timeoutSec
    );
    cmFileLockResult Release(const std::string& filename);
    bool IsAlreadyLocked(const std::string& filename) const;

   private:
    ScopePool(const ScopePool&);
    ScopePool& operator=(const ScopePool&);

    typedef std::list<cmFileLock*> List;
    typedef List::iterator It;
    typedef List::const_iterator CIt;

    List Locks;
  };

  typedef std::list<ScopePool*> List;

  typedef List::iterator It;
  typedef List::const_iterator CIt;

  List FunctionScopes;
  List FileScopes;
  ScopePool ProcessScope;
};

#endif // cmFileLockPool_h
