summary refs log tree commit diff stats
path: root/tests/threads/tthreadvars.nim
blob: 745e3562c961e1ef639c5f0fd36db22dbf88cb1c (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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
discard """
disabled: i386
output: '''
10
1111
1222
3030303
3060606
6060606
6121212
3030903
3061206
3031503
3061806
5050505
5101010
'''
"""

import typetraits

var tls1 {.threadvar.}: int
var g0: int
var g1 {.global.}: int

proc customInc(x: var int, delta: int) =
  x += delta

customInc(tls1, 10)
echo tls1

proc nonGenericProc: int =
  var local: int
  var nonGenericTls {.threadvar.}: int
  var nonGenericGlobal {.global.}: int
  var nonGenericMixedPragmas {.global, threadvar.}: int

  customInc local, 1000
  customInc nonGenericTls, 1
  customInc nonGenericGlobal, 10
  customInc nonGenericMixedPragmas, 100

  return local + nonGenericTls + nonGenericGlobal + nonGenericMixedPragmas

proc genericProc(T: typedesc): int =
  var local: int
  var genericTls {.threadvar.}: int
  var genericGlobal {.global.}: int
  var genericMixedPragmas {.global, threadvar.}: int

  customInc local, T.name.len * 1000000
  customInc genericTls, T.name.len * 1
  customInc genericGlobal, T.name.len * 100
  customInc genericMixedPragmas, T.name.len * 10000

  return local + genericTls + genericGlobal + genericMixedPragmas

echo nonGenericProc()
echo nonGenericProc()

echo genericProc(int)
echo genericProc(int)

echo genericProc(string)
echo genericProc(string)

proc echoInThread[T]() {.thread.} =
  echo genericProc(T)
  echo genericProc(T)

proc newEchoThread(T: typedesc) =
  var t: Thread[void]
  createThread(t, echoInThread[T])
  joinThreads(t)

newEchoThread int
newEchoThread int
newEchoThread float