fixes a serious codegen bug that caused to emit wrong barriers in rare cases
This commit is contained in:
parent
5cea6807e1
commit
89cbf092b2
3 changed files with 71 additions and 13 deletions
53
tests/parallel/twrong_refcounts.nim
Normal file
53
tests/parallel/twrong_refcounts.nim
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
discard """
|
||||
output: "Success"
|
||||
"""
|
||||
|
||||
import math, threadPool
|
||||
|
||||
# ---
|
||||
|
||||
type
|
||||
Person = object
|
||||
age: int
|
||||
friend: ref Person
|
||||
|
||||
var
|
||||
people: seq[ref Person] = @[]
|
||||
|
||||
proc newPerson(age:int): ref Person =
|
||||
result.new()
|
||||
result.age = age
|
||||
|
||||
proc greet(p:Person) =
|
||||
#echo p.age, ", ", p.friend.age
|
||||
p.friend.age += 1
|
||||
|
||||
# ---
|
||||
|
||||
proc setup =
|
||||
for i in 0 .. <20:
|
||||
people.add newPerson(i + 1)
|
||||
for i in 0 .. <20:
|
||||
people[i].friend = people[random(20)]
|
||||
|
||||
proc update =
|
||||
var countA: array[20, int]
|
||||
var countB: array[20, int]
|
||||
|
||||
for i, p in people:
|
||||
countA[i] = getRefCount(p)
|
||||
parallel:
|
||||
for i in 0 .. people.high:
|
||||
spawn greet(people[i][])
|
||||
for i, p in people:
|
||||
countB[i] = getRefCount(p)
|
||||
|
||||
for i in 0 .. <20:
|
||||
doAssert countA[i] == countB[i]
|
||||
echo "Success"
|
||||
|
||||
# ---
|
||||
|
||||
when isMainModule:
|
||||
setup()
|
||||
update()
|
||||
Loading…
Add table
Add a link
Reference in a new issue