fixes #1816
This commit is contained in:
parent
aa8073627f
commit
194b14a182
2 changed files with 39 additions and 3 deletions
|
|
@ -233,6 +233,7 @@ proc tryRecv*[TMsg](c: var TChannel[TMsg]): tuple[dataAvailable: bool,
|
||||||
var q = cast[PRawChannel](addr(c))
|
var q = cast[PRawChannel](addr(c))
|
||||||
if q.mask != ChannelDeadMask:
|
if q.mask != ChannelDeadMask:
|
||||||
if tryAcquireSys(q.lock):
|
if tryAcquireSys(q.lock):
|
||||||
|
if q.count > 0:
|
||||||
llRecv(q, addr(result.msg), cast[PNimType](getTypeInfo(result.msg)))
|
llRecv(q, addr(result.msg), cast[PNimType](getTypeInfo(result.msg)))
|
||||||
result.dataAvailable = true
|
result.dataAvailable = true
|
||||||
releaseSys(q.lock)
|
releaseSys(q.lock)
|
||||||
|
|
|
||||||
35
tests/threads/ttryrecv.nim
Normal file
35
tests/threads/ttryrecv.nim
Normal file
|
|
@ -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)
|
||||||
Loading…
Add table
Add a link
Reference in a new issue