Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: base/simple_thread_unittest.cc

Issue 6079009: Move some misc thread-related stuff from base to base/thread and into the bas... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/simple_thread.cc ('k') | base/thread_checker_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2010 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 #include "base/atomic_sequence_num.h"
6 #include "base/simple_thread.h"
7 #include "base/string_number_conversions.h"
8 #include "base/waitable_event.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace {
12
13 class SetIntRunner : public base::DelegateSimpleThread::Delegate {
14 public:
15 SetIntRunner(int* ptr, int val) : ptr_(ptr), val_(val) { }
16 ~SetIntRunner() { }
17
18 virtual void Run() {
19 *ptr_ = val_;
20 }
21
22 private:
23 int* ptr_;
24 int val_;
25 };
26
27 class WaitEventRunner : public base::DelegateSimpleThread::Delegate {
28 public:
29 explicit WaitEventRunner(base::WaitableEvent* event) : event_(event) { }
30 ~WaitEventRunner() { }
31
32 virtual void Run() {
33 EXPECT_FALSE(event_->IsSignaled());
34 event_->Signal();
35 EXPECT_TRUE(event_->IsSignaled());
36 }
37 private:
38 base::WaitableEvent* event_;
39 };
40
41 class SeqRunner : public base::DelegateSimpleThread::Delegate {
42 public:
43 explicit SeqRunner(base::AtomicSequenceNumber* seq) : seq_(seq) { }
44 virtual void Run() {
45 seq_->GetNext();
46 }
47
48 private:
49 base::AtomicSequenceNumber* seq_;
50 };
51
52 // We count up on a sequence number, firing on the event when we've hit our
53 // expected amount, otherwise we wait on the event. This will ensure that we
54 // have all threads outstanding until we hit our expected thread pool size.
55 class VerifyPoolRunner : public base::DelegateSimpleThread::Delegate {
56 public:
57 VerifyPoolRunner(base::AtomicSequenceNumber* seq,
58 int total, base::WaitableEvent* event)
59 : seq_(seq), total_(total), event_(event) { }
60
61 virtual void Run() {
62 if (seq_->GetNext() == total_) {
63 event_->Signal();
64 } else {
65 event_->Wait();
66 }
67 }
68
69 private:
70 base::AtomicSequenceNumber* seq_;
71 int total_;
72 base::WaitableEvent* event_;
73 };
74
75 } // namespace
76
77 TEST(SimpleThreadTest, CreateAndJoin) {
78 int stack_int = 0;
79
80 SetIntRunner runner(&stack_int, 7);
81 EXPECT_EQ(0, stack_int);
82
83 base::DelegateSimpleThread thread(&runner, "int_setter");
84 EXPECT_FALSE(thread.HasBeenStarted());
85 EXPECT_FALSE(thread.HasBeenJoined());
86 EXPECT_EQ(0, stack_int);
87
88 thread.Start();
89 EXPECT_TRUE(thread.HasBeenStarted());
90 EXPECT_FALSE(thread.HasBeenJoined());
91
92 thread.Join();
93 EXPECT_TRUE(thread.HasBeenStarted());
94 EXPECT_TRUE(thread.HasBeenJoined());
95 EXPECT_EQ(7, stack_int);
96 }
97
98 TEST(SimpleThreadTest, WaitForEvent) {
99 // Create a thread, and wait for it to signal us.
100 base::WaitableEvent event(true, false);
101
102 WaitEventRunner runner(&event);
103 base::DelegateSimpleThread thread(&runner, "event_waiter");
104
105 EXPECT_FALSE(event.IsSignaled());
106 thread.Start();
107 event.Wait();
108 EXPECT_TRUE(event.IsSignaled());
109 thread.Join();
110 }
111
112 TEST(SimpleThreadTest, NamedWithOptions) {
113 base::WaitableEvent event(true, false);
114
115 WaitEventRunner runner(&event);
116 base::SimpleThread::Options options;
117 base::DelegateSimpleThread thread(&runner, "event_waiter", options);
118 EXPECT_EQ(thread.name_prefix(), "event_waiter");
119 EXPECT_FALSE(event.IsSignaled());
120
121 thread.Start();
122 EXPECT_EQ(thread.name_prefix(), "event_waiter");
123 EXPECT_EQ(thread.name(),
124 std::string("event_waiter/") + base::IntToString(thread.tid()));
125 event.Wait();
126
127 EXPECT_TRUE(event.IsSignaled());
128 thread.Join();
129
130 // We keep the name and tid, even after the thread is gone.
131 EXPECT_EQ(thread.name_prefix(), "event_waiter");
132 EXPECT_EQ(thread.name(),
133 std::string("event_waiter/") + base::IntToString(thread.tid()));
134 }
135
136 TEST(SimpleThreadTest, ThreadPool) {
137 base::AtomicSequenceNumber seq;
138 SeqRunner runner(&seq);
139 base::DelegateSimpleThreadPool pool("seq_runner", 10);
140
141 // Add work before we're running.
142 pool.AddWork(&runner, 300);
143
144 EXPECT_EQ(seq.GetNext(), 0);
145 pool.Start();
146
147 // Add work while we're running.
148 pool.AddWork(&runner, 300);
149
150 pool.JoinAll();
151
152 EXPECT_EQ(seq.GetNext(), 601);
153
154 // We can reuse our pool. Verify that all 10 threads can actually run in
155 // parallel, so this test will only pass if there are actually 10 threads.
156 base::AtomicSequenceNumber seq2;
157 base::WaitableEvent event(true, false);
158 // Changing 9 to 10, for example, would cause us JoinAll() to never return.
159 VerifyPoolRunner verifier(&seq2, 9, &event);
160 pool.Start();
161
162 pool.AddWork(&verifier, 10);
163
164 pool.JoinAll();
165 EXPECT_EQ(seq2.GetNext(), 10);
166 }
OLDNEW
« no previous file with comments | « base/simple_thread.cc ('k') | base/thread_checker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698