summary refs log tree commit diff stats
path: root/tests/parallel/twrong_refcounts.nim
blob: 57e0588a04cdb5f1d6aaa23dc2605bc7442af0fc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
discard """
  output: "Success"
"""

import math, random, 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()