You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					62 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					62 lines
				
				1.5 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const MAX_TIMEOUT = 1000 | ||
|  | 
 | ||
|  | function wait (state, index, expected, timeout, done) { | ||
|  |   const max = Date.now() + timeout | ||
|  |   let current = Atomics.load(state, index) | ||
|  |   if (current === expected) { | ||
|  |     done(null, 'ok') | ||
|  |     return | ||
|  |   } | ||
|  |   let prior = current | ||
|  |   const check = (backoff) => { | ||
|  |     if (Date.now() > max) { | ||
|  |       done(null, 'timed-out') | ||
|  |     } else { | ||
|  |       setTimeout(() => { | ||
|  |         prior = current | ||
|  |         current = Atomics.load(state, index) | ||
|  |         if (current === prior) { | ||
|  |           check(backoff >= MAX_TIMEOUT ? MAX_TIMEOUT : backoff * 2) | ||
|  |         } else { | ||
|  |           if (current === expected) done(null, 'ok') | ||
|  |           else done(null, 'not-equal') | ||
|  |         } | ||
|  |       }, backoff) | ||
|  |     } | ||
|  |   } | ||
|  |   check(1) | ||
|  | } | ||
|  | 
 | ||
|  | // let waitDiffCount = 0
 | ||
|  | function waitDiff (state, index, expected, timeout, done) { | ||
|  |   // const id = waitDiffCount++
 | ||
|  |   // process._rawDebug(`>>> waitDiff ${id}`)
 | ||
|  |   const max = Date.now() + timeout | ||
|  |   let current = Atomics.load(state, index) | ||
|  |   if (current !== expected) { | ||
|  |     done(null, 'ok') | ||
|  |     return | ||
|  |   } | ||
|  |   const check = (backoff) => { | ||
|  |     // process._rawDebug(`${id} ${index} current ${current} expected ${expected}`)
 | ||
|  |     // process._rawDebug('' + backoff)
 | ||
|  |     if (Date.now() > max) { | ||
|  |       done(null, 'timed-out') | ||
|  |     } else { | ||
|  |       setTimeout(() => { | ||
|  |         current = Atomics.load(state, index) | ||
|  |         if (current !== expected) { | ||
|  |           done(null, 'ok') | ||
|  |         } else { | ||
|  |           check(backoff >= MAX_TIMEOUT ? MAX_TIMEOUT : backoff * 2) | ||
|  |         } | ||
|  |       }, backoff) | ||
|  |     } | ||
|  |   } | ||
|  |   check(1) | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = { wait, waitDiff } |