< prev index next >

modules/javafx.media/src/main/native/jfxmedia/jni/JavaInputStreamCallbacks.cpp

Print this page
rev 10028 : 8156563: JavaFX Ensemble8 media sample hang and crash
Reviewed-by: almatvee, kcr

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2010, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2016, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.  Oracle designates this

@@ -99,13 +99,18 @@
 bool CJavaInputStreamCallbacks::NeedBuffer()
 {
     bool     result = false;
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
-    if (m_ConnectionHolder && pEnv)
-    {
-        result = (pEnv->CallBooleanMethod(m_ConnectionHolder, m_NeedBufferMID) == JNI_TRUE);
+
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            result = (pEnv->CallBooleanMethod(connection, m_NeedBufferMID) == JNI_TRUE);
+            pEnv->DeleteLocalRef(connection);
+        }
+
         javaEnv.reportException();
     }
 
     return result;
 }

@@ -114,12 +119,17 @@
 {
     int result = -1;
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
 
-    if (m_ConnectionHolder && pEnv) {
-        result = pEnv->CallIntMethod(m_ConnectionHolder, m_ReadNextBlockMID);
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            result = pEnv->CallIntMethod(connection, m_ReadNextBlockMID);
+            pEnv->DeleteLocalRef(connection);
+        }
+
         if (javaEnv.clearException()) {
             result = -2;
         }
     }
 

@@ -130,13 +140,17 @@
 {
     int result = -1;
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
 
-    if (m_ConnectionHolder && pEnv)
-    {
-        result = pEnv->CallIntMethod(m_ConnectionHolder, m_ReadBlockMID, position, size);
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            result = pEnv->CallIntMethod(connection, m_ReadBlockMID, position, size);
+            pEnv->DeleteLocalRef(connection);
+        }
+
         if (javaEnv.clearException()) {
             result = -2;
         }
     }
 

@@ -145,29 +159,36 @@
 
 void CJavaInputStreamCallbacks::CopyBlock(void* destination, int size)
 {
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
-    if (m_ConnectionHolder && pEnv)
-    {
-        jobject buffer = pEnv->GetObjectField(m_ConnectionHolder, m_BufferFID);
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            jobject buffer = pEnv->GetObjectField(connection, m_BufferFID);
         void *data = pEnv->GetDirectBufferAddress(buffer);
 
         memcpy(destination, data, size);
         pEnv->DeleteLocalRef(buffer);
+            pEnv->DeleteLocalRef(connection);
+        }
     }
  }
 
 bool CJavaInputStreamCallbacks::IsSeekable()
 {
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
     bool result = false;
 
-    if (m_ConnectionHolder && pEnv)
-    {
-        result = (pEnv->CallBooleanMethod(m_ConnectionHolder, m_IsSeekableMID) == JNI_TRUE);
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            result = (pEnv->CallBooleanMethod(connection, m_IsSeekableMID) == JNI_TRUE);
+            pEnv->DeleteLocalRef(connection);
+        }
+
         javaEnv.reportException();
     }
 
     return result;
 }

@@ -176,13 +197,17 @@
 {
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
     bool result = false;
 
-    if (m_ConnectionHolder && pEnv)
-    {
-        result = (pEnv->CallBooleanMethod(m_ConnectionHolder, m_IsRandomAccessMID) == JNI_TRUE);
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            result = (pEnv->CallBooleanMethod(connection, m_IsRandomAccessMID) == JNI_TRUE);
+            pEnv->DeleteLocalRef(connection);
+        }
+
         javaEnv.reportException();
     }
 
     return result;
 }

@@ -191,27 +216,37 @@
 {
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
     jlong result = -1;
 
-    if (m_ConnectionHolder && pEnv)
-    {
-        result = pEnv->CallLongMethod(m_ConnectionHolder, m_SeekMID, (jlong)position);
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            result = pEnv->CallLongMethod(connection, m_SeekMID, (jlong)position);
+            pEnv->DeleteLocalRef(connection);
+        }
+
         javaEnv.reportException();
     }
 
     return (int64_t)result;
 }
 
 void CJavaInputStreamCallbacks::CloseConnection()
 {
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
-    if (m_ConnectionHolder && pEnv)
-    {
-        pEnv->CallVoidMethod(m_ConnectionHolder, m_CloseConnectionMID);
+
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            pEnv->CallVoidMethod(connection, m_CloseConnectionMID);
+            pEnv->DeleteLocalRef(connection);
+
         javaEnv.reportException();
+        }
+
         pEnv->DeleteGlobalRef(m_ConnectionHolder);
         m_ConnectionHolder = NULL;
     }
 }
 

@@ -219,13 +254,17 @@
 {
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
     int result = 0;
 
-    if (m_ConnectionHolder && pEnv)
-    {
-        result = pEnv->CallIntMethod(m_ConnectionHolder, m_PropertyMID, (jint)prop, (jint)value);
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            result = pEnv->CallIntMethod(connection, m_PropertyMID, (jint)prop, (jint)value);
+            pEnv->DeleteLocalRef(connection);
+        }
+
         javaEnv.reportException();
     }
 
     return result;
 }

@@ -234,13 +273,17 @@
 {
     CJavaEnvironment javaEnv(m_jvm);
     JNIEnv *pEnv = javaEnv.getEnvironment();
     int result = 0;
 
-    if (m_ConnectionHolder && pEnv)
-    {
-        result = pEnv->CallIntMethod(m_ConnectionHolder, m_GetStreamSizeMID);
+    if (pEnv) {
+        jobject connection = pEnv->NewLocalRef(m_ConnectionHolder);
+        if (connection) {
+            result = pEnv->CallIntMethod(connection, m_GetStreamSizeMID);
+            pEnv->DeleteLocalRef(connection);
+        }
+
         javaEnv.reportException();
     }
 
     return result;
 }
< prev index next >