--- a/jdk/src/share/bin/java.c Wed Aug 06 02:11:17 2014 +0400
+++ b/jdk/src/share/bin/java.c Tue Aug 05 19:29:00 2014 -0700
@@ -98,6 +98,7 @@
*/
static void SetClassPath(const char *s);
static void SelectVersion(int argc, char **argv, char **main_class);
+static void SetJvmEnvironment(int argc, char **argv);
static jboolean ParseArguments(int *pargc, char ***pargv,
int *pmode, char **pwhat,
int *pret, const char *jrepath);
@@ -238,6 +239,10 @@
jvmpath, sizeof(jvmpath),
jvmcfg, sizeof(jvmcfg));
+ if (!IsJavaArgs()) {
+ SetJvmEnvironment(argc,argv);
+ }
+
ifn.CreateJavaVM = 0;
ifn.GetDefaultJavaVMInitArgs = 0;
@@ -640,6 +645,67 @@
return jvmtype;
}
+/*
+ * static void SetJvmEnvironment(int argc, char **argv);
+ * Is called just before the JVM is loaded. We can set env variables
+ * that are consumed by the JVM. This function is non-destructive,
+ * leaving the arg list intact. The first use is for the JVM flag
+ * -XX:NativeMemoryTracking=value.
+ */
+static void
+SetJvmEnvironment(int argc, char **argv) {
+
+ static const char* NMT_Env_Name = "NMT_LEVEL_";
+
+ int i;
+ for (i = 0; i < argc; i++) {
+ /*
+ * The following case checks for "-XX:NativeMemoryTracking=value".
+ * If value is non null, an environmental variable set to this value
+ * will be created to be used by the JVM.
+ * The argument is passed to the JVM, which will check validity.
+ * The JVM is responsible for removing the env variable.
+ */
+ char *arg = argv[i];
+ if (JLI_StrCCmp(arg, "-XX:NativeMemoryTracking=") == 0) {
+ int retval;
+ // get what follows this parameter, include "="
+ size_t pnlen = JLI_StrLen("-XX:NativeMemoryTracking=");
+ if (JLI_StrLen(arg) > pnlen) {
+ char* value = arg + pnlen;
+ size_t pbuflen = pnlen + JLI_StrLen(value) + 10; // 10 max pid digits
+
+ /*
+ * ensures that malloc successful
+ * DONT JLI_MemFree() pbuf. JLI_PutEnv() uses system call
+ * that could store the address.
+ */
+ char * pbuf = (char*)JLI_MemAlloc(pbuflen);
+
+ JLI_Snprintf(pbuf, pbuflen, "%s%d=%s", NMT_Env_Name, JLI_GetPid(), value);
+ retval = JLI_PutEnv(pbuf);
+ if (JLI_IsTraceLauncher()) {
+ char* envName;
+ char* envBuf;
+
+ // ensures that malloc successful
+ envName = (char*)JLI_MemAlloc(pbuflen);
+ JLI_Snprintf(envName, pbuflen, "%s%d", NMT_Env_Name, JLI_GetPid());
+
+ printf("TRACER_MARKER: NativeMemoryTracking: env var is %s\n",envName);
+ printf("TRACER_MARKER: NativeMemoryTracking: putenv arg %s\n",pbuf);
+ envBuf = getenv(envName);
+ printf("TRACER_MARKER: NativeMemoryTracking: got value %s\n",envBuf);
+ free(envName);
+ }
+
+ }
+
+ }
+
+ }
+}
+
/* copied from HotSpot function "atomll()" */
static int
parse_size(const char *s, jlong *result) {