mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 19:53:50 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // Copyright (C) 2017 Mozilla Corporation.  All rights reserved.
 | |
| // This code is governed by the BSD license found in the LICENSE file.
 | |
| 
 | |
| /*---
 | |
| esid: sec-atomics.wait
 | |
| description: >
 | |
|   Test that Atomics.wait returns the right result when it timed out and that
 | |
|   the time to time out is reasonable.
 | |
|   info: |
 | |
|     17. Let awoken be Suspend(WL, W, t).
 | |
|     18. If awoken is true, then
 | |
|       a. Assert: W is not on the list of waiters in WL.
 | |
|     19. Else,
 | |
|       a.Perform RemoveWaiter(WL, W).
 | |
| includes: [atomicsHelper.js]
 | |
| features: [Atomics, SharedArrayBuffer, TypedArray]
 | |
| ---*/
 | |
| 
 | |
| const RUNNING = 1;
 | |
| const TIMEOUT = $262.agent.timeouts.small;
 | |
| 
 | |
| const i32a = new Int32Array(
 | |
|   new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * 4)
 | |
| );
 | |
| 
 | |
| $262.agent.start(`
 | |
|   $262.agent.receiveBroadcast(function(sab) {
 | |
|     const i32a = new Int32Array(sab);
 | |
|     Atomics.add(i32a, ${RUNNING}, 1);
 | |
| 
 | |
|     const before = $262.agent.monotonicNow();
 | |
|     const unpark = Atomics.wait(i32a, 0, 0, ${TIMEOUT});
 | |
|     const duration = $262.agent.monotonicNow() - before;
 | |
| 
 | |
|     $262.agent.report(duration);
 | |
|     $262.agent.report(unpark);
 | |
|     $262.agent.leaving();
 | |
|   });
 | |
| `);
 | |
| 
 | |
| $262.agent.safeBroadcast(i32a);
 | |
| $262.agent.waitUntil(i32a, RUNNING, 1);
 | |
| 
 | |
| // Try to yield control to ensure the agent actually started to wait.
 | |
| $262.agent.tryYield();
 | |
| 
 | |
| // NO OPERATION OCCURS HERE!
 | |
| 
 | |
| const lapse = $262.agent.getReport();
 | |
| assert(
 | |
|   lapse >= TIMEOUT,
 | |
|   'The result of `(lapse >= TIMEOUT)` is true'
 | |
| );
 | |
| assert.sameValue(
 | |
|   $262.agent.getReport(),
 | |
|   'timed-out',
 | |
|   '$262.agent.getReport() returns "timed-out"'
 | |
| );
 | |
| assert.sameValue(Atomics.notify(i32a, 0), 0, 'Atomics.notify(i32a, 0) returns 0');
 |