From 91967cbd407254358ab768e74ebcfda8d4a30bc8 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Fri, 22 Nov 2024 10:32:53 -0500 Subject: reliable unicast pseudocode --- doc/runicast.pseudo | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 doc/runicast.pseudo (limited to 'doc/runicast.pseudo') diff --git a/doc/runicast.pseudo b/doc/runicast.pseudo new file mode 100644 index 0000000..1721025 --- /dev/null +++ b/doc/runicast.pseudo @@ -0,0 +1,67 @@ +type Message[T] struct { + seq int + data T +} + +type Ack int + +class sender[T] { + const ackTimeout = 500ms + + var ( + next := 0 // Next sequence number. + unacked := 0 // Sequence number of first unacked message. + sent Queue[Message[T]] + sock Socket + ) + + func send(data) { + msg := Message{next, data} + sock.send(msg) + sent.add(msg) + next++ + } + + thread retransmit() { + wait(ackTimeout) + + if unacked < next { + forall msg in sent s.t. msg.seq >= unacked { + sock.send(msg) + } + } + } + + thread recvAcks() { + ack := sock.receive() + + if ack >= unacked { + unacked = ack+1 + } + + while sent.peek().seq <= ack { + sent.pop() + } + } +} + +class receiver[T] { + var ( + seq := 0 // Next sequence number. + sock Socket + delivered Queue[T] + ) + + thread recv() { + msg := sock.receive() + if msg.seq == seq { + delivered.add(msg.data) + sock.send(Ack(seq)) + seq++ + } + } + + func deliver() T { + return delivered.pop() + } +} -- cgit v1.2.3