Remove bitmap lock from checkpoint root marking.

Should reduce how long each mutator is paused during the checkpoint
root marking since there is no more contention on the heap bitmap
lock.

Change-Id: I6048d785952e1da807d74eeea1d9958090a22b73
diff --git a/src/gc/mark_sweep.h b/src/gc/mark_sweep.h
index 2297ce1..98445d4 100644
--- a/src/gc/mark_sweep.h
+++ b/src/gc/mark_sweep.h
@@ -237,6 +237,8 @@
   static void MarkObjectCallback(const Object* root, void* arg)
       EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_);
 
+  static void MarkRootParallelCallback(const Object* root, void* arg);
+
   // Marks an object.
   void MarkObject(const Object* obj)
       EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_);
@@ -260,23 +262,17 @@
       SHARED_LOCKS_REQUIRED(Locks::heap_bitmap_lock_,
                             Locks::mutator_lock_);
 
-  static void ScanDirtyCardCallback(Object* obj, void* arg)
-      EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
-
   void MarkObjectNonNull(const Object* obj, bool check_finger)
       EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_);
 
+  void MarkObjectNonNullParallel(const Object* obj, bool check_finger);
+
   bool MarkLargeObject(const Object* obj)
       EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_);
 
   // Returns true if we need to add obj to a mark stack.
   bool MarkObjectParallel(const Object* obj) NO_THREAD_SAFETY_ANALYSIS;
 
-  static void ScanBitmapCallback(Object* obj, void* finger, void* arg)
-      EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_)
-      SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
-
   static void SweepCallback(size_t num_ptrs, Object** ptrs, void* arg)
       EXCLUSIVE_LOCKS_REQUIRED(Locks::heap_bitmap_lock_);
 
@@ -295,6 +291,9 @@
   void VerifyRoots()
       NO_THREAD_SAFETY_ANALYSIS;
 
+  // Expand mark stack to 2x its current size. Thread safe.
+  void ExpandMarkStack();
+
   static void VerifyRootCallback(const Object* root, void* arg, size_t vreg,
                                  const AbstractMethod* method);
 
@@ -462,7 +461,8 @@
   AtomicInteger reference_count_;
 
   UniquePtr<Barrier> gc_barrier_;
-  Mutex large_object_lock_;
+  Mutex large_object_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
+  Mutex mark_stack_expand_lock_ DEFAULT_MUTEX_ACQUIRED_AFTER;
 
   friend class AddIfReachesAllocSpaceVisitor; // Used by mod-union table.
   friend class CheckBitmapVisitor;