class Concurrent::Promises::BlockedPromise

def self.new_blocked_by2(blocker1, blocker2, *args, &block)

def self.new_blocked_by2(blocker1, blocker2, *args, &block)
  blocker_delayed1 = blocker1.promise.delayed_because
  blocker_delayed2 = blocker2.promise.delayed_because
  delayed          = if blocker_delayed1 && blocker_delayed2
                       # TODO (pitr-ch 23-Dec-2016): use arrays when we know it will not grow (only flat adds delay)
                       LockFreeStack.of2(blocker_delayed1, blocker_delayed2)
                     else
                       blocker_delayed1 || blocker_delayed2
                     end
  promise          = new(delayed, 2, *args, &block)
  blocker1.add_callback_notify_blocked promise, 0
  blocker2.add_callback_notify_blocked promise, 1
  promise
end