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 #ifndef VM_OS_THREAD_H_ | 5 #ifndef VM_OS_THREAD_H_ |
6 #define VM_OS_THREAD_H_ | 6 #define VM_OS_THREAD_H_ |
7 | 7 |
8 #include "platform/globals.h" | 8 #include "platform/globals.h" |
9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
10 #include "vm/globals.h" | 10 #include "vm/globals.h" |
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 private: | 259 private: |
260 OSThread* next_; | 260 OSThread* next_; |
261 }; | 261 }; |
262 | 262 |
263 | 263 |
264 class Mutex { | 264 class Mutex { |
265 public: | 265 public: |
266 Mutex(); | 266 Mutex(); |
267 ~Mutex(); | 267 ~Mutex(); |
268 | 268 |
269 void Lock(); | |
270 bool TryLock(); // Returns false if lock is busy and locking failed. | |
271 void Unlock(); | |
272 | |
273 #if defined(DEBUG) | 269 #if defined(DEBUG) |
274 bool IsOwnedByCurrentThread() const { | 270 bool IsOwnedByCurrentThread() const { |
275 return owner_ == OSThread::GetCurrentThreadId(); | 271 return owner_ == OSThread::GetCurrentThreadId(); |
276 } | 272 } |
277 #else | 273 #else |
278 bool IsOwnedByCurrentThread() const { | 274 bool IsOwnedByCurrentThread() const { |
279 UNREACHABLE(); | 275 UNREACHABLE(); |
280 return false; | 276 return false; |
281 } | 277 } |
282 #endif | 278 #endif |
283 | 279 |
284 private: | 280 private: |
| 281 void Lock(); |
| 282 bool TryLock(); // Returns false if lock is busy and locking failed. |
| 283 void Unlock(); |
| 284 |
285 MutexData data_; | 285 MutexData data_; |
286 #if defined(DEBUG) | 286 #if defined(DEBUG) |
287 ThreadId owner_; | 287 ThreadId owner_; |
288 #endif // defined(DEBUG) | 288 #endif // defined(DEBUG) |
289 | 289 |
| 290 friend class MutexLocker; |
| 291 friend class SafepointMutexLocker; |
| 292 friend class OSThreadIterator; |
| 293 friend class TimelineEventBlockIterator; |
| 294 friend class TimelineEventRecorder; |
| 295 friend class PageSpace; |
| 296 friend void Dart_TestMutex(); |
290 DISALLOW_COPY_AND_ASSIGN(Mutex); | 297 DISALLOW_COPY_AND_ASSIGN(Mutex); |
291 }; | 298 }; |
292 | 299 |
293 | 300 |
294 class Monitor { | 301 class Monitor { |
295 public: | 302 public: |
296 enum WaitResult { | 303 enum WaitResult { |
297 kNotified, | 304 kNotified, |
298 kTimedOut | 305 kTimedOut |
299 }; | 306 }; |
300 | 307 |
301 static const int64_t kNoTimeout = 0; | 308 static const int64_t kNoTimeout = 0; |
302 | 309 |
303 Monitor(); | 310 Monitor(); |
304 ~Monitor(); | 311 ~Monitor(); |
305 | 312 |
306 bool TryEnter(); // Returns false if lock is busy and locking failed. | |
307 void Enter(); | |
308 void Exit(); | |
309 | |
310 // Wait for notification or timeout. | |
311 WaitResult Wait(int64_t millis); | |
312 WaitResult WaitMicros(int64_t micros); | |
313 | |
314 // Notify waiting threads. | |
315 void Notify(); | |
316 void NotifyAll(); | |
317 | |
318 #if defined(DEBUG) | 313 #if defined(DEBUG) |
319 bool IsOwnedByCurrentThread() const { | 314 bool IsOwnedByCurrentThread() const { |
320 return owner_ == OSThread::GetCurrentThreadId(); | 315 return owner_ == OSThread::GetCurrentThreadId(); |
321 } | 316 } |
322 #else | 317 #else |
323 bool IsOwnedByCurrentThread() const { | 318 bool IsOwnedByCurrentThread() const { |
324 UNREACHABLE(); | 319 UNREACHABLE(); |
325 return false; | 320 return false; |
326 } | 321 } |
327 #endif | 322 #endif |
328 | 323 |
329 private: | 324 private: |
| 325 bool TryEnter(); // Returns false if lock is busy and locking failed. |
| 326 void Enter(); |
| 327 void Exit(); |
| 328 |
| 329 // Wait for notification or timeout. |
| 330 WaitResult Wait(int64_t millis); |
| 331 WaitResult WaitMicros(int64_t micros); |
| 332 |
| 333 // Notify waiting threads. |
| 334 void Notify(); |
| 335 void NotifyAll(); |
| 336 |
330 MonitorData data_; // OS-specific data. | 337 MonitorData data_; // OS-specific data. |
331 #if defined(DEBUG) | 338 #if defined(DEBUG) |
332 ThreadId owner_; | 339 ThreadId owner_; |
333 #endif // defined(DEBUG) | 340 #endif // defined(DEBUG) |
334 | 341 |
| 342 friend class MonitorLocker; |
| 343 friend class SafepointMonitorLocker; |
| 344 friend void Dart_TestMonitor(); |
335 DISALLOW_COPY_AND_ASSIGN(Monitor); | 345 DISALLOW_COPY_AND_ASSIGN(Monitor); |
336 }; | 346 }; |
337 | 347 |
338 | 348 |
339 } // namespace dart | 349 } // namespace dart |
340 | 350 |
341 | 351 |
342 #endif // VM_OS_THREAD_H_ | 352 #endif // VM_OS_THREAD_H_ |
OLD | NEW |