| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 #ifndef PLATFORM_THREAD_WIN_H_ | |
| 6 #define PLATFORM_THREAD_WIN_H_ | |
| 7 | |
| 8 #if !defined(PLATFORM_THREAD_H_) | |
| 9 #error Do not include thread_win.h directly; use thread.h instead. | |
| 10 #endif | |
| 11 | |
| 12 #include "platform/assert.h" | |
| 13 #include "platform/globals.h" | |
| 14 | |
| 15 namespace dart { | |
| 16 | |
| 17 typedef DWORD ThreadLocalKey; | |
| 18 typedef DWORD ThreadId; | |
| 19 | |
| 20 | |
| 21 class ThreadInlineImpl { | |
| 22 private: | |
| 23 ThreadInlineImpl() {} | |
| 24 ~ThreadInlineImpl() {} | |
| 25 | |
| 26 static uword GetThreadLocal(ThreadLocalKey key) { | |
| 27 static ThreadLocalKey kUnsetThreadLocalKey = TLS_OUT_OF_INDEXES; | |
| 28 ASSERT(key != kUnsetThreadLocalKey); | |
| 29 return reinterpret_cast<uword>(TlsGetValue(key)); | |
| 30 } | |
| 31 | |
| 32 friend class Thread; | |
| 33 friend unsigned int __stdcall ThreadEntry(void* data_ptr); | |
| 34 | |
| 35 DISALLOW_ALLOCATION(); | |
| 36 DISALLOW_COPY_AND_ASSIGN(ThreadInlineImpl); | |
| 37 }; | |
| 38 | |
| 39 | |
| 40 class MutexData { | |
| 41 private: | |
| 42 MutexData() {} | |
| 43 ~MutexData() {} | |
| 44 | |
| 45 HANDLE semaphore_; | |
| 46 | |
| 47 friend class Mutex; | |
| 48 | |
| 49 DISALLOW_ALLOCATION(); | |
| 50 DISALLOW_COPY_AND_ASSIGN(MutexData); | |
| 51 }; | |
| 52 | |
| 53 | |
| 54 class MonitorWaitData { | |
| 55 public: | |
| 56 static void ThreadExit(); | |
| 57 | |
| 58 private: | |
| 59 explicit MonitorWaitData(HANDLE event) : event_(event), next_(NULL) {} | |
| 60 ~MonitorWaitData() { | |
| 61 CloseHandle(event_); | |
| 62 ASSERT(next_ == NULL); | |
| 63 } | |
| 64 | |
| 65 // ThreadLocalKey used to fetch and store the MonitorWaitData object | |
| 66 // for a given thread. | |
| 67 static ThreadLocalKey monitor_wait_data_key_; | |
| 68 | |
| 69 // Auto-reset event used for waiting. | |
| 70 HANDLE event_; | |
| 71 // Link to next element in the singly-linked list of waiters. | |
| 72 MonitorWaitData* next_; | |
| 73 | |
| 74 friend class Monitor; | |
| 75 friend class MonitorData; | |
| 76 friend class OS; | |
| 77 | |
| 78 | |
| 79 DISALLOW_COPY_AND_ASSIGN(MonitorWaitData); | |
| 80 }; | |
| 81 | |
| 82 | |
| 83 class MonitorData { | |
| 84 private: | |
| 85 MonitorData() {} | |
| 86 ~MonitorData() {} | |
| 87 | |
| 88 // Helper methods to manipulate the list of waiters for this | |
| 89 // monitor. | |
| 90 void AddWaiter(MonitorWaitData* wait_data); | |
| 91 void RemoveWaiter(MonitorWaitData* wait_data); | |
| 92 void SignalAndRemoveFirstWaiter(); | |
| 93 void SignalAndRemoveAllWaiters(); | |
| 94 static MonitorWaitData* GetMonitorWaitDataForThread(); | |
| 95 | |
| 96 // The external critical section for the monitor. | |
| 97 CRITICAL_SECTION cs_; | |
| 98 | |
| 99 // Condition variables are only available since Windows Vista. To | |
| 100 // support at least Windows XP, we implement our own condition | |
| 101 // variables using SetEvent on Event objects. | |
| 102 | |
| 103 // Singly-linked list of event objects, one for each thread waiting | |
| 104 // on this monitor. New waiters are added at the end of the list. | |
| 105 // Notify signals the first element of the list (FIFO | |
| 106 // order). NotifyAll, signals all the elements of the list. | |
| 107 CRITICAL_SECTION waiters_cs_; | |
| 108 MonitorWaitData* waiters_head_; | |
| 109 MonitorWaitData* waiters_tail_; | |
| 110 | |
| 111 friend class Monitor; | |
| 112 friend class OS; | |
| 113 friend unsigned int __stdcall ThreadEntry(void* data_ptr); | |
| 114 | |
| 115 DISALLOW_ALLOCATION(); | |
| 116 DISALLOW_COPY_AND_ASSIGN(MonitorData); | |
| 117 }; | |
| 118 | |
| 119 } // namespace dart | |
| 120 | |
| 121 #endif // PLATFORM_THREAD_WIN_H_ | |
| OLD | NEW |