Home | History | Annotate | Download | only in synchronization
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef BASE_SYNCHRONIZATION_CANCELLATION_FLAG_H_
      6 #define BASE_SYNCHRONIZATION_CANCELLATION_FLAG_H_
      7 
      8 #include "base/atomicops.h"
      9 #include "base/base_export.h"
     10 #include "base/macros.h"
     11 #include "base/threading/platform_thread.h"
     12 
     13 namespace base {
     14 
     15 // CancellationFlag allows one thread to cancel jobs executed on some worker
     16 // thread. Calling Set() from one thread and IsSet() from a number of threads
     17 // is thread-safe.
     18 //
     19 // This class IS NOT intended for synchronization between threads.
     20 class BASE_EXPORT CancellationFlag {
     21  public:
     22   CancellationFlag() : flag_(false) {
     23 #if !defined(NDEBUG)
     24     set_on_ = PlatformThread::CurrentId();
     25 #endif
     26   }
     27   ~CancellationFlag() {}
     28 
     29   // Set the flag. May only be called on the thread which owns the object.
     30   void Set();
     31   bool IsSet() const;  // Returns true iff the flag was set.
     32 
     33   // For subtle reasons that may be different on different architectures,
     34   // a different thread testing IsSet() may erroneously read 'true' after
     35   // this method has been called.
     36   void UnsafeResetForTesting();
     37 
     38  private:
     39   base::subtle::Atomic32 flag_;
     40 #if !defined(NDEBUG)
     41   PlatformThreadId set_on_;
     42 #endif
     43 
     44   DISALLOW_COPY_AND_ASSIGN(CancellationFlag);
     45 };
     46 
     47 }  // namespace base
     48 
     49 #endif  // BASE_SYNCHRONIZATION_CANCELLATION_FLAG_H_
     50