Function receiveMessage [src]

Prototype

pub fn receiveMessage(s: *Server) !InMessage.Header

Parameters

s: *Server

Source

pub fn receiveMessage(s: *Server) !InMessage.Header { const Header = InMessage.Header; const fifo = &s.receive_fifo; var last_amt_zero = false; while (true) { const buf = fifo.readableSlice(0); assert(fifo.readableLength() == buf.len); if (buf.len >= @sizeOf(Header)) { const header: *align(1) const Header = @ptrCast(buf[0..@sizeOf(Header)]); const bytes_len = bswap(header.bytes_len); const tag = bswap(header.tag); if (buf.len - @sizeOf(Header) >= bytes_len) { fifo.discard(@sizeOf(Header)); return .{ .tag = tag, .bytes_len = bytes_len, }; } else { const needed = bytes_len - (buf.len - @sizeOf(Header)); const write_buffer = try fifo.writableWithSize(needed); const amt = try s.in.read(write_buffer); fifo.update(amt); continue; } } const write_buffer = try fifo.writableWithSize(256); const amt = try s.in.read(write_buffer); fifo.update(amt); if (amt == 0) { if (last_amt_zero) return error.BrokenPipe; last_amt_zero = true; } } }