Chromium Code Reviews| Index: runtime/vm/simulator_mips.h |
| =================================================================== |
| --- runtime/vm/simulator_mips.h (revision 41298) |
| +++ runtime/vm/simulator_mips.h (working copy) |
| @@ -17,11 +17,12 @@ |
| #endif |
| #include "vm/constants_mips.h" |
| -#include "vm/object.h" |
| namespace dart { |
| class Isolate; |
| +class Mutex; |
| +class RawObject; |
| class SimulatorSetjmpBuffer; |
| class Simulator { |
| @@ -110,6 +111,12 @@ |
| bool fp_return = false, |
| bool fp_args = false); |
| + // Implementation of atomic compare and exchange in the same synchronization |
| + // domain as other synchronization primitive instructions (e.g. ldrex, strex). |
| + static uword CompareExchange(uword* address, |
| + uword compare_value, |
| + uword new_value); |
| + |
| // Runtime and native call support. |
| enum CallKind { |
| kRuntimeCall, |
| @@ -190,6 +197,38 @@ |
| inline double ReadD(uword addr, Instr* instr); |
| inline void WriteD(uword addr, double value, Instr* instr); |
| + // In Dart, there is at most one thread per isolate. |
| + // We keep track of 16 exclusive access address tags across all isolates. |
| + // Since we cannot simulate a native context switch, which clears |
| + // the exclusive access state of the local monitor (using the CLREX |
| + // instruction), we associate the isolate requesting exclusive access to the |
| + // address tag. Multiple isolates requesting exclusive access (using the LDREX |
| + // instruction) to the same address will result in multiple address tags being |
| + // created for the same address, one per isolate. |
| + // At any given time, each isolate is associated to at most one address tag. |
| + static Mutex* exclusive_access_lock_; |
| + static const int kNumAddressTags = 16; |
| + static struct AddressTag { |
| + Isolate* isolate; |
| + uword addr; |
| + } exclusive_access_state_[kNumAddressTags]; |
| + static int next_address_tag_; |
| + |
| + // Synchronization primitives support. |
|
koda
2014/10/27 14:05:11
This code seems currently unused on MIPS, right?
zra
2014/10/27 14:53:12
Agree.
Ivan Posva
2014/10/27 17:58:24
How about atomic_simulator.h?
|
| + void ClearExclusive(); |
| + intptr_t ReadExclusiveW(uword addr, Instr* instr); |
| + intptr_t WriteExclusiveW(uword addr, intptr_t value, Instr* instr); |
|
koda
2014/10/27 14:05:11
Document return value.
|
| + |
| + // Set access to given address to 'exclusive state' for current isolate. |
| + static void SetExclusiveAccess(uword addr); |
| + |
| + // Returns true if the current isolate has exclusive access to given address, |
| + // returns false otherwise. In either case, set access to given address to |
| + // 'open state' for all isolates. |
| + // If given addr is NULL, set access to 'open state' for current |
| + // isolate (CLREX). |
| + static bool HasExclusiveAccessAndOpen(uword addr); |
| + |
| void DoBranch(Instr* instr, bool taken, bool likely); |
| void DoBreak(Instr *instr); |