JNIEXPORT void JNICALL Java_net_jlekstrand_wheatley_wayland_Compositor_removeFromLooperNative( JNIEnv *env, jclass cls, jlong nativeHandle) { struct wheatley_compositor *wc = (struct wheatley_compositor *)(intptr_t)nativeHandle; ALooper *looper; if (!wc->looper) return; looper = ALooper_forThread(); if (looper == NULL) { jni_util_throw_by_name(env, "java/lang/RuntimeException", "Current thread does not have a Looper"); return; } if (wc->looper != looper) { jni_util_throw_by_name(env, "java/lang/IllegalStateException", "Compositor is not assigned to this looper"); return; } wc->looper = NULL; ALooper_removeFd(looper, wl_event_loop_get_fd(wl_display_get_event_loop(wc->display))); }
message_dispatcher::~message_dispatcher() { scoped_lock lock(m_mutex); reset_queue(); if (m_looper) { ALooper_removeFd(m_looper, m_readfd); ALooper_release(m_looper); } close(m_writefd); close(m_readfd); LOGV("%s:%d> message_dispatcher(%p) is destroyed\n", __FILE__, __LINE__, this); }
Device::~Device() { ALooper* looper = ALooper_forThread(); if (looper != NULL) { ALooper_removeFd(looper, mFd); } else { LOGE("Could not remove fd, ALooper_forThread() returned NULL!"); } struct uhid_event ev = {}; ev.type = UHID_DESTROY; TEMP_FAILURE_RETRY(::write(mFd, &ev, sizeof(ev))); ::close(mFd); mFd = -1; }
static void orxAndroid_Exit(JNIEnv* env) { // finish Activity jclass objClass = env->FindClass("android/app/Activity"); jmethodID finish = env->GetMethodID(objClass, "finish", "()V"); env->CallVoidMethod(sstAndroid.mActivity, finish); env->DeleteLocalRef(objClass); // wait for quit cmd int ident; int events; while ((ident=ALooper_pollAll(-1, NULL, &events, NULL)) >= 0) { if(ident == LOOPER_ID_MAIN) { int8_t cmd = app_read_cmd(); if(cmd == APP_CMD_QUIT) { LOGI("APP_CMD_QUIT"); break; } if(cmd == APP_CMD_SURFACE_DESTROYED) { LOGI("APP_CMD_SURFACE_DESTROYED"); pthread_cond_broadcast(&sstAndroid.cond); pthread_mutex_lock(&sstAndroid.mutex); if(sstAndroid.window != NULL) { ANativeWindow_release(sstAndroid.window); sstAndroid.window = NULL; } pthread_cond_broadcast(&sstAndroid.cond); pthread_mutex_unlock(&sstAndroid.mutex); } } } env->DeleteGlobalRef(sstAndroid.mActivity); env->DeleteGlobalRef(sstAndroid.jAssetManager); if(sstAndroid.zAndroidInternalFilesPath) { free(sstAndroid.zAndroidInternalFilesPath); } if(sstAndroid.window != orxNULL) { ANativeWindow_release(sstAndroid.window); sstAndroid.window = orxNULL; } ALooper_removeFd(sstAndroid.looper, sstAndroid.pipeCmd[0]); ALooper_removeFd(sstAndroid.looper, sstAndroid.pipeKeyEvent[0]); ALooper_removeFd(sstAndroid.looper, sstAndroid.pipeTouchEvent[0]); ALooper_removeFd(sstAndroid.looper, sstAndroid.pipeJoystickEvent[0]); close(sstAndroid.pipeCmd[0]); close(sstAndroid.pipeCmd[1]); sstAndroid.pipeCmd[0] = -1; sstAndroid.pipeCmd[1] = -1; close(sstAndroid.pipeTouchEvent[0]); close(sstAndroid.pipeTouchEvent[1]); sstAndroid.pipeTouchEvent[0] = -1; sstAndroid.pipeTouchEvent[1] = -1; close(sstAndroid.pipeKeyEvent[0]); close(sstAndroid.pipeKeyEvent[1]); sstAndroid.pipeKeyEvent[0] = -1; sstAndroid.pipeKeyEvent[1] = -1; close(sstAndroid.pipeJoystickEvent[0]); close(sstAndroid.pipeJoystickEvent[1]); sstAndroid.pipeJoystickEvent[0] = -1; sstAndroid.pipeJoystickEvent[1] = -1; pthread_cond_destroy(&sstAndroid.cond); pthread_mutex_destroy(&sstAndroid.mutex); }