You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2010/09/15 09:36:45 UTC
svn commit: r997215 -
/commons/proper/daemon/trunk/src/native/windows/src/javajni.c
Author: mturk
Date: Wed Sep 15 07:36:45 2010
New Revision: 997215
URL: http://svn.apache.org/viewvc?rev=997215&view=rev
Log:
Figure out the JVM default stack size by asking the JVM itself
Modified:
commons/proper/daemon/trunk/src/native/windows/src/javajni.c
Modified: commons/proper/daemon/trunk/src/native/windows/src/javajni.c
URL: http://svn.apache.org/viewvc/commons/proper/daemon/trunk/src/native/windows/src/javajni.c?rev=997215&r1=997214&r2=997215&view=diff
==============================================================================
--- commons/proper/daemon/trunk/src/native/windows/src/javajni.c (original)
+++ commons/proper/daemon/trunk/src/native/windows/src/javajni.c Wed Sep 15 07:36:45 2010
@@ -119,12 +119,32 @@ typedef struct APXJAVAVM {
HANDLE hWorkerThread;
DWORD iWorkerThread;
DWORD dwWorkerStatus;
-
+ SIZE_T szStackSize;
} APXJAVAVM, *LPAPXJAVAVM;
+/* This is no longer exported in jni.h
+ * However java uses it internally to get
+ * the default stack size
+ */
+typedef struct APX_JDK1_1InitArgs {
+ jint version;
+
+ char **properties;
+ jint checkSource;
+ jint nativeStackSize;
+ jint javaStackSize;
+ jint minHeapSize;
+ jint maxHeapSize;
+ jint verifyMode;
+ char *classpath;
+
+ char padding[128];
+} APX_JDK1_1InitArgs;
+
#define JAVA_CLASSPATH "-Djava.class.path="
#define JAVA_CLASSPATH_W L"-Djava.class.path="
#define JAVA_CLASSSTRING "java/lang/String"
+#define MSVCRT71_DLLNAME L"\\msvcrt71.dll"
static __inline BOOL __apxJvmAttach(LPAPXJAVAVM lpJava)
{
@@ -177,6 +197,30 @@ static BOOL __apxLoadJvmDll(LPCWSTR szJv
errMode = SetErrorMode(SEM_FAILCRITICALERRORS);
_st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL, 0);
+ if (GetFileAttributesW(szJvmDllPath) != INVALID_FILE_ATTRIBUTES) {
+ /* Try to load the MSVCRTxx.dll before JVM.dll
+ */
+ WCHAR jreBinPath[SIZ_PATHLEN];
+ WCHAR crtBinPath[SIZ_PATHLEN];
+ DWORD i, l = 0;
+
+ lstrlcpyW(jreBinPath, SIZ_PATHLEN, dllJvmPath);
+ for (i = lstrlenW(jreBinPath); i > 0, l < 2; i--) {
+ if (jreBinPath[i] == L'\\' || jreBinPath[i] == L'/') {
+ jreBinPath[i] = L'\0';
+ lstrlcpyW(crtBinPath, SIZ_PATHLEN, jreBinPath);
+ lstrlcatW(crtBinPath, SIZ_PATHLEN, MSVCRT71_DLLNAME);
+ if (GetFileAttributesW(crtBinPath) != INVALID_FILE_ATTRIBUTES) {
+ if (LoadLibraryW(crtBinPath)) {
+ /* Found MSVCRTxx.dll
+ */
+ break;
+ }
+ }
+ l++;
+ }
+ }
+ }
/* This shuldn't happen, but try to search in %PATH% */
if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle))
_st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL,
@@ -267,9 +311,12 @@ apxCreateJava(APXHANDLE hPool, LPCWSTR s
LPAPXJAVAVM lpJava;
jsize iVmCount;
JavaVM *lpJvm = NULL;
+ struct APX_JDK1_1InitArgs jArgs1_1;
if (!__apxLoadJvmDll(szJvmDllPath))
return NULL;
+
+
/*
*/
if (DYNLOAD_FPTR(JNI_GetCreatedJavaVMs)(&lpJvm, 1, &iVmCount) != JNI_OK) {
@@ -287,6 +334,14 @@ apxCreateJava(APXHANDLE hPool, LPCWSTR s
lpJava = APXHANDLE_DATA(hJava);
lpJava->lpJvm = lpJvm;
lpJava->iVmCount = iVmCount;
+
+ /* Guess the stack size
+ */
+ AplZeroMemory(&jArgs1_1, sizeof(jArgs1_1));
+ jArgs1_1.version = JNI_VERSION_1_1;
+ DYNLOAD_FPTR(JNI_GetDefaultJavaVMInitArgs)(&jArgs1_1);
+ lpJava->szStackSize = (SIZE_T)jArgs1_1.javaStackSize;
+
if (!_st_sys_jvm)
_st_sys_jvm = lpJvm;
return hJava;
@@ -830,7 +885,9 @@ apxJavaStart(APXHANDLE hJava)
return FALSE;
lpJava = APXHANDLE_DATA(hJava);
- lpJava->hWorkerThread = CreateThread(NULL, 0, __apxJavaWorkerThread,
+ lpJava->hWorkerThread = CreateThread(NULL,
+ lpJava->szStackSize,
+ __apxJavaWorkerThread,
hJava, CREATE_SUSPENDED,
&lpJava->iWorkerThread);
if (IS_INVALID_HANDLE(lpJava->hWorkerThread)) {