//////////////////////////////////////////////////////////////////////////////

//

// (C) Copyright Ion Gaztanaga 2006. Distributed under the Boost

// Software License, Version 1.0. (See accompanying file

// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)

//

// See http://www.boost.org/libs/interprocess for documentation.

//

//////////////////////////////////////////////////////////////////////////////



#include<boost/interprocess/exceptions.hpp>

#include <boost/interprocess/detail/posix_time_types_wrk.hpp>

#include <boost/interprocess/sync/scoped_lock.hpp>



namespace boost {

namespace interprocess {



inline barrier::barrier(unsigned int count)

   : m_threshold(count), m_count(count), m_generation(0)

{

   if (count == 0)

      throw std::invalid_argument("count cannot be zero.");

}



inline barrier::~barrier(){}



inline bool barrier::wait()

{

   scoped_lock<interprocess_mutex> lock(m_mutex);

   unsigned int gen = m_generation;



   if (--m_count == 0){

      m_generation++;

      m_count = m_threshold;

      m_cond.notify_all();

      return true;

   }



   while (gen == m_generation){

      m_cond.wait(lock);

   }

   return false;

}



}  //namespace interprocess {

}  //namespace boost {

