blob: 234bf3269a4a0569cd9881caddd4f5853fe7305d [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
Mark Slee9f0c6512007-02-28 23:58:26 +000019
Mark Sleef5f2be42006-09-05 21:05:31 +000020#ifndef _THRIFT_CONCURRENCY_MONITOR_H_
21#define _THRIFT_CONCURRENCY_MONITOR_H_ 1
Marc Slemko66949872006-07-15 01:52:39 +000022
Marc Slemko3a3b53b2007-05-22 23:59:54 +000023#include "Exception.h"
24
T Jake Lucianib5e62212009-01-31 22:36:20 +000025namespace apache { namespace thrift { namespace concurrency {
Marc Slemko66949872006-07-15 01:52:39 +000026
Mark Sleef5f2be42006-09-05 21:05:31 +000027/**
28 * A monitor is a combination mutex and condition-event. Waiting and
29 * notifying condition events requires that the caller own the mutex. Mutex
30 * lock and unlock operations can be performed independently of condition
31 * events. This is more or less analogous to java.lang.Object multi-thread
32 * operations
33 *
34 * Note that all methods are const. Monitors implement logical constness, not
35 * bit constness. This allows const methods to call monitor methods without
36 * needing to cast away constness or change to non-const signatures.
37 *
Mark Sleef5f2be42006-09-05 21:05:31 +000038 * @version $Id:$
39 */
Marc Slemko66949872006-07-15 01:52:39 +000040class Monitor {
41
42 public:
43
44 Monitor();
45
46 virtual ~Monitor();
47
48 virtual void lock() const;
49
50 virtual void unlock() const;
51
Mark Slee9b82d272007-05-23 05:16:07 +000052 virtual void wait(int64_t timeout=0LL) const;
Marc Slemko66949872006-07-15 01:52:39 +000053
54 virtual void notify() const;
55
56 virtual void notifyAll() const;
57
58 private:
59
60 class Impl;
61
Mark Slee2f6404d2006-10-10 01:37:40 +000062 Impl* impl_;
Marc Slemko66949872006-07-15 01:52:39 +000063};
64
65class Synchronized {
66 public:
Marc Slemko3a3b53b2007-05-22 23:59:54 +000067
Mark Slee2f6404d2006-10-10 01:37:40 +000068 Synchronized(const Monitor& value) :
69 monitor_(value) {
70 monitor_.lock();
Marc Slemko66949872006-07-15 01:52:39 +000071 }
72
73 ~Synchronized() {
Mark Slee2f6404d2006-10-10 01:37:40 +000074 monitor_.unlock();
Marc Slemko66949872006-07-15 01:52:39 +000075 }
76
77 private:
Mark Slee2f6404d2006-10-10 01:37:40 +000078 const Monitor& monitor_;
Marc Slemko66949872006-07-15 01:52:39 +000079};
80
81
T Jake Lucianib5e62212009-01-31 22:36:20 +000082}}} // apache::thrift::concurrency
Marc Slemko66949872006-07-15 01:52:39 +000083
Mark Sleef5f2be42006-09-05 21:05:31 +000084#endif // #ifndef _THRIFT_CONCURRENCY_MONITOR_H_