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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/arguments.h" | 7 #include "src/arguments.h" |
8 #include "src/base/macros.h" | 8 #include "src/base/macros.h" |
9 #include "src/base/platform/mutex.h" | 9 #include "src/base/platform/mutex.h" |
10 #include "src/conversions-inl.h" | 10 #include "src/conversions-inl.h" |
11 #include "src/factory.h" | 11 #include "src/factory.h" |
12 | 12 |
13 // Implement Atomic accesses to SharedArrayBuffers as defined in the | 13 // Implement Atomic accesses to SharedArrayBuffers as defined in the |
14 // SharedArrayBuffer draft spec, found here | 14 // SharedArrayBuffer draft spec, found here |
15 // https://docs.google.com/document/d/1NDGA_gZJ7M7w1Bh8S0AoDyEqwDdRh4uSoTPSNn77P
Fk | 15 // https://docs.google.com/document/d/1NDGA_gZJ7M7w1Bh8S0AoDyEqwDdRh4uSoTPSNn77P
Fk |
16 | 16 |
17 namespace v8 { | 17 namespace v8 { |
18 namespace internal { | 18 namespace internal { |
19 | 19 |
20 namespace { | 20 namespace { |
21 | 21 |
| 22 // Assume that 32-bit architectures don't have 64-bit atomic ops. |
| 23 // TODO(binji): can we do better here? |
| 24 #if V8_TARGET_ARCH_64_BIT && V8_HOST_ARCH_64_BIT |
| 25 |
| 26 #define ATOMICS_REQUIRE_LOCK_64_BIT 0 |
| 27 |
| 28 inline bool AtomicIsLockFree(uint32_t size) { |
| 29 return size == 1 || size == 2 || size == 4 || size == 8; |
| 30 } |
| 31 |
| 32 #else |
| 33 |
| 34 #define ATOMICS_REQUIRE_LOCK_64_BIT 1 |
| 35 |
| 36 inline bool AtomicIsLockFree(uint32_t size) { |
| 37 return size == 1 || size == 2 || size == 4; |
| 38 } |
| 39 |
| 40 #endif |
| 41 |
22 #if V8_CC_GNU | 42 #if V8_CC_GNU |
23 | 43 |
24 template <typename T> | 44 template <typename T> |
25 inline T CompareExchangeSeqCst(T* p, T oldval, T newval) { | 45 inline T CompareExchangeSeqCst(T* p, T oldval, T newval) { |
26 (void)__atomic_compare_exchange_n(p, &oldval, newval, 0, __ATOMIC_SEQ_CST, | 46 (void)__atomic_compare_exchange_n(p, &oldval, newval, 0, __ATOMIC_SEQ_CST, |
27 __ATOMIC_SEQ_CST); | 47 __ATOMIC_SEQ_CST); |
28 return oldval; | 48 return oldval; |
29 } | 49 } |
30 | 50 |
31 template <typename T> | 51 template <typename T> |
(...skipping 787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 UNREACHABLE(); | 839 UNREACHABLE(); |
820 return isolate->heap()->undefined_value(); | 840 return isolate->heap()->undefined_value(); |
821 } | 841 } |
822 | 842 |
823 | 843 |
824 RUNTIME_FUNCTION(Runtime_AtomicsIsLockFree) { | 844 RUNTIME_FUNCTION(Runtime_AtomicsIsLockFree) { |
825 HandleScope scope(isolate); | 845 HandleScope scope(isolate); |
826 DCHECK(args.length() == 1); | 846 DCHECK(args.length() == 1); |
827 CONVERT_NUMBER_ARG_HANDLE_CHECKED(size, 0); | 847 CONVERT_NUMBER_ARG_HANDLE_CHECKED(size, 0); |
828 uint32_t usize = NumberToUint32(*size); | 848 uint32_t usize = NumberToUint32(*size); |
829 | 849 return isolate->heap()->ToBoolean(AtomicIsLockFree(usize)); |
830 return Runtime::AtomicIsLockFree(usize) ? isolate->heap()->true_value() | |
831 : isolate->heap()->false_value(); | |
832 } | 850 } |
833 } | 851 } |
834 } // namespace v8::internal | 852 } // namespace v8::internal |
OLD | NEW |