vextoly/cryn

[# atomic exchange: values swap in one indivisible step, and a spinlock
   built from exchange orders two workers around a shared counter #]
make int64 counter
make int64 lock
make int64 probe
make string "\n" nl

define worker
  make int64 k
  set 0
  move k
  write
  mark w
  move k
  read
  compare 100
  jump done when greater-or-equal

  mark again
  set 1
  move lock
  exchange
  compare 0
  jump again when different

  move counter
  read
  add 1
  move counter
  write

  set 0
  move lock
  exchange
  set 0

  move k
  read
  add 1
  move k
  write
  set 0
  jump w

  mark done
  return
end

define main
  set 5
  move probe
  write
  set 9
  move probe
  exchange
  output
  address nl
  output text
  move probe
  read
  output
  address nl
  output text

  spawn worker
  spawn worker
  wait

  move counter
  read
  output
  address nl
  output text
  return
end