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