SUGGESTED FIX
Name: atR10251 Date: 09/12/2003
------- awt_FileDialog.cpp -------
*** /tmp/sccs.3Ka4Bl Thu Sep 11 19:27:36 2003
--- awt_FileDialog.cpp Thu Sep 11 19:27:29 2003
***************
*** 349,360 ****
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFileDialogPeer__1show(JNIEnv *env, jobject peer)
{
TRY;
! AwtToolkit::GetInstance().InvokeFunction(AwtFileDialog::Show, peer);
CATCH_BAD_ALLOC;
}
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFileDialogPeer__1dispose(JNIEnv *env, jobject peer)
--- 349,368 ----
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFileDialogPeer__1show(JNIEnv *env, jobject peer)
{
TRY;
! /*
! * Fix for 4906972.
! * 'peer' reference has to be global as it's used further in another thread.
! */
! jobject peerGlobal = env->NewGlobalRef(peer);
!
! AwtToolkit::GetInstance().InvokeFunction(AwtFileDialog::Show, peerGlobal);
+ env->DeleteGlobalRef(peerGlobal);
+
CATCH_BAD_ALLOC;
}
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFileDialogPeer__1dispose(JNIEnv *env, jobject peer)
---------------------------
###@###.### 2003-09-12
======================================================================
Name: atR10251 Date: 10/03/2003
This fix compensates for the fix above (see evaluation by ###@###.### 2003-10-02).
------- awt_FileDialog.cpp -------
*** /tmp/sccs.eHayEj Wed Sep 26 12:33:08 2003
--- awt_FileDialog.cpp Wed Sep 26 12:23:22 2003
***************
*** 114,124 ****
void
AwtFileDialog::Show(void *p)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
! jobject peer = (jobject)p;
WCHAR unicodeChar = L' ';
LPTSTR fileBuffer = NULL;
LPTSTR currentDirectory = NULL;
AWTOPENFILENAME ofn;
jint mode = 0;
--- 114,124 ----
void
AwtFileDialog::Show(void *p)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
! jobject peer;
WCHAR unicodeChar = L' ';
LPTSTR fileBuffer = NULL;
LPTSTR currentDirectory = NULL;
AWTOPENFILENAME ofn;
jint mode = 0;
***************
*** 130,139 ****
--- 130,147 ----
jobject fileFilter = NULL;
jobject target = NULL;
jobject parent = NULL;
AwtComponent* awtParent = NULL;
+ /*
+ * There's a situation (see bug 4906972) when InvokeFunction (by which this
method is called)
+ * returnes earlier than this method returnes. Probably it's caused due to
ReplyMessage system call.
+ * So for the avoidance of this mistiming we need to make new global reference
here
+ * (not local as it's used by the hook) and then manage it independently of the
calling thread.
+ */
+ peer = env->NewGlobalRef((jobject)p);
+
try {
DASSERT(peer);
target = env->GetObjectField(peer, AwtObject::targetID);
parent = env->GetObjectField(peer, AwtFileDialog::parentID);
if (parent != NULL) {
***************
*** 248,257 ****
--- 256,266 ----
env->DeleteLocalRef(parent);
env->DeleteLocalRef(title);
env->DeleteLocalRef(directory);
env->DeleteLocalRef(file);
env->DeleteLocalRef(fileFilter);
+ env->DeleteGlobalRef(peer);
delete[] currentDirectory;
delete[] fileBuffer;
throw;
}
***************
*** 260,269 ****
--- 269,279 ----
env->DeleteLocalRef(parent);
env->DeleteLocalRef(title);
env->DeleteLocalRef(directory);
env->DeleteLocalRef(file);
env->DeleteLocalRef(fileFilter);
+ env->DeleteGlobalRef(peer);
delete[] currentDirectory;
delete[] fileBuffer;
}
###@###.### 2003-10-03
======================================================================
The fix below combines two fixes introduced above into one .diff file.
So, it is this one which is to be applied.
------- awt_FileDialog.cpp -------
*** /tmp/sccs.YUaiTA Thu Sep 9 11:34:11 2004
--- awt_FileDialog.cpp Thu Sep 9 11:31:54 2004
***************
*** 114,124 ****
void
AwtFileDialog::Show(void *p)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
! jobject peer = (jobject)p;
WCHAR unicodeChar = L' ';
LPTSTR fileBuffer = NULL;
LPTSTR currentDirectory = NULL;
AWTOPENFILENAME ofn;
jint mode = 0;
--- 114,124 ----
void
AwtFileDialog::Show(void *p)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
! jobject peer;
WCHAR unicodeChar = L' ';
LPTSTR fileBuffer = NULL;
LPTSTR currentDirectory = NULL;
AWTOPENFILENAME ofn;
jint mode = 0;
***************
*** 130,139 ****
--- 130,147 ----
jobject fileFilter = NULL;
jobject target = NULL;
jobject parent = NULL;
AwtComponent* awtParent = NULL;
+ /*
+ * There's a situation (see bug 4906972) when InvokeFunction (by which this method is called)
+ * returnes earlier than this method returnes. Probably it's caused due to ReplyMessage system call.
+ * So for the avoidance of this mistiming we need to make new global reference here
+ * (not local as it's used by the hook) and then manage it independently of the calling thread.
+ */
+ peer = env->NewGlobalRef((jobject)p);
+
try {
DASSERT(peer);
target = env->GetObjectField(peer, AwtObject::targetID);
parent = env->GetObjectField(peer, AwtFileDialog::parentID);
if (parent != NULL) {
***************
*** 248,257 ****
--- 256,266 ----
env->DeleteLocalRef(parent);
env->DeleteLocalRef(title);
env->DeleteLocalRef(directory);
env->DeleteLocalRef(file);
env->DeleteLocalRef(fileFilter);
+ env->DeleteGlobalRef(peer);
delete[] currentDirectory;
delete[] fileBuffer;
throw;
}
***************
*** 260,269 ****
--- 269,279 ----
env->DeleteLocalRef(parent);
env->DeleteLocalRef(title);
env->DeleteLocalRef(directory);
env->DeleteLocalRef(file);
env->DeleteLocalRef(fileFilter);
+ env->DeleteGlobalRef(peer);
delete[] currentDirectory;
delete[] fileBuffer;
}
***************
*** 349,360 ****
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFileDialogPeer__1show(JNIEnv *env, jobject peer)
{
TRY;
! AwtToolkit::GetInstance().InvokeFunction(AwtFileDialog::Show, peer);
CATCH_BAD_ALLOC;
}
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFileDialogPeer__1dispose(JNIEnv *env, jobject peer)
--- 359,378 ----
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFileDialogPeer__1show(JNIEnv *env, jobject peer)
{
TRY;
! /*
! * Fix for 4906972.
! * 'peer' reference has to be global as it's used further in another thread.
! */
! jobject peerGlobal = env->NewGlobalRef(peer);
+ AwtToolkit::GetInstance().InvokeFunction(AwtFileDialog::Show, peerGlobal);
+
+ env->DeleteGlobalRef(peerGlobal);
+
CATCH_BAD_ALLOC;
}
JNIEXPORT void JNICALL
Java_sun_awt_windows_WFileDialogPeer__1dispose(JNIEnv *env, jobject peer)
###@###.### 09/09/2004
======================================================================
###@###.### 2004-09-09
|