fixes #1816
This commit is contained in:
parent
aa8073627f
commit
194b14a182
2 changed files with 39 additions and 3 deletions
|
|
@ -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 =
|
||||
|
|
|
|||
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