Refactor GC to have a class for each different type of GC.

Added a seperate files for mark sweep, partial mark sweep,
sticky mark sweep.

Added a common superclass for GC.

Added additional statistics for each GC.

Moved main garbage collection code away from Heap.cc.

Change-Id: Ida0021ab2f740fc8228bbbf4d43cd9bc56b4ba46
diff --git a/src/gc/sticky_mark_sweep.cc b/src/gc/sticky_mark_sweep.cc
new file mode 100644
index 0000000..23196fd
--- /dev/null
+++ b/src/gc/sticky_mark_sweep.cc
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "large_object_space.h"
+#include "space.h"
+#include "sticky_mark_sweep.h"
+
+namespace art {
+  StickyMarkSweep::StickyMarkSweep(Heap* heap, bool is_concurrent)
+      : PartialMarkSweep(heap, is_concurrent) {
+    cumulative_timings_.SetName(GetName());
+  }
+
+  StickyMarkSweep::~StickyMarkSweep() {
+
+  }
+
+  void StickyMarkSweep::BindBitmaps() {
+    PartialMarkSweep::BindBitmaps();
+
+    Spaces& spaces = GetHeap()->GetSpaces();
+    WriterMutexLock mu(Thread::Current(), *Locks::heap_bitmap_lock_);
+    // For sticky GC, we want to bind the bitmaps of both the zygote space and the alloc space.
+    // This lets us start with the mark bitmap of the previous garbage collection as the current
+    // mark bitmap of the alloc space. After the sticky GC finishes, we then unbind the bitmaps,
+    // making it so that the live bitmap of the alloc space is contains the newly marked objects
+    // from the sticky GC.
+    for (Spaces::iterator it = spaces.begin(); it != spaces.end(); ++it) {
+      if ((*it)->GetGcRetentionPolicy() == kGcRetentionPolicyAlwaysCollect) {
+        BindLiveToMarkBitmap(*it);
+      }
+    }
+
+    GetHeap()->GetLargeObjectsSpace()->CopyLiveToMarked();
+  }
+
+  void StickyMarkSweep::MarkReachableObjects() {
+    DisableFinger();
+    RecursiveMarkDirtyObjects(CardTable::kCardDirty - 1);
+  }
+
+  void StickyMarkSweep::Sweep(TimingLogger& timings, bool swap_bitmaps) {
+    ObjectStack* live_stack = GetHeap()->GetLiveStack();
+    SweepArray(timings_, live_stack, false);
+    timings_.AddSplit("SweepArray");
+  }
+}  // namespace art