cancellation_flag.h revision c7f5f8508d98d5952d42ed7648c2a8f30a4da156
1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef BASE_CANCELLATION_FLAG_H_
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define BASE_CANCELLATION_FLAG_H_
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/atomicops.h"
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/platform_thread.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base {
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// CancellationFlag allows one thread to cancel jobs executed on some worker
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// thread. Calling Set() from one thread and IsSet() from a number of threads
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// is thread-safe.
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This class IS NOT intended for synchronization between threads.
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass CancellationFlag {
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CancellationFlag() : flag_(false) {
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(NDEBUG)
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    set_on_ = PlatformThread::CurrentId();
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ~CancellationFlag() {}
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Set the flag. May only be called on the thread which owns the object.
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void Set();
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool IsSet() const;  // Returns true iff the flag was set.
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::subtle::Atomic32 flag_;
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if !defined(NDEBUG)
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  PlatformThreadId set_on_;
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DISALLOW_COPY_AND_ASSIGN(CancellationFlag);
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace base
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // BASE_CANCELLATION_FLAG_H_
43