OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project 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 "src/futex-emulation.h" | 5 #include "src/futex-emulation.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "src/base/macros.h" | 9 #include "src/base/macros.h" |
10 #include "src/base/platform/time.h" | 10 #include "src/base/platform/time.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 tail_ = node->prev_; | 68 tail_ = node->prev_; |
69 } | 69 } |
70 | 70 |
71 node->prev_ = node->next_ = nullptr; | 71 node->prev_ = node->next_ = nullptr; |
72 } | 72 } |
73 | 73 |
74 | 74 |
75 Object* FutexEmulation::Wait(Isolate* isolate, | 75 Object* FutexEmulation::Wait(Isolate* isolate, |
76 Handle<JSArrayBuffer> array_buffer, size_t addr, | 76 Handle<JSArrayBuffer> array_buffer, size_t addr, |
77 int32_t value, double rel_timeout_ms) { | 77 int32_t value, double rel_timeout_ms) { |
78 DCHECK(addr < NumberToSize(isolate, array_buffer->byte_length())); | 78 DCHECK(addr < NumberToSize(array_buffer->byte_length())); |
79 | 79 |
80 void* backing_store = array_buffer->backing_store(); | 80 void* backing_store = array_buffer->backing_store(); |
81 int32_t* p = | 81 int32_t* p = |
82 reinterpret_cast<int32_t*>(static_cast<int8_t*>(backing_store) + addr); | 82 reinterpret_cast<int32_t*>(static_cast<int8_t*>(backing_store) + addr); |
83 | 83 |
84 base::LockGuard<base::Mutex> lock_guard(mutex_.Pointer()); | 84 base::LockGuard<base::Mutex> lock_guard(mutex_.Pointer()); |
85 | 85 |
86 if (*p != value) { | 86 if (*p != value) { |
87 return isolate->heap()->not_equal(); | 87 return isolate->heap()->not_equal(); |
88 } | 88 } |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 wait_list_.Pointer()->RemoveNode(node); | 184 wait_list_.Pointer()->RemoveNode(node); |
185 node->waiting_ = false; | 185 node->waiting_ = false; |
186 | 186 |
187 return result; | 187 return result; |
188 } | 188 } |
189 | 189 |
190 | 190 |
191 Object* FutexEmulation::Wake(Isolate* isolate, | 191 Object* FutexEmulation::Wake(Isolate* isolate, |
192 Handle<JSArrayBuffer> array_buffer, size_t addr, | 192 Handle<JSArrayBuffer> array_buffer, size_t addr, |
193 int num_waiters_to_wake) { | 193 int num_waiters_to_wake) { |
194 DCHECK(addr < NumberToSize(isolate, array_buffer->byte_length())); | 194 DCHECK(addr < NumberToSize(array_buffer->byte_length())); |
195 | 195 |
196 int waiters_woken = 0; | 196 int waiters_woken = 0; |
197 void* backing_store = array_buffer->backing_store(); | 197 void* backing_store = array_buffer->backing_store(); |
198 | 198 |
199 base::LockGuard<base::Mutex> lock_guard(mutex_.Pointer()); | 199 base::LockGuard<base::Mutex> lock_guard(mutex_.Pointer()); |
200 FutexWaitListNode* node = wait_list_.Pointer()->head_; | 200 FutexWaitListNode* node = wait_list_.Pointer()->head_; |
201 while (node && num_waiters_to_wake > 0) { | 201 while (node && num_waiters_to_wake > 0) { |
202 if (backing_store == node->backing_store_ && addr == node->wait_addr_) { | 202 if (backing_store == node->backing_store_ && addr == node->wait_addr_) { |
203 node->waiting_ = false; | 203 node->waiting_ = false; |
204 node->cond_.NotifyOne(); | 204 node->cond_.NotifyOne(); |
205 --num_waiters_to_wake; | 205 --num_waiters_to_wake; |
206 waiters_woken++; | 206 waiters_woken++; |
207 } | 207 } |
208 | 208 |
209 node = node->next_; | 209 node = node->next_; |
210 } | 210 } |
211 | 211 |
212 return Smi::FromInt(waiters_woken); | 212 return Smi::FromInt(waiters_woken); |
213 } | 213 } |
214 | 214 |
215 | 215 |
216 Object* FutexEmulation::NumWaitersForTesting(Isolate* isolate, | 216 Object* FutexEmulation::NumWaitersForTesting(Isolate* isolate, |
217 Handle<JSArrayBuffer> array_buffer, | 217 Handle<JSArrayBuffer> array_buffer, |
218 size_t addr) { | 218 size_t addr) { |
219 DCHECK(addr < NumberToSize(isolate, array_buffer->byte_length())); | 219 DCHECK(addr < NumberToSize(array_buffer->byte_length())); |
220 void* backing_store = array_buffer->backing_store(); | 220 void* backing_store = array_buffer->backing_store(); |
221 | 221 |
222 base::LockGuard<base::Mutex> lock_guard(mutex_.Pointer()); | 222 base::LockGuard<base::Mutex> lock_guard(mutex_.Pointer()); |
223 | 223 |
224 int waiters = 0; | 224 int waiters = 0; |
225 FutexWaitListNode* node = wait_list_.Pointer()->head_; | 225 FutexWaitListNode* node = wait_list_.Pointer()->head_; |
226 while (node) { | 226 while (node) { |
227 if (backing_store == node->backing_store_ && addr == node->wait_addr_ && | 227 if (backing_store == node->backing_store_ && addr == node->wait_addr_ && |
228 node->waiting_) { | 228 node->waiting_) { |
229 waiters++; | 229 waiters++; |
230 } | 230 } |
231 | 231 |
232 node = node->next_; | 232 node = node->next_; |
233 } | 233 } |
234 | 234 |
235 return Smi::FromInt(waiters); | 235 return Smi::FromInt(waiters); |
236 } | 236 } |
237 | 237 |
238 } // namespace internal | 238 } // namespace internal |
239 } // namespace v8 | 239 } // namespace v8 |
OLD | NEW |