SendDataEvent(Data toSend) { $toSend->serial = $serial_number_counter++; Enqueue(toSend); if ( !defined($block_awaiting_reply) ) { $block_awaiting_reply = Dequeue() send($block_awaiting_reply); } } OnDataReceivedEvent(Data reply) { if ( defined($block_awaiting_reply)) { if ((reply->status == OK) && (reply->serial == $block_awaiting_reply->serial)) { // OK response received to last block sent $block_awaiting_reply = undef; // optional } else { // block was rejected – send it again resend($block_awaiting_reply); return; } $block_awaiting_reply = dequeue(); // should be non-blocking if ($block_awaiting_reply != undef) { send($block_awaiting_reply); } }