| /* | 
 |  * Licensed to the Apache Software Foundation (ASF) under one | 
 |  * or more contributor license agreements. See the NOTICE file | 
 |  * distributed with this work for additional information | 
 |  * regarding copyright ownership. The ASF licenses this file | 
 |  * to you under the Apache License, Version 2.0 (the | 
 |  * "License"); you may not use this file except in compliance | 
 |  * with the License. You may obtain a copy of the License at | 
 |  * | 
 |  *   http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, | 
 |  * software distributed under the License is distributed on an | 
 |  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 |  * KIND, either express or implied. See the License for the | 
 |  * specific language governing permissions and limitations | 
 |  * under the License. | 
 |  */ | 
 |  | 
 | #ifndef _THRIFT_CONCURRENCY_MONITOR_H_ | 
 | #define _THRIFT_CONCURRENCY_MONITOR_H_ 1 | 
 |  | 
 | #include "Exception.h" | 
 | #include "Mutex.h" | 
 |  | 
 | #include <boost/utility.hpp> | 
 |  | 
 |  | 
 | namespace apache { namespace thrift { namespace concurrency { | 
 |  | 
 | /** | 
 |  * A monitor is a combination mutex and condition-event.  Waiting and | 
 |  * notifying condition events requires that the caller own the mutex.  Mutex | 
 |  * lock and unlock operations can be performed independently of condition | 
 |  * events.  This is more or less analogous to java.lang.Object multi-thread | 
 |  * operations. | 
 |  * | 
 |  * Note the Monitor can create a new, internal mutex; alternatively, a | 
 |  * separate Mutex can be passed in and the Monitor will re-use it without | 
 |  * taking ownership.  It's the user's responsibility to make sure that the | 
 |  * Mutex is not deallocated before the Monitor. | 
 |  * | 
 |  * Note that all methods are const.  Monitors implement logical constness, not | 
 |  * bit constness.  This allows const methods to call monitor methods without | 
 |  * needing to cast away constness or change to non-const signatures. | 
 |  * | 
 |  * @version $Id:$ | 
 |  */ | 
 | class Monitor : boost::noncopyable { | 
 |  public: | 
 |   /** Creates a new mutex, and takes ownership of it. */ | 
 |   Monitor(); | 
 |  | 
 |   /** Uses the provided mutex without taking ownership. */ | 
 |   explicit Monitor(Mutex* mutex); | 
 |  | 
 |   /** Uses the mutex inside the provided Monitor without taking ownership. */ | 
 |   explicit Monitor(Monitor* monitor); | 
 |  | 
 |   /** Deallocates the mutex only if we own it. */ | 
 |   virtual ~Monitor(); | 
 |  | 
 |   Mutex& mutex() const; | 
 |  | 
 |   virtual void lock() const; | 
 |  | 
 |   virtual void unlock() const; | 
 |  | 
 |   /** | 
 |    * Waits a maximum of the specified timeout in milliseconds for the condition | 
 |    * to occur, or waits forever if timeout_ms == 0. | 
 |    * | 
 |    * Returns 0 if condition occurs, ETIMEDOUT on timeout, or an error code. | 
 |    */ | 
 |   int waitForTimeRelative(int64_t timeout_ms) const; | 
 |  | 
 |   /** | 
 |    * Waits until the absolute time specified using struct timespec. | 
 |    * Returns 0 if condition occurs, ETIMEDOUT on timeout, or an error code. | 
 |    */ | 
 |   int waitForTime(const timespec* abstime) const; | 
 |  | 
 |   /** | 
 |    * Waits forever until the condition occurs. | 
 |    * Returns 0 if condition occurs, or an error code otherwise. | 
 |    */ | 
 |   int waitForever() const; | 
 |  | 
 |   /** | 
 |    * Exception-throwing version of waitForTimeRelative(), called simply | 
 |    * wait(int64) for historical reasons.  Timeout is in milliseconds. | 
 |    * | 
 |    * If the condition occurs,  this function returns cleanly; on timeout or | 
 |    * error an exception is thrown. | 
 |    */ | 
 |   void wait(int64_t timeout_ms = 0LL) const; | 
 |  | 
 |  | 
 |   /** Wakes up one thread waiting on this monitor. */ | 
 |   virtual void notify() const; | 
 |  | 
 |   /** Wakes up all waiting threads on this monitor. */ | 
 |   virtual void notifyAll() const; | 
 |  | 
 |  private: | 
 |  | 
 |   class Impl; | 
 |  | 
 |   Impl* impl_; | 
 | }; | 
 |  | 
 | class Synchronized { | 
 |  public: | 
 |  Synchronized(const Monitor* monitor) : g(monitor->mutex()) { } | 
 |  Synchronized(const Monitor& monitor) : g(monitor.mutex()) { } | 
 |  | 
 |  private: | 
 |   Guard g; | 
 | }; | 
 |  | 
 |  | 
 | }}} // apache::thrift::concurrency | 
 |  | 
 | #endif // #ifndef _THRIFT_CONCURRENCY_MONITOR_H_ |