Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Side by Side Diff: src/harmony-atomics.js

Issue 1208933006: Atomics Futex API (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: feedback Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 (function(global, utils) { 5 (function(global, utils) {
6 6
7 "use strict"; 7 "use strict";
8 8
9 %CheckIsBootstrapping(); 9 %CheckIsBootstrapping();
10 10
11 // ------------------------------------------------------------------- 11 // -------------------------------------------------------------------
12 // Imports 12 // Imports
13 13
14 var GlobalObject = global.Object; 14 var GlobalObject = global.Object;
15 15
16 var MathMax;
17
18 utils.Import(function(from) {
19 MathMax = from.MathMax;
20 });
21
16 // ------------------------------------------------------------------- 22 // -------------------------------------------------------------------
17 23
18 24
19 function CheckSharedTypedArray(sta) { 25 function CheckSharedTypedArray(sta) {
20 if (!%_IsSharedTypedArray(sta)) { 26 if (!%IsSharedTypedArray(sta)) {
21 throw MakeTypeError(kNotSharedTypedArray, sta); 27 throw MakeTypeError(kNotSharedTypedArray, sta);
22 } 28 }
23 } 29 }
24 30
25 function CheckSharedIntegerTypedArray(ia) { 31 function CheckSharedIntegerTypedArray(ia) {
26 if (!%_IsSharedIntegerTypedArray(ia)) { 32 if (!%IsSharedIntegerTypedArray(ia)) {
27 throw MakeTypeError(kNotIntegerSharedTypedArray, ia); 33 throw MakeTypeError(kNotIntegerSharedTypedArray, ia);
28 } 34 }
29 } 35 }
30 36
37 function CheckSharedInteger32TypedArray(ia) {
38 CheckSharedIntegerTypedArray(ia);
39 if (%_ClassOf(ia) !== 'Int32Array') {
40 throw MakeTypeError(kNotInt32SharedTypedArray, ia);
41 }
42 }
43
31 //------------------------------------------------------------------- 44 //-------------------------------------------------------------------
32 45
33 function AtomicsCompareExchangeJS(sta, index, oldValue, newValue) { 46 function AtomicsCompareExchangeJS(sta, index, oldValue, newValue) {
34 CheckSharedTypedArray(sta); 47 CheckSharedTypedArray(sta);
35 index = $toInteger(index); 48 index = $toInteger(index);
36 if (index < 0 || index >= sta.length) { 49 if (index < 0 || index >= sta.length) {
37 return UNDEFINED; 50 return UNDEFINED;
38 } 51 }
39 return %_AtomicsCompareExchange(sta, index, oldValue, newValue); 52 return %_AtomicsCompareExchange(sta, index, oldValue, newValue);
40 } 53 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 if (index < 0 || index >= ia.length) { 121 if (index < 0 || index >= ia.length) {
109 return UNDEFINED; 122 return UNDEFINED;
110 } 123 }
111 return %_AtomicsExchange(ia, index, value); 124 return %_AtomicsExchange(ia, index, value);
112 } 125 }
113 126
114 function AtomicsIsLockFreeJS(size) { 127 function AtomicsIsLockFreeJS(size) {
115 return %_AtomicsIsLockFree(size); 128 return %_AtomicsIsLockFree(size);
116 } 129 }
117 130
131 // Futexes
132
133 function AtomicsFutexWaitJS(ia, index, value, timeout) {
134 CheckSharedInteger32TypedArray(ia);
135 index = $toInteger(index);
136 if (index < 0 || index >= ia.length) {
Jarin 2015/07/10 12:11:39 I believe you should not rely on the length proper
binji 2015/07/14 19:24:37 Done.
137 return UNDEFINED;
138 }
139 if (IS_UNDEFINED(timeout)) {
140 timeout = INFINITY;
141 } else {
142 timeout = $toNumber(timeout);
143 if (NUMBER_IS_NAN(timeout)) {
144 timeout = INFINITY;
145 } else {
146 timeout = MathMax(0, timeout);
147 }
148 }
149 return %AtomicsFutexWait(ia, index, value, timeout);
150 }
151
152 function AtomicsFutexWakeJS(ia, index, count) {
153 CheckSharedInteger32TypedArray(ia);
154 index = $toInteger(index);
155 if (index < 0 || index >= ia.length) {
156 return UNDEFINED;
157 }
158 count = MathMax(0, $toInteger(count));
159 return %AtomicsFutexWake(ia, index, count);
160 }
161
162 function AtomicsFutexWakeOrRequeueJS(ia, index1, count, value, index2) {
163 CheckSharedInteger32TypedArray(ia);
164 index1 = $toInteger(index1);
165 count = MathMax(0, $toInteger(count));
166 value = $toInt32(value);
167 index2 = $toInteger(index2);
168 if (index1 < 0 || index1 >= ia.length || index2 < 0 || index2 >= ia.length) {
169 return UNDEFINED;
170 }
171 return %AtomicsFutexWakeOrRequeue(ia, index1, count, value, index2);
172 }
173
118 // ------------------------------------------------------------------- 174 // -------------------------------------------------------------------
119 175
120 function AtomicsConstructor() {} 176 function AtomicsConstructor() {}
121 177
122 var Atomics = new AtomicsConstructor(); 178 var Atomics = new AtomicsConstructor();
123 179
124 %InternalSetPrototype(Atomics, GlobalObject.prototype); 180 %InternalSetPrototype(Atomics, GlobalObject.prototype);
125 %AddNamedProperty(global, "Atomics", Atomics, DONT_ENUM); 181 %AddNamedProperty(global, "Atomics", Atomics, DONT_ENUM);
126 %FunctionSetInstanceClassName(AtomicsConstructor, 'Atomics'); 182 %FunctionSetInstanceClassName(AtomicsConstructor, 'Atomics');
127 183
128 %AddNamedProperty(Atomics, symbolToStringTag, "Atomics", READ_ONLY | DONT_ENUM); 184 %AddNamedProperty(Atomics, symbolToStringTag, "Atomics", READ_ONLY | DONT_ENUM);
129 185
186 // These must match the values in src/futex-emulation.h
187 utils.InstallConstants(Atomics, [
188 "OK", 0,
189 "NOTEQUAL", -1,
190 "TIMEDOUT", -2,
191 ]);
192
130 utils.InstallFunctions(Atomics, DONT_ENUM, [ 193 utils.InstallFunctions(Atomics, DONT_ENUM, [
131 "compareExchange", AtomicsCompareExchangeJS, 194 "compareExchange", AtomicsCompareExchangeJS,
132 "load", AtomicsLoadJS, 195 "load", AtomicsLoadJS,
133 "store", AtomicsStoreJS, 196 "store", AtomicsStoreJS,
134 "add", AtomicsAddJS, 197 "add", AtomicsAddJS,
135 "sub", AtomicsSubJS, 198 "sub", AtomicsSubJS,
136 "and", AtomicsAndJS, 199 "and", AtomicsAndJS,
137 "or", AtomicsOrJS, 200 "or", AtomicsOrJS,
138 "xor", AtomicsXorJS, 201 "xor", AtomicsXorJS,
139 "exchange", AtomicsExchangeJS, 202 "exchange", AtomicsExchangeJS,
140 "isLockFree", AtomicsIsLockFreeJS, 203 "isLockFree", AtomicsIsLockFreeJS,
204 "futexWait", AtomicsFutexWaitJS,
205 "futexWake", AtomicsFutexWakeJS,
206 "futexWakeOrRequeue", AtomicsFutexWakeOrRequeueJS,
141 ]); 207 ]);
142 208
143 }) 209 })
OLDNEW
« src/futex-emulation.cc ('K') | « src/futex-emulation.cc ('k') | src/isolate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698