"Fossies" - the Fresh Open Source Software Archive 
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "abstract_mutex.h" see the
Fossies "Dox" file reference documentation and the latest
Fossies "Diffs" side-by-side code changes report:
1.13.35.2_vs_1.14.36.1.
1 /*
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 */
19
20
21 #ifndef PAGESPEED_KERNEL_BASE_ABSTRACT_MUTEX_H_
22 #define PAGESPEED_KERNEL_BASE_ABSTRACT_MUTEX_H_
23
24 #include "pagespeed/kernel/base/basictypes.h"
25 #include "pagespeed/kernel/base/thread_annotations.h"
26
27 namespace net_instaweb {
28
29 // Abstract interface for implementing a mutex.
30 class LOCKABLE AbstractMutex {
31 public:
32 virtual ~AbstractMutex();
33 // Attempt to take mutex, true on success, false if held by another thread.
34 virtual bool TryLock() EXCLUSIVE_TRYLOCK_FUNCTION(true) = 0;
35 // Block until mutex is available, then take the mutex.
36 virtual void Lock() EXCLUSIVE_LOCK_FUNCTION() = 0;
37 // Release the mutex, permitting a blocked lock operation (if any) to proceed.
38 virtual void Unlock() UNLOCK_FUNCTION() = 0;
39 // Optionally checks that lock is held (for invariant checking purposes).
40 // Default implementation does no checking.
41 virtual void DCheckLocked();
42 // Optionally checks that lock is not held (for invariant checking purposes).
43 // Default implementation does no checking.
44 virtual void DCheckUnlocked();
45 };
46
47 // Helper class for lexically scoped mutexing.
48 class SCOPED_LOCKABLE ScopedMutex {
49 public:
50 explicit ScopedMutex(AbstractMutex* mutex) EXCLUSIVE_LOCK_FUNCTION(mutex)
51 : mutex_(mutex) {
52 mutex_->Lock();
53 }
54
55 void Release() UNLOCK_FUNCTION() {
56 if (mutex_ != NULL) {
57 mutex_->Unlock();
58 mutex_ = NULL;
59 }
60 }
61
62 ~ScopedMutex() UNLOCK_FUNCTION() { Release(); }
63
64 private:
65 AbstractMutex* mutex_;
66
67 DISALLOW_COPY_AND_ASSIGN(ScopedMutex);
68 };
69 // Catch bug where variable name is omitted with ScopedMutex, e.g.
70 // ScopedMutex(&mu);
71 #define ScopedMutex(x) COMPILE_ASSERT(0, mutex_lock_decl_missing_var_name)
72
73 } // namespace net_instaweb
74
75 #endif // PAGESPEED_KERNEL_BASE_ABSTRACT_MUTEX_H_