• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
6 #define BASE_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
7 
8 #include <stddef.h>
9 
10 #include <cstddef>
11 #include <string>
12 
13 #include "base/callback.h"
14 #include "base/compiler_specific.h"
15 #include "base/macros.h"
16 #include "base/memory/ref_counted.h"
17 #include "base/run_loop.h"
18 #include "base/synchronization/lock.h"
19 #include "base/threading/sequenced_worker_pool.h"
20 
21 namespace base {
22 
23 class MessageLoop;
24 
25 // Wrapper around SequencedWorkerPool for testing that blocks destruction
26 // until the pool is actually destroyed.  This is so that a
27 // SequencedWorkerPool from one test doesn't outlive its test and cause
28 // strange races with other tests that touch global stuff (like histograms and
29 // logging).  However, this requires that nothing else on this thread holds a
30 // ref to the pool when the SequencedWorkerPoolOwner is destroyed.
31 //
32 // This class calls Shutdown on the owned SequencedWorkerPool in the destructor.
33 // Tests may themselves call Shutdown earlier to test shutdown behavior.
34 class SequencedWorkerPoolOwner : public SequencedWorkerPool::TestingObserver {
35  public:
36   SequencedWorkerPoolOwner(size_t max_threads,
37                            const std::string& thread_name_prefix);
38 
39   ~SequencedWorkerPoolOwner() override;
40 
41   // Don't change the returned pool's testing observer.
42   const scoped_refptr<SequencedWorkerPool>& pool();
43 
44   // The given callback will be called on WillWaitForShutdown().
45   void SetWillWaitForShutdownCallback(const Closure& callback);
46 
47   int has_work_call_count() const;
48 
49  private:
50   // SequencedWorkerPool::TestingObserver implementation.
51   void OnHasWork() override;
52   void WillWaitForShutdown() override;
53   void OnDestruct() override;
54 
55   // Used to run the current thread's message loop until the
56   // SequencedWorkerPool's destruction has been verified.
57   base::RunLoop exit_loop_;
58   MessageLoop* const constructor_message_loop_;
59 
60   scoped_refptr<SequencedWorkerPool> pool_;
61   Closure will_wait_for_shutdown_callback_;
62 
63   mutable Lock has_work_lock_;
64   int has_work_call_count_;
65 
66   DISALLOW_COPY_AND_ASSIGN(SequencedWorkerPoolOwner);
67 };
68 
69 }  // namespace base
70 
71 #endif  // BASE_TEST_SEQUENCED_WORKER_POOL_OWNER_H_
72