| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. | 2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
| 4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
| 5 */ | 5 */ |
| 6 | 6 |
| 7 | 7 |
| 8 // See header file for description of class. | 8 // See header file for description of class. |
| 9 // There are numerous subtle implementation details in this class. See the FAQ | 9 // There are numerous subtle implementation details in this class. See the FAQ |
| 10 // comments at the end of this file for that discussion. | 10 // comments at the end of this file for that discussion. |
| 11 | 11 |
| 12 #include "native_client/src/include/portability.h" | 12 #include "native_client/src/include/portability.h" |
| 13 #include <stack> | 13 #include <stack> |
| 14 | 14 |
| 15 #include "native_client/src/shared/platform/nacl_sync.h" | 15 #include "native_client/src/shared/platform/nacl_sync.h" |
| 16 #include "native_client/src/include/nacl_macros.h" | 16 #include "native_client/src/include/nacl_macros.h" |
| 17 #include "native_client/src/shared/platform/nacl_log.h" | 17 #include "native_client/src/shared/platform/nacl_log.h" |
| 18 #include "native_client/src/shared/platform/nacl_time.h" | 18 #include "native_client/src/shared/platform/nacl_time.h" |
| 19 #include "native_client/src/shared/platform/win/condition_variable.h" | 19 #include "native_client/src/shared/platform/win/condition_variable.h" |
| 20 #include "native_client/src/shared/platform/win/lock.h" | 20 #include "native_client/src/shared/platform/win/lock.h" |
| 21 #include "native_client/src/trusted/service_runtime/include/sys/time.h" | 21 #include "native_client/src/trusted/service_runtime/include/sys/time.h" |
| 22 | 22 |
| 23 static const int64_t kMillisecondsPerSecond = 1000; | 23 static const int64_t kMillisecondsPerSecond = 1000; |
| 24 static const int64_t kMicrosecondsPerMillisecond = 1000; | 24 static const int64_t kMicrosecondsPerMillisecond = 1000; |
| 25 static const int64_t kMicrosecondsPerSecond = | 25 static const int64_t kMicrosecondsPerSecond = |
| 26 kMicrosecondsPerMillisecond * kMillisecondsPerSecond; | 26 kMicrosecondsPerMillisecond * kMillisecondsPerSecond; |
| 27 | 27 |
| 28 NaCl::ConditionVariable::ConditionVariable() | 28 NaCl::ConditionVariable::ConditionVariable() |
| 29 : run_state_(RUNNING), | 29 : run_state_(RUNNING), |
| 30 allocation_counter_(0), | 30 recycling_list_size_(0), |
| 31 recycling_list_size_(0) { | 31 allocation_counter_(0) { |
| 32 } | 32 } |
| 33 | 33 |
| 34 NaCl::ConditionVariable::~ConditionVariable() { | 34 NaCl::ConditionVariable::~ConditionVariable() { |
| 35 AutoLock auto_lock(internal_lock_); | 35 AutoLock auto_lock(internal_lock_); |
| 36 run_state_ = SHUTDOWN; // Prevent any more waiting. | 36 run_state_ = SHUTDOWN; // Prevent any more waiting. |
| 37 | 37 |
| 38 // DCHECK(recycling_list_size_ == allocation_counter_) ; | 38 // DCHECK(recycling_list_size_ == allocation_counter_) ; |
| 39 if (recycling_list_size_ != allocation_counter_) { // Rare shutdown problem. | 39 if (recycling_list_size_ != allocation_counter_) { // Rare shutdown problem. |
| 40 // User left threads Wait()ing, and is destructing us. | 40 // User left threads Wait()ing, and is destructing us. |
| 41 // Note: waiting_list_ *might* be empty, but recycling is still pending. | 41 // Note: waiting_list_ *might* be empty, but recycling is still pending. |
| (...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 waiting_list. A hash table (STL map) could be used, but I was embarrased to | 352 waiting_list. A hash table (STL map) could be used, but I was embarrased to |
| 353 use a complex and relatively low efficiency container when a doubly linked list | 353 use a complex and relatively low efficiency container when a doubly linked list |
| 354 provided O(1) performance in all required operations. Since other operations | 354 provided O(1) performance in all required operations. Since other operations |
| 355 to provide performance-and/or-fairness required queue (FIFO) and list (LIFO) | 355 to provide performance-and/or-fairness required queue (FIFO) and list (LIFO) |
| 356 containers, I would also have needed to use an STL list/queue as well as an STL | 356 containers, I would also have needed to use an STL list/queue as well as an STL |
| 357 map. In the end I decided it would be "fun" to just do it right, and I | 357 map. In the end I decided it would be "fun" to just do it right, and I |
| 358 put so many assertions (DCHECKs) into the container class that it is trivial to | 358 put so many assertions (DCHECKs) into the container class that it is trivial to |
| 359 code review and validate its correctness. | 359 code review and validate its correctness. |
| 360 | 360 |
| 361 */ | 361 */ |
| OLD | NEW |