diff options
author | Araq <rumpf_a@web.de> | 2015-01-02 03:32:45 +0100 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2015-01-02 03:32:45 +0100 |
commit | 194b14a1827e5c812e5a149070ddebc27a2966f2 (patch) | |
tree | 37ec7f8a1332159ab0552142a84901b34a1c984a | |
parent | aa8073627faadbda8c51c32a88a797ce83c1ef69 (diff) | |
download | Nim-194b14a1827e5c812e5a149070ddebc27a2966f2.tar.gz |
fixes #1816
-rw-r--r-- | lib/system/channels.nim | 7 | ||||
-rw-r--r-- | tests/threads/ttryrecv.nim | 35 |
2 files changed, 39 insertions, 3 deletions
diff --git a/lib/system/channels.nim b/lib/system/channels.nim index 3e5ca0795..d07d6eae1 100644 --- a/lib/system/channels.nim +++ b/lib/system/channels.nim @@ -232,9 +232,10 @@ proc tryRecv*[TMsg](c: var TChannel[TMsg]): tuple[dataAvailable: bool, ## it returns ``(false, default(msg))``. var q = cast[PRawChannel](addr(c)) if q.mask != ChannelDeadMask: - if tryAcquireSys(q.lock): - llRecv(q, addr(result.msg), cast[PNimType](getTypeInfo(result.msg))) - result.dataAvailable = true + if tryAcquireSys(q.lock): + if q.count > 0: + llRecv(q, addr(result.msg), cast[PNimType](getTypeInfo(result.msg))) + result.dataAvailable = true releaseSys(q.lock) proc peek*[TMsg](c: var TChannel[TMsg]): int = diff --git a/tests/threads/ttryrecv.nim b/tests/threads/ttryrecv.nim new file mode 100644 index 000000000..acccf182c --- /dev/null +++ b/tests/threads/ttryrecv.nim @@ -0,0 +1,35 @@ +discard """ + outputsub: "channel is empty" +""" + +# bug #1816 + +from math import random +from os import sleep + +type PComm = ptr TChannel[int] + +proc doAction(outC: PComm) {.thread.} = + for i in 0.. <5: + sleep(random(100)) + send(outC[], i) + +var + thr: TThread[PComm] + chan: TChannel[int] + +open(chan) +createThread[PComm](thr, doAction, addr(chan)) + +while true: + let (flag, x) = tryRecv(chan) + if flag: + echo("received from chan: " & $x) + else: + echo "channel is empty" + break + +echo "Finished listening" + +joinThread(thr) +close(chan) |