merge in jb-mr2-release history after reset to jb-mr2-dev
diff --git a/vm/Thread.cpp b/vm/Thread.cpp
index 7c8395e..9671b84 100644
--- a/vm/Thread.cpp
+++ b/vm/Thread.cpp
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+#define ATRACE_TAG ATRACE_TAG_DALVIK
+
/*
* Thread support.
*/
@@ -39,6 +41,7 @@
#include "interp/Jit.h" // need for self verification
#endif
+ #include <cutils/trace.h>
/* desktop Linux needs a little help with gettid() */
#if defined(HAVE_GETTID) && !defined(HAVE_ANDROID_OS)
@@ -2854,6 +2857,7 @@
ThreadStatus oldStatus = self->status; /* should be RUNNING */
self->status = THREAD_SUSPENDED;
+ ATRACE_BEGIN("DVM Suspend");
while (self->suspendCount != 0) {
/*
* Wait for wakeup signal, releasing lock. The act of releasing
@@ -2863,6 +2867,7 @@
dvmWaitCond(&gDvm.threadSuspendCountCond,
&gDvm.threadSuspendCountLock);
}
+ ATRACE_END();
assert(self->suspendCount == 0 && self->dbgSuspendCount == 0);
self->status = oldStatus;
LOG_THREAD("threadid=%d: self-reviving, status=%d",
diff --git a/vm/alloc/Heap.cpp b/vm/alloc/Heap.cpp
index 9bbe8a5..4a8d165 100644
--- a/vm/alloc/Heap.cpp
+++ b/vm/alloc/Heap.cpp
@@ -13,6 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+#define ATRACE_TAG ATRACE_TAG_DALVIK
+
/*
* Garbage-collecting memory allocator.
*/
@@ -31,6 +34,8 @@
#include <limits.h>
#include <errno.h>
+#include <cutils/trace.h>
+
static const GcSpec kGcForMallocSpec = {
true, /* isPartial */
false, /* isConcurrent */
@@ -456,9 +461,23 @@
return;
}
+ // Trace the beginning of the top-level GC.
+ if (spec == GC_FOR_MALLOC) {
+ ATRACE_BEGIN("GC (alloc)");
+ } else if (spec == GC_CONCURRENT) {
+ ATRACE_BEGIN("GC (concurrent)");
+ } else if (spec == GC_EXPLICIT) {
+ ATRACE_BEGIN("GC (explicit)");
+ } else if (spec == GC_BEFORE_OOM) {
+ ATRACE_BEGIN("GC (before OOM)");
+ } else {
+ ATRACE_BEGIN("GC (unknown)");
+ }
+
gcHeap->gcRunning = true;
rootStart = dvmGetRelativeTimeMsec();
+ ATRACE_BEGIN("GC: Threads Suspended"); // Suspend A
dvmSuspendAllThreads(SUSPEND_FOR_GC);
/*
@@ -478,6 +497,8 @@
/* Set up the marking context.
*/
if (!dvmHeapBeginMarkStep(spec->isPartial)) {
+ ATRACE_END(); // Suspend A
+ ATRACE_END(); // Top-level GC
LOGE_HEAP("dvmHeapBeginMarkStep failed; aborting");
dvmAbort();
}
@@ -504,6 +525,7 @@
dvmClearCardTable();
dvmUnlockHeap();
dvmResumeAllThreads(SUSPEND_FOR_GC);
+ ATRACE_END(); // Suspend A
rootEnd = dvmGetRelativeTimeMsec();
}
@@ -521,6 +543,7 @@
*/
dirtyStart = dvmGetRelativeTimeMsec();
dvmLockHeap();
+ ATRACE_BEGIN("GC: Threads Suspended"); // Suspend B
dvmSuspendAllThreads(SUSPEND_FOR_GC);
/*
* As no barrier intercepts root updates, we conservatively
@@ -582,6 +605,7 @@
if (spec->isConcurrent) {
dvmUnlockHeap();
dvmResumeAllThreads(SUSPEND_FOR_GC);
+ ATRACE_END(); // Suspend B
dirtyEnd = dvmGetRelativeTimeMsec();
}
dvmHeapSweepUnmarkedObjects(spec->isPartial, spec->isConcurrent,
@@ -622,6 +646,7 @@
if (!spec->isConcurrent) {
dvmResumeAllThreads(SUSPEND_FOR_GC);
+ ATRACE_END(); // Suspend A
dirtyEnd = dvmGetRelativeTimeMsec();
/*
* Restore the original thread scheduling priority if it was
@@ -675,6 +700,8 @@
LOGD_HEAP("Dumping native heap to DDM");
dvmDdmSendHeapSegments(false, true);
}
+
+ ATRACE_END(); // Top-level GC
}
/*
@@ -699,6 +726,7 @@
*/
bool dvmWaitForConcurrentGcToComplete()
{
+ ATRACE_BEGIN("GC: Wait For Concurrent");
bool waited = gDvm.gcHeap->gcRunning;
Thread *self = dvmThreadSelf();
assert(self != NULL);
@@ -712,5 +740,6 @@
if (end - start > 0) {
ALOGD("WAIT_FOR_CONCURRENT_GC blocked %ums", end - start);
}
+ ATRACE_END();
return waited;
}