diff options
author | Jeff Brown <jeffbrown@google.com> | 2010-10-05 15:35:37 -0700 |
---|---|---|
committer | Jeff Brown <jeffbrown@google.com> | 2010-10-07 13:26:39 -0700 |
commit | 415d8c38199e258dfce92cdb0c69e056b3b51ef8 (patch) | |
tree | 5bf6d167a19b272f2a153df6010a7dd6f58a274f /core/jni/android_os_MessageQueue.cpp | |
parent | 930d6c3cd5ad387489eb1d35a38beeafe54166b6 (diff) | |
download | frameworks_base-415d8c38199e258dfce92cdb0c69e056b3b51ef8.zip frameworks_base-415d8c38199e258dfce92cdb0c69e056b3b51ef8.tar.gz frameworks_base-415d8c38199e258dfce92cdb0c69e056b3b51ef8.tar.bz2 |
Switch Looper back to using poll() instead of epoll().
Added a couple of micro-optimizations to avoid calling wake() unnecessarily
and reduce JNI overhead slightly.
Fixed a minor issue where we were not clearing the "next" field of Messages
returned by the MessageQueue so the Message would hold on to its successor
and potentially prevent the GC from collecting it if the message were leaked
somehow.
Change-Id: I488d29417ce0cdd7d0e447cda76ec978ef7f811c
Diffstat (limited to 'core/jni/android_os_MessageQueue.cpp')
-rw-r--r-- | core/jni/android_os_MessageQueue.cpp | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/core/jni/android_os_MessageQueue.cpp b/core/jni/android_os_MessageQueue.cpp index 1b203ca..d2e5462 100644 --- a/core/jni/android_os_MessageQueue.cpp +++ b/core/jni/android_os_MessageQueue.cpp @@ -41,7 +41,7 @@ public: inline sp<Looper> getLooper() { return mLooper; } - bool pollOnce(int timeoutMillis); + void pollOnce(int timeoutMillis); void wake(); private: @@ -61,8 +61,8 @@ NativeMessageQueue::NativeMessageQueue() { NativeMessageQueue::~NativeMessageQueue() { } -bool NativeMessageQueue::pollOnce(int timeoutMillis) { - return mLooper->pollOnce(timeoutMillis) != ALOOPER_POLL_TIMEOUT; +void NativeMessageQueue::pollOnce(int timeoutMillis) { + mLooper->pollOnce(timeoutMillis); } void NativeMessageQueue::wake() { @@ -112,24 +112,14 @@ static void throwQueueNotInitialized(JNIEnv* env) { jniThrowException(env, "java/lang/IllegalStateException", "Message queue not initialized"); } -static jboolean android_os_MessageQueue_nativePollOnce(JNIEnv* env, jobject obj, - jint timeoutMillis) { - NativeMessageQueue* nativeMessageQueue = - android_os_MessageQueue_getNativeMessageQueue(env, obj); - if (! nativeMessageQueue) { - throwQueueNotInitialized(env); - return false; - } - return nativeMessageQueue->pollOnce(timeoutMillis); +static void android_os_MessageQueue_nativePollOnce(JNIEnv* env, jobject obj, + jint ptr, jint timeoutMillis) { + NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); + nativeMessageQueue->pollOnce(timeoutMillis); } -static void android_os_MessageQueue_nativeWake(JNIEnv* env, jobject obj) { - NativeMessageQueue* nativeMessageQueue = - android_os_MessageQueue_getNativeMessageQueue(env, obj); - if (! nativeMessageQueue) { - throwQueueNotInitialized(env); - return; - } +static void android_os_MessageQueue_nativeWake(JNIEnv* env, jobject obj, jint ptr) { + NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); return nativeMessageQueue->wake(); } @@ -139,8 +129,8 @@ static JNINativeMethod gMessageQueueMethods[] = { /* name, signature, funcPtr */ { "nativeInit", "()V", (void*)android_os_MessageQueue_nativeInit }, { "nativeDestroy", "()V", (void*)android_os_MessageQueue_nativeDestroy }, - { "nativePollOnce", "(I)Z", (void*)android_os_MessageQueue_nativePollOnce }, - { "nativeWake", "()V", (void*)android_os_MessageQueue_nativeWake } + { "nativePollOnce", "(II)V", (void*)android_os_MessageQueue_nativePollOnce }, + { "nativeWake", "(I)V", (void*)android_os_MessageQueue_nativeWake } }; #define FIND_CLASS(var, className) \ |