AtomicReference = if defined? Truffle
                    Rubinius::AtomicReference
                  else
                    require 'concurrent'
                    Concurrent::AtomicReference
                  end


class Store
  attr_accessor :flag1, :flag2
end

def test(test, from, to, store)
  was = test.get_and_set to
  puts "#{from}>#{to} #{was.inspect} #{store.inspect}" unless was == from
end

while true
  store = Store.new

  store.flag1 = store.flag2 = false

  test = AtomicReference.new
  test.set 0

  t1 = Thread.new(store) do |store|
    1_000_000.times do
      store.flag1 = true
      if store.flag2 == true
      else
        test test, 0, 1, store
        Thread.pass
        test test, 1, 0, store
      end
      store.flag1 = false
      # print '.'
    end
  end

  t2 = Thread.new(store) do |store|
    1_000_000.times do
      store.flag2 = true
      if store.flag1 == true
      else
        test test, 0, 2, store
        Thread.pass
        test test, 2, 0, store
      end
      store.flag2 = false
      # print ','
    end
  end

  t1.join
  t2.join

end
