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