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 }
							 |