• Po Lu's avatar
    Implement Lisp threading on Android · 42db7292
    Po Lu authored
    Much like the NS port, only the main thread receives input from
    the user interface, which is fortunately not a major problem for
    packages such as lsp-mode that create Lisp threads.
    
    * configure.ac: Enable with_threads under Android.
    
    * src/android.c (android_init_events): Set `main_thread_id' to
    the ID of the main thread.
    (setEmacsParams): Set new global variable `android_jvm' to the
    JVM object, for the purpose of attaching Lisp threads to the
    JVM.
    (android_select): [THREADS_ENABLED]: If the caller isn't the
    main thread, resort to pselect.  Don't check query before select
    returns.
    (android_check_query): Export.
    
    * src/android.h (_ANDROID_H_): Define new macro and update
    prototypes.
    
    * src/process.c (android_select_wrapper): New function.
    (wait_reading_process_output): If THREADS_ENABLED, call
    thread_select through the Android select wrapper.
    
    * src/thread.c (post_acquire_global_lock): Call
    android_check_query; replace android_java_env with the incoming
    Lisp thread's.
    (run_thread): Attach and detach the thread created to the JVM.
    (init_threads): Set the main thread's JNI environment object.
    
    * src/thread.h (struct thread_state) <java_env>: New field.
    42db7292