| Index: src/runtime/runtime-futex.cc
|
| diff --git a/src/runtime/runtime-futex.cc b/src/runtime/runtime-futex.cc
|
| index 5c2106e6859c4ea8aed6dda846ab2eb6405a60bb..b6582ffc7f937318e3be5666381c664fc73b9e14 100644
|
| --- a/src/runtime/runtime-futex.cc
|
| +++ b/src/runtime/runtime-futex.cc
|
| @@ -17,6 +17,44 @@
|
| namespace v8 {
|
| namespace internal {
|
|
|
| +RUNTIME_FUNCTION(Runtime_AtomicsWait) {
|
| + HandleScope scope(isolate);
|
| + DCHECK_EQ(4, args.length());
|
| + CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, sta, 0);
|
| + CONVERT_SIZE_ARG_CHECKED(index, 1);
|
| + CONVERT_INT32_ARG_CHECKED(value, 2);
|
| + CONVERT_DOUBLE_ARG_CHECKED(timeout, 3);
|
| + CHECK(sta->GetBuffer()->is_shared());
|
| + CHECK_LT(index, NumberToSize(sta->length()));
|
| + CHECK_EQ(sta->type(), kExternalInt32Array);
|
| + CHECK(timeout == V8_INFINITY || !std::isnan(timeout));
|
| +
|
| + if (!isolate->allow_atomics_wait()) {
|
| + THROW_NEW_ERROR_RETURN_FAILURE(
|
| + isolate, NewTypeError(MessageTemplate::kAtomicsWaitNotAllowed));
|
| + }
|
| +
|
| + Handle<JSArrayBuffer> array_buffer = sta->GetBuffer();
|
| + size_t addr = (index << 2) + NumberToSize(sta->byte_offset());
|
| +
|
| + return FutexEmulation::Wait(isolate, array_buffer, addr, value, timeout);
|
| +}
|
| +
|
| +RUNTIME_FUNCTION(Runtime_AtomicsWake) {
|
| + HandleScope scope(isolate);
|
| + DCHECK_EQ(3, args.length());
|
| + CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, sta, 0);
|
| + CONVERT_SIZE_ARG_CHECKED(index, 1);
|
| + CONVERT_UINT32_ARG_CHECKED(count, 2);
|
| + CHECK(sta->GetBuffer()->is_shared());
|
| + CHECK_LT(index, NumberToSize(sta->length()));
|
| + CHECK_EQ(sta->type(), kExternalInt32Array);
|
| +
|
| + Handle<JSArrayBuffer> array_buffer = sta->GetBuffer();
|
| + size_t addr = (index << 2) + NumberToSize(sta->byte_offset());
|
| +
|
| + return FutexEmulation::Wake(isolate, array_buffer, addr, count);
|
| +}
|
|
|
| RUNTIME_FUNCTION(Runtime_AtomicsNumWaitersForTesting) {
|
| HandleScope scope(isolate);
|
|
|