// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef VM_ATOMIC_SIMULATOR_H_
#define VM_ATOMIC_SIMULATOR_H_

#if !defined VM_ATOMIC_H_
#error Do not include atomic_simulator.h directly. Use atomic.h instead.
#endif

namespace dart {

#if defined(USING_SIMULATOR)
// Forward atomic operations to the simulator if the simulator is active.
inline uword AtomicOperations::CompareAndSwapWord(uword* ptr,
                                                  uword old_value,
                                                  uword new_value) {
  return Simulator::CompareExchange(ptr, old_value, new_value);
}


inline uint32_t AtomicOperations::CompareAndSwapUint32(uint32_t* ptr,
                                                       uint32_t old_value,
                                                       uint32_t new_value) {
  return Simulator::CompareExchangeUint32(ptr, old_value, new_value);
}
#endif  // defined(USING_SIMULATOR)

}  // namespace dart

#endif  // VM_ATOMIC_SIMULATOR_H_
