Add a -XX:mainThreadStackSize= option.

Similar to -Xss, but for the main thread only.

Bug: 6315322
Change-Id: I84bd5974f830f348fd9a0486ae972520b4a02cc4
diff --git a/vm/Globals.h b/vm/Globals.h
index 3cc0b49..c656206 100644
--- a/vm/Globals.h
+++ b/vm/Globals.h
@@ -91,6 +91,7 @@
     size_t      heapMaximumSize;
     size_t      heapGrowthLimit;
     size_t      stackSize;
+    size_t      mainThreadStackSize;
 
     bool        verboseGc;
     bool        verboseJni;
diff --git a/vm/Init.cpp b/vm/Init.cpp
index 80cf9f6..09470f9 100644
--- a/vm/Init.cpp
+++ b/vm/Init.cpp
@@ -800,6 +800,9 @@
             if (val != 0) {
                 if (val >= kMinStackSize && val <= kMaxStackSize) {
                     gDvm.stackSize = val;
+                    if (val > gDvm.mainThreadStackSize) {
+                        gDvm.mainThreadStackSize = val;
+                    }
                 } else {
                     dvmFprintf(stderr, "Invalid -Xss '%s', range is %d to %d\n",
                         argv[i], kMinStackSize, kMaxStackSize);
@@ -810,6 +813,21 @@
                 return -1;
             }
 
+        } else if (strncmp(argv[i], "-XX:mainThreadStackSize=", strlen("-XX:mainThreadStackSize=")) == 0) {
+            size_t val = parseMemOption(argv[i] + strlen("-XX:mainThreadStackSize="), 1);
+            if (val != 0) {
+                if (val >= kMinStackSize && val <= kMaxStackSize) {
+                    gDvm.mainThreadStackSize = val;
+                } else {
+                    dvmFprintf(stderr, "Invalid -XX:mainThreadStackSize '%s', range is %d to %d\n",
+                               argv[i], kMinStackSize, kMaxStackSize);
+                    return -1;
+                }
+            } else {
+                dvmFprintf(stderr, "Invalid -XX:mainThreadStackSize option '%s'\n", argv[i]);
+                return -1;
+            }
+
         } else if (strncmp(argv[i], "-XX:+DisableExplicitGC", 22) == 0) {
             gDvm.disableExplicitGc = true;
         } else if (strcmp(argv[i], "-verbose") == 0 ||
@@ -1056,6 +1074,7 @@
     gDvm.heapMaximumSize = 16 * 1024 * 1024;  // Spec says 75% physical mem
     gDvm.heapGrowthLimit = 0;  // 0 means no growth limit
     gDvm.stackSize = kDefaultStackSize;
+    gDvm.mainThreadStackSize = kDefaultStackSize;
 
     gDvm.concurrentMarkSweep = true;
 
diff --git a/vm/Thread.cpp b/vm/Thread.cpp
index 01451f3..d82f15a 100644
--- a/vm/Thread.cpp
+++ b/vm/Thread.cpp
@@ -282,7 +282,7 @@
 
     gDvm.threadIdMap = dvmAllocBitVector(kMaxThreadId, false);
 
-    thread = allocThread(gDvm.stackSize);
+    thread = allocThread(gDvm.mainThreadStackSize);
     if (thread == NULL)
         return false;