tguard1.nim 627 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. when false:
  2. template lock(a, b: ptr Lock; body: stmt) =
  3. if cast[ByteAddress](a) < cast[ByteAddress](b):
  4. pthread_mutex_lock(a)
  5. pthread_mutex_lock(b)
  6. else:
  7. pthread_mutex_lock(b)
  8. pthread_mutex_lock(a)
  9. {.locks: [a, b].}:
  10. try:
  11. body
  12. finally:
  13. pthread_mutex_unlock(a)
  14. pthread_mutex_unlock(b)
  15. type
  16. ProtectedCounter[T] = object
  17. i {.guard: L.}: T
  18. L: int
  19. var
  20. c: ProtectedCounter[int]
  21. c.i = 89
  22. template atomicRead(L, x): untyped =
  23. {.locks: [L].}:
  24. x
  25. proc main =
  26. {.locks: [c.L].}:
  27. inc c.i
  28. discard
  29. echo(atomicRead(c.L, c.i))
  30. main()