OnDataGenerationEvent(Data d) - queue.add(d, {state => PENDING_TRANSFER} ) process(queue) OnDataReceivedEvent(Data reply) - lock(queue) { d = dequeue() if reply.status = OK then # no Op else # status is NAK # add back to front of queue queue.add_front(d,{state => PENDING_TRANSFER}) endif } process(queue) sub process(queue) lock(queue ){ d = dequeue(queue) if d.state = PENDING_TRANSFER then transfer(d) queue.add(d, {state => PENDING_REPLY } ) endif }