[Android] jni: protect vout_android_gui with mutex
Thomas Guillem
git at videolan.org
Tue Nov 25 17:34:19 CET 2014
vlc-ports/android | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Nov 21 16:08:16 2014 +0100| [17b5e1e5a08fa530d2abc867d3db8ab2c111fbf0] | committer: Thomas Guillem
jni: protect vout_android_gui with mutex
> http://git.videolan.org/gitweb.cgi/vlc-ports/android.git/?a=commit;h=17b5e1e5a08fa530d2abc867d3db8ab2c111fbf0
---
libvlc/jni/vout.c | 27 +++++++++++++++++++++++----
1 file changed, 23 insertions(+), 4 deletions(-)
diff --git a/libvlc/jni/vout.c b/libvlc/jni/vout.c
index 0dcf1bf..04c933c 100644
--- a/libvlc/jni/vout.c
+++ b/libvlc/jni/vout.c
@@ -58,12 +58,17 @@ void jni_EventHardwareAccelerationError()
JNIEnv *env;
bool isAttached = false;
- if (vout_android_gui == NULL)
+ pthread_mutex_lock(&vout_android_lock);
+ if (vout_android_gui == NULL) {
+ pthread_mutex_unlock(&vout_android_lock);
return;
+ }
if (jni_get_env(&env) < 0) {
- if (jni_attach_thread(&env, THREAD_NAME) < 0)
+ if (jni_attach_thread(&env, THREAD_NAME) < 0) {
+ pthread_mutex_unlock(&vout_android_lock);
return;
+ }
isAttached = true;
}
@@ -74,12 +79,16 @@ void jni_EventHardwareAccelerationError()
(*env)->DeleteLocalRef(env, cls);
if (isAttached)
jni_detach_thread();
+ pthread_mutex_unlock(&vout_android_lock);
}
static void jni_SetSurfaceLayoutEnv(JNIEnv *p_env, int width, int height, int visible_width, int visible_height, int sar_num, int sar_den)
{
- if (vout_android_gui == NULL)
+ pthread_mutex_lock(&vout_android_lock);
+ if (vout_android_gui == NULL) {
+ pthread_mutex_unlock(&vout_android_lock);
return;
+ }
jclass cls = (*p_env)->GetObjectClass (p_env, vout_android_gui);
jmethodID methodId = (*p_env)->GetMethodID (p_env, cls, "setSurfaceLayout", "(IIIIII)V");
@@ -87,6 +96,7 @@ static void jni_SetSurfaceLayoutEnv(JNIEnv *p_env, int width, int height, int vi
(*p_env)->CallVoidMethod (p_env, vout_android_gui, methodId, width, height, visible_width, visible_height, sar_num, sar_den);
(*p_env)->DeleteLocalRef(p_env, cls);
+ pthread_mutex_unlock(&vout_android_lock);
}
void jni_SetSurfaceLayout(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den)
@@ -150,9 +160,17 @@ int jni_ConfigureSurface(jobject jsurf, int width, int height, int hal, bool *co
bool isAttached = false;
int ret;
+ pthread_mutex_lock(&vout_android_lock);
+ if (vout_android_gui == NULL) {
+ pthread_mutex_unlock(&vout_android_lock);
+ return -1;
+ }
+
if (jni_get_env(&p_env) < 0) {
- if (jni_attach_thread(&p_env, THREAD_NAME) < 0)
+ if (jni_attach_thread(&p_env, THREAD_NAME) < 0) {
+ pthread_mutex_unlock(&vout_android_lock);
return -1;
+ }
isAttached = true;
}
jclass clz = (*p_env)->GetObjectClass (p_env, vout_android_gui);
@@ -165,6 +183,7 @@ int jni_ConfigureSurface(jobject jsurf, int width, int height, int hal, bool *co
if (isAttached)
jni_detach_thread();
+ pthread_mutex_unlock(&vout_android_lock);
return ret == -1 ? -1 : 0;
}
More information about the Android
mailing list