diff options
author | Mathieu Chartier <mathieuc@google.com> | 2013-09-13 13:46:47 -0700 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2013-11-11 15:34:27 -0800 |
commit | 590fee9e8972f872301c2d16a575d579ee564bee (patch) | |
tree | b02db45c72f1911ec896b93379ada0276aea3199 /runtime/lock_word.h | |
parent | 5b70680b8df6d8fa95bb8e1070d0107f3d388940 (diff) | |
download | art-590fee9e8972f872301c2d16a575d579ee564bee.zip art-590fee9e8972f872301c2d16a575d579ee564bee.tar.gz art-590fee9e8972f872301c2d16a575d579ee564bee.tar.bz2 |
Compacting collector.
The compacting collector is currently similar to semispace. It works by
copying objects back and forth between two bump pointer spaces. There
are types of objects which are "non-movable" due to current runtime
limitations. These are Classes, Methods, and Fields.
Bump pointer spaces are a new type of continuous alloc space which have
no lock in the allocation code path. When you allocate from these it uses
atomic operations to increase an index. Traversing the objects in the bump
pointer space relies on Object::SizeOf matching the allocated size exactly.
Runtime changes:
JNI::GetArrayElements returns copies objects if you attempt to get the
backing data of a movable array. For GetArrayElementsCritical, we return
direct backing storage for any types of arrays, but temporarily disable
the GC until the critical region is completed.
Added a new runtime call called VisitObjects, this is used in place of
the old pattern which was flushing the allocation stack and walking
the bitmaps.
Changed image writer to be compaction safe and use object monitor word
for forwarding addresses.
Added a bunch of added SIRTs to ClassLinker, MethodLinker, etc..
TODO: Enable switching allocators, compacting on background, etc..
Bug: 8981901
Change-Id: I3c886fd322a6eef2b99388d19a765042ec26ab99
Diffstat (limited to 'runtime/lock_word.h')
-rw-r--r-- | runtime/lock_word.h | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/runtime/lock_word.h b/runtime/lock_word.h index 1882ae6..d24a3bb 100644 --- a/runtime/lock_word.h +++ b/runtime/lock_word.h @@ -21,6 +21,7 @@ #include <stdint.h> #include "base/logging.h" +#include "utils.h" namespace art { namespace mirror { @@ -73,6 +74,7 @@ class LockWord { kStateThinOrUnlocked = 0, kStateFat = 1, kStateHash = 2, + kStateForwardingAddress = 3, // When the state is kHashCode, the non-state bits hold the hashcode. kHashShift = 0, @@ -86,6 +88,11 @@ class LockWord { (kStateThinOrUnlocked << kStateShift)); } + static LockWord FromForwardingAddress(size_t target) { + DCHECK(IsAligned < 1 << kStateSize>(target)); + return LockWord((target >> kStateSize) | (kStateForwardingAddress << kStateShift)); + } + static LockWord FromHashCode(uint32_t hash_code) { CHECK_LE(hash_code, static_cast<uint32_t>(kHashMask)); return LockWord((hash_code << kHashShift) | (kStateHash << kStateShift)); @@ -96,19 +103,25 @@ class LockWord { kThinLocked, // Single uncontended owner. kFatLocked, // See associated monitor. kHashCode, // Lock word contains an identity hash. + kForwardingAddress, // Lock word contains the forwarding address of an object. }; LockState GetState() const { - uint32_t internal_state = (value_ >> kStateShift) & kStateMask; - if (value_ == 0) { + if (UNLIKELY(value_ == 0)) { return kUnlocked; - } else if (internal_state == kStateThinOrUnlocked) { - return kThinLocked; - } else if (internal_state == kStateHash) { - return kHashCode; } else { - DCHECK_EQ(internal_state, static_cast<uint32_t>(kStateFat)); - return kFatLocked; + uint32_t internal_state = (value_ >> kStateShift) & kStateMask; + switch (internal_state) { + case kStateThinOrUnlocked: + return kThinLocked; + case kStateHash: + return kHashCode; + case kStateForwardingAddress: + return kForwardingAddress; + default: + DCHECK_EQ(internal_state, static_cast<uint32_t>(kStateFat)); + return kFatLocked; + } } } @@ -121,6 +134,9 @@ class LockWord { // Return the Monitor encoded in a fat lock. Monitor* FatLockMonitor() const; + // Return the forwarding address stored in the monitor. + size_t ForwardingAddress() const; + // Default constructor with no lock ownership. LockWord(); |