< 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 >