diff options
author | Jeff Brown <jeffbrown@google.com> | 2012-05-31 18:43:27 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-05-31 18:43:27 -0700 |
commit | 9a6b4c73face8005352fc0db1ecf09b2b8bdedcb (patch) | |
tree | 70844ffb6345ad48449072a4b266436a5b2eb5a1 /include | |
parent | ad7b3760ced1c5ca40b3641e97911803810a839b (diff) | |
parent | d5085da3c0c103bba0c2c927382f7d414275b661 (diff) | |
download | frameworks_native-9a6b4c73face8005352fc0db1ecf09b2b8bdedcb.zip frameworks_native-9a6b4c73face8005352fc0db1ecf09b2b8bdedcb.tar.gz frameworks_native-9a6b4c73face8005352fc0db1ecf09b2b8bdedcb.tar.bz2 |
am d5085da3: am 4467bba7: Merge "Support looper callbacks based on smart pointers." into jb-dev
* commit 'd5085da3c0c103bba0c2c927382f7d414275b661':
Support looper callbacks based on smart pointers.
Diffstat (limited to 'include')
-rw-r--r-- | include/utils/Looper.h | 54 |
1 files changed, 52 insertions, 2 deletions
diff --git a/include/utils/Looper.h b/include/utils/Looper.h index 84e3864..d4a0067 100644 --- a/include/utils/Looper.h +++ b/include/utils/Looper.h @@ -70,6 +70,9 @@ public: * A simple proxy that holds a weak reference to a message handler. */ class WeakMessageHandler : public MessageHandler { +protected: + virtual ~WeakMessageHandler(); + public: WeakMessageHandler(const wp<MessageHandler>& handler); virtual void handleMessage(const Message& message); @@ -80,6 +83,43 @@ private: /** + * A looper callback. + */ +class LooperCallback : public virtual RefBase { +protected: + virtual ~LooperCallback() { } + +public: + /** + * Handles a poll event for the given file descriptor. + * It is given the file descriptor it is associated with, + * a bitmask of the poll events that were triggered (typically ALOOPER_EVENT_INPUT), + * and the data pointer that was originally supplied. + * + * Implementations should return 1 to continue receiving callbacks, or 0 + * to have this file descriptor and callback unregistered from the looper. + */ + virtual int handleEvent(int fd, int events, void* data) = 0; +}; + + +/** + * Wraps a ALooper_callbackFunc function pointer. + */ +class SimpleLooperCallback : public LooperCallback { +protected: + virtual ~SimpleLooperCallback(); + +public: + SimpleLooperCallback(ALooper_callbackFunc callback); + virtual int handleEvent(int fd, int events, void* data); + +private: + ALooper_callbackFunc mCallback; +}; + + +/** * A polling loop that supports monitoring file descriptor events, optionally * using callbacks. The implementation uses epoll() internally. * @@ -159,7 +199,7 @@ public: * If the same file descriptor was previously added, it is replaced. * * "fd" is the file descriptor to be added. - * "ident" is an identifier for this event, which is returned from ALooper_pollOnce(). + * "ident" is an identifier for this event, which is returned from pollOnce(). * The identifier must be >= 0, or ALOOPER_POLL_CALLBACK if providing a non-NULL callback. * "events" are the poll events to wake up on. Typically this is ALOOPER_EVENT_INPUT. * "callback" is the function to call when there is an event on the file descriptor. @@ -179,8 +219,14 @@ public: * * This method can be called on any thread. * This method may block briefly if it needs to wake the poll. + * + * The callback may either be specified as a bare function pointer or as a smart + * pointer callback object. The smart pointer should be preferred because it is + * easier to avoid races when the callback is removed from a different thread. + * See removeFd() for details. */ int addFd(int fd, int ident, int events, ALooper_callbackFunc callback, void* data); + int addFd(int fd, int ident, int events, const sp<LooperCallback>& callback, void* data); /** * Removes a previously added file descriptor from the looper. @@ -193,6 +239,10 @@ public: * by returning 0 or by calling this method, then it can be guaranteed to not be invoked * again at any later time unless registered anew. * + * A simple way to avoid this problem is to use the version of addFd() that takes + * a sp<LooperCallback> instead of a bare function pointer. The LooperCallback will + * be released at the appropriate time by the Looper. + * * Returns 1 if the file descriptor was removed, 0 if none was previously registered. * * This method can be called on any thread. @@ -273,7 +323,7 @@ private: struct Request { int fd; int ident; - ALooper_callbackFunc callback; + sp<LooperCallback> callback; void* data; }; |