Ejemplo n.º 1
0
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;
}
Ejemplo n.º 4
0
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);
}