| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/threading/worker_pool_posix.h" | 5 #include "base/threading/worker_pool_posix.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 while (peer_.num_idle_threads() > 0) { | 224 while (peer_.num_idle_threads() > 0) { |
| 225 peer_.pending_tasks_available_cv()->Signal(); | 225 peer_.pending_tasks_available_cv()->Signal(); |
| 226 peer_.num_idle_threads_cv()->Wait(); | 226 peer_.num_idle_threads_cv()->Wait(); |
| 227 } | 227 } |
| 228 } | 228 } |
| 229 | 229 |
| 230 // Add another non blocking task. There are no threads to reuse. | 230 // Add another non blocking task. There are no threads to reuse. |
| 231 pool_->PostTask(FROM_HERE, CreateNewIncrementingTaskCallback()); | 231 pool_->PostTask(FROM_HERE, CreateNewIncrementingTaskCallback()); |
| 232 WaitForIdleThreads(1); | 232 WaitForIdleThreads(1); |
| 233 | 233 |
| 234 EXPECT_EQ(3U, unique_threads_.size()); | 234 // The POSIX implementation of PlatformThread::CurrentId() uses pthread_self() |
| 235 // which is not guaranteed to be unique after a thread joins. The OS X |
| 236 // implemntation of pthread_self() returns the address of the pthread_t, which |
| 237 // is merely a malloc()ed pointer stored in the first TLS slot. When a thread |
| 238 // joins and that structure is freed, the block of memory can be put on the |
| 239 // OS free list, meaning the same address could be reused in a subsequent |
| 240 // allocation. This in fact happens when allocating in a loop as this test |
| 241 // does. |
| 242 // |
| 243 // Because there are two concurrent threads, there's at least the guarantee |
| 244 // of having two unique thread IDs in the set. But after those two threads are |
| 245 // joined, the next-created thread can get a re-used ID if the allocation of |
| 246 // the pthread_t structure is taken from the free list. Therefore, there can |
| 247 // be either 2 or 3 unique thread IDs in the set at this stage in the test. |
| 248 EXPECT_TRUE(unique_threads_.size() >= 2 && unique_threads_.size() <= 3) |
| 249 << "unique_threads_.size() = " << unique_threads_.size(); |
| 235 EXPECT_EQ(1, peer_.num_idle_threads()); | 250 EXPECT_EQ(1, peer_.num_idle_threads()); |
| 236 EXPECT_EQ(4, counter_); | 251 EXPECT_EQ(4, counter_); |
| 237 } | 252 } |
| 238 | 253 |
| 239 } // namespace base | 254 } // namespace base |
| OLD | NEW |