"Fossies" - the Fresh Open Source Software Archive

Member "incubator-pagespeed-mod-1.14.36.1/pagespeed/kernel/base/abstract_mutex.h" (28 Feb 2020, 2560 Bytes) of package /linux/www/apache_httpd_modules/incubator-pagespeed-mod-1.14.36.1.tar.gz:


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_