Support thread-local variables declared inside procs; fixes #7565
This commit is contained in:
parent
b0d85b0adf
commit
ae5c946a32
4 changed files with 85 additions and 3 deletions
78
tests/threads/tthreadvars.nim
Normal file
78
tests/threads/tthreadvars.nim
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
discard """
|
||||
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
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue