Fix Genode error propagation

This commit is contained in:
Ehmry - 2018-09-12 19:24:37 +02:00
parent c8c19f8657
commit 3006147fa7
6 changed files with 20 additions and 13 deletions

View File

@ -20,4 +20,4 @@ backend = "cpp"
requires "nim >= 0.18.1", "dagfs", "genode"
task genode, "Build for Genode":
exec "nimble build --os:genode -d:posix -d:tcpdebug"
exec "nimble build --os:genode -d:posix"

View File

@ -119,7 +119,7 @@ proc fendGetBuffer(s: DagfsStore; cid: Cid; buf: pointer; len: Natural): int =
let pktBuf = fend.cpp.packetContent ack
assert(not pktBuf.isNil, "ack packet has nil content")
assert(ack.len <= len)
assert(ack.len > 0)
assert(0 < ack.len)
result = ack.len
copyMem(buf, pktBuf, result)
if pkt.size > 0:
@ -189,12 +189,13 @@ proc newDagfsBackend*(env: GenodeEnv; store: DagfsStore; label = ""; bufferSize
let
buf = bend.cpp.packetContent(pkt)
cid = pkt.cid
case pkt.operation
case pkt.op
of GET:
pkt.setOp(PUT)
try:
let n = store.getBuffer(cid, buf, pkt.size)
pkt.setLen(n)
bend.cpp.submitPacket(pkt, cid.toHex, PUT)
bend.cpp.submitPacket(pkt)
except MissingChunk:
pkt.setError(MISSING)
bend.cpp.submitPacket(pkt)

View File

@ -94,7 +94,7 @@ proc isPending(fend: Frontend; cid: Cid): bool =
proc isPending(fend: Session; cid: Cid; op: DagfsOpcode): bool =
if fend.cpp.packetAvail and fend.cpp.readyToAck:
let pkt = fend.cpp.peekPacket()
result = (pkt.operation == op and cid == pkt.cid)
result = (pkt.op == op and cid == pkt.cid)
proc processPacket(backends: Backends; fend: Frontend): bool =
if backends.len < 1:
@ -106,7 +106,7 @@ proc processPacket(backends: Backends; fend: Frontend): bool =
let
pkt = fend.cpp.peekPacket
cid = pkt.cid
op = pkt.operation
op = pkt.op
case op
of GET:
for bend in backends.values:
@ -129,13 +129,13 @@ proc processPacket(frontends: Frontends; bend: Backend): bool =
let
pkt = bend.cpp.getPacket
cid = pkt.cid
op = pkt.operation
op = pkt.op
case op
of PUT:
assert(0 < pkt.len)
for fend in frontends.values:
if fend.isPending(cid, GET):
var ack = fend.cpp.getPacket
ack.setError(pkt.error)
if ack.size < pkt.len:
ack.setError(OVERSIZE)
fend.cpp.acknowledgePacket(ack)
@ -148,7 +148,7 @@ proc processPacket(frontends: Frontends; bend: Backend): bool =
if fend.isPending(cid, PUT):
fend.cpp.acknowledgePacket(fend.cpp.getPacket, cid, IDLE)
else:
echo "invalid backend packet operation from ", bend.label
echo "invalid ", op, " packet from backend ", bend.label
bend.idle.addLast pkt
true

View File

@ -38,7 +38,12 @@ proc cid*(p: DagfsPacket): Cid = parseCid $p.cidStr
proc setCid*(p: var DagfsPacket; cid: cstring) {.importcpp: "#.cid(@)".}
proc setCid*(p: var DagfsPacket; cid: Cid) = p.setCid(cid.toHex())
proc operation*(pkt: DagfsPacket): DagfsOpcode {.importcpp.}
proc op*(pkt: DagfsPacket): DagfsOpcode {.importcpp.}
proc setOp*(p: var DagfsPacket; op: DagfsOpcode) {.importcpp: "op".}
proc len*(pkt: DagfsPacket): csize {.importcpp: "length".}
## Logical packet length.
proc setLen*(pkt: var DagfsPacket; len: int) {.importcpp: "length".}

View File

@ -71,13 +71,14 @@ struct Dagfs::Packet final : Genode::Packet_descriptor
{ }
Cid const &cid() const { return _cid; }
Opcode operation() const { return _op; }
Opcode op() const { return _op; }
size_t length() const { return _length; }
Error error() const { return _err; }
void cid(char const *hex) { _cid = Cid(hex); }
void op(Opcode o) { _op = o; }
void length(size_t len) { _length = len; }
void error(Error err) { _err = err; }
void error(Error err) { _err = err; }
};

View File

@ -44,7 +44,7 @@ proc getBuffer*(s: DagfsStore; cid: Cid; buf: pointer; len: Natural): int =
assert(0 < len)
assert(not s.getBufferImpl.isNil)
result = s.getBufferImpl(s, cid, buf, len)
assert(result > 0)
assert(0 < result)
proc get*(s: DagfsStore; cid: Cid; result: var string) =
## Retrieve a raw block from the store.