123456789101112131415161718192021222324252627282930313233343536373839404142 |
- discard """
- output: "90"
- """
- when false:
- template lock(a, b: ptr Lock; body: stmt) =
- if cast[ByteAddress](a) < cast[ByteAddress](b):
- pthread_mutex_lock(a)
- pthread_mutex_lock(b)
- else:
- pthread_mutex_lock(b)
- pthread_mutex_lock(a)
- {.locks: [a, b].}:
- try:
- body
- finally:
- pthread_mutex_unlock(a)
- pthread_mutex_unlock(b)
- type
- ProtectedCounter[T] = object
- i {.guard: L.}: T
- L: int
- var
- c: ProtectedCounter[int]
- c.i = 89
- template atomicRead(L, x): untyped =
- {.locks: [L].}:
- x
- proc main =
- {.locks: [c.L].}:
- inc c.i
- discard
- echo(atomicRead(c.L, c.i))
- main()
|