| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 #if defined(TARGET_OS_WINDOWS) | 6 #if defined(TARGET_OS_WINDOWS) |
| 7 | 7 |
| 8 #include "vm/thread.h" | 8 #include "vm/thread.h" |
| 9 | 9 |
| 10 #include <process.h> // NOLINT | 10 #include <process.h> // NOLINT |
| 11 | 11 |
| 12 #include "platform/assert.h" | 12 #include "platform/assert.h" |
| 13 #include "vm/isolate.h" |
| 13 | 14 |
| 14 namespace dart { | 15 namespace dart { |
| 15 | 16 |
| 16 class ThreadStartData { | 17 class ThreadStartData { |
| 17 public: | 18 public: |
| 18 ThreadStartData(Thread::ThreadStartFunction function, uword parameter) | 19 ThreadStartData(Thread::ThreadStartFunction function, uword parameter) |
| 19 : function_(function), parameter_(parameter) {} | 20 : function_(function), parameter_(parameter) {} |
| 20 | 21 |
| 21 Thread::ThreadStartFunction function() const { return function_; } | 22 Thread::ThreadStartFunction function() const { return function_; } |
| 22 uword parameter() const { return parameter_; } | 23 uword parameter() const { return parameter_; } |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 } | 164 } |
| 164 } | 165 } |
| 165 | 166 |
| 166 | 167 |
| 167 Mutex::Mutex() { | 168 Mutex::Mutex() { |
| 168 // Allocate unnamed semaphore with initial count 1 and max count 1. | 169 // Allocate unnamed semaphore with initial count 1 and max count 1. |
| 169 data_.semaphore_ = CreateSemaphore(NULL, 1, 1, NULL); | 170 data_.semaphore_ = CreateSemaphore(NULL, 1, 1, NULL); |
| 170 if (data_.semaphore_ == NULL) { | 171 if (data_.semaphore_ == NULL) { |
| 171 FATAL1("Mutex allocation failed %d", GetLastError()); | 172 FATAL1("Mutex allocation failed %d", GetLastError()); |
| 172 } | 173 } |
| 174 // When running with assertions enabled we do track the owner. |
| 175 #if defined(DEBUG) |
| 176 owner_ = NULL; |
| 177 #endif // defined(DEBUG) |
| 173 } | 178 } |
| 174 | 179 |
| 175 | 180 |
| 176 Mutex::~Mutex() { | 181 Mutex::~Mutex() { |
| 177 CloseHandle(data_.semaphore_); | 182 CloseHandle(data_.semaphore_); |
| 183 // When running with assertions enabled we do track the owner. |
| 184 #if defined(DEBUG) |
| 185 ASSERT(owner_ == NULL); |
| 186 #endif // defined(DEBUG) |
| 178 } | 187 } |
| 179 | 188 |
| 180 | 189 |
| 181 void Mutex::Lock() { | 190 void Mutex::Lock() { |
| 182 DWORD result = WaitForSingleObject(data_.semaphore_, INFINITE); | 191 DWORD result = WaitForSingleObject(data_.semaphore_, INFINITE); |
| 183 if (result != WAIT_OBJECT_0) { | 192 if (result != WAIT_OBJECT_0) { |
| 184 FATAL1("Mutex lock failed %d", GetLastError()); | 193 FATAL1("Mutex lock failed %d", GetLastError()); |
| 185 } | 194 } |
| 195 // When running with assertions enabled we do track the owner. |
| 196 #if defined(DEBUG) |
| 197 owner_ = Isolate::Current(); |
| 198 #endif // defined(DEBUG) |
| 186 } | 199 } |
| 187 | 200 |
| 188 | 201 |
| 189 bool Mutex::TryLock() { | 202 bool Mutex::TryLock() { |
| 190 // Attempt to pass the semaphore but return immediately. | 203 // Attempt to pass the semaphore but return immediately. |
| 191 DWORD result = WaitForSingleObject(data_.semaphore_, 0); | 204 DWORD result = WaitForSingleObject(data_.semaphore_, 0); |
| 192 if (result == WAIT_OBJECT_0) { | 205 if (result == WAIT_OBJECT_0) { |
| 206 // When running with assertions enabled we do track the owner. |
| 207 #if defined(DEBUG) |
| 208 owner_ = Isolate::Current(); |
| 209 #endif // defined(DEBUG) |
| 193 return true; | 210 return true; |
| 194 } | 211 } |
| 195 if (result == WAIT_ABANDONED || result == WAIT_FAILED) { | 212 if (result == WAIT_ABANDONED || result == WAIT_FAILED) { |
| 196 FATAL1("Mutex try lock failed %d", GetLastError()); | 213 FATAL1("Mutex try lock failed %d", GetLastError()); |
| 197 } | 214 } |
| 198 ASSERT(result == WAIT_TIMEOUT); | 215 ASSERT(result == WAIT_TIMEOUT); |
| 199 return false; | 216 return false; |
| 200 } | 217 } |
| 201 | 218 |
| 202 | 219 |
| 203 void Mutex::Unlock() { | 220 void Mutex::Unlock() { |
| 221 // When running with assertions enabled we do track the owner. |
| 222 #if defined(DEBUG) |
| 223 ASSERT(owner_ == Isolate::Current()); |
| 224 owner_ = NULL; |
| 225 #endif // defined(DEBUG) |
| 204 BOOL result = ReleaseSemaphore(data_.semaphore_, 1, NULL); | 226 BOOL result = ReleaseSemaphore(data_.semaphore_, 1, NULL); |
| 205 if (result == 0) { | 227 if (result == 0) { |
| 206 FATAL1("Mutex unlock failed %d", GetLastError()); | 228 FATAL1("Mutex unlock failed %d", GetLastError()); |
| 207 } | 229 } |
| 208 } | 230 } |
| 209 | 231 |
| 210 | 232 |
| 211 ThreadLocalKey MonitorWaitData::monitor_wait_data_key_ = | 233 ThreadLocalKey MonitorWaitData::monitor_wait_data_key_ = |
| 212 Thread::kUnsetThreadLocalKey; | 234 Thread::kUnsetThreadLocalKey; |
| 213 | 235 |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 // timeout before we signal it, that object will get an extra | 452 // timeout before we signal it, that object will get an extra |
| 431 // signal. This will be treated as a spurious wake-up and is OK | 453 // signal. This will be treated as a spurious wake-up and is OK |
| 432 // since all uses of monitors should recheck the condition after a | 454 // since all uses of monitors should recheck the condition after a |
| 433 // Wait. | 455 // Wait. |
| 434 data_.SignalAndRemoveAllWaiters(); | 456 data_.SignalAndRemoveAllWaiters(); |
| 435 } | 457 } |
| 436 | 458 |
| 437 } // namespace dart | 459 } // namespace dart |
| 438 | 460 |
| 439 #endif // defined(TARGET_OS_WINDOWS) | 461 #endif // defined(TARGET_OS_WINDOWS) |
| OLD | NEW |