Fix an occasional ThreadStress crash.

Also, fix the NativeAllocations test for the case with the GSS
collector as the default GC. Since kGcCauseForAlloc (incorrect) was
being passed into the collector instead of kGcCauseForNativeAlloc
(correct) from Heap::RegisterNativeAllocation(), the GCC collector
never invoked a whole heap collection which was necessary to do
sufficent finalizations to pass the test.

Bug: 13988451
Bug: 11650816
Change-Id: Ib02f061751cd777e0d3bfa81b29e04a874dc58a0
diff --git a/runtime/gc/heap.cc b/runtime/gc/heap.cc
index 91f249a..35ec297 100644
--- a/runtime/gc/heap.cc
+++ b/runtime/gc/heap.cc
@@ -667,7 +667,8 @@
   for (auto& collector : garbage_collectors_) {
     const CumulativeLogger& logger = collector->GetCumulativeTimings();
     const size_t iterations = logger.GetIterations();
-    if (iterations != 0) {
+    const Histogram<uint64_t>& pause_histogram = collector->GetPauseHistogram();
+    if (iterations != 0 && pause_histogram.SampleSize() != 0) {
       os << ConstDumpable<CumulativeLogger>(logger);
       const uint64_t total_ns = logger.GetTotalNs();
       const uint64_t total_pause_ns = collector->GetTotalPausedTimeNs();
@@ -675,8 +676,8 @@
       const uint64_t freed_bytes = collector->GetTotalFreedBytes();
       const uint64_t freed_objects = collector->GetTotalFreedObjects();
       Histogram<uint64_t>::CumulativeData cumulative_data;
-      collector->GetPauseHistogram().CreateHistogram(&cumulative_data);
-      collector->GetPauseHistogram().PrintConfidenceIntervals(os, 0.99, cumulative_data);
+      pause_histogram.CreateHistogram(&cumulative_data);
+      pause_histogram.PrintConfidenceIntervals(os, 0.99, cumulative_data);
       os << collector->GetName() << " total time: " << PrettyDuration(total_ns)
          << " mean time: " << PrettyDuration(total_ns / iterations) << "\n"
          << collector->GetName() << " freed: " << freed_objects
@@ -2797,7 +2798,7 @@
       if (IsGcConcurrent()) {
         RequestConcurrentGC(self);
       } else {
-        CollectGarbageInternal(gc_type, kGcCauseForAlloc, false);
+        CollectGarbageInternal(gc_type, kGcCauseForNativeAlloc, false);
       }
     }
   }