diff options
| author | Andreas Huber <andih@google.com> | 2011-01-26 11:19:19 -0800 |
|---|---|---|
| committer | Andreas Huber <andih@google.com> | 2011-01-26 11:20:42 -0800 |
| commit | 2ffbb18053b286a81c5b89a72e4dee3d0ab4dc45 (patch) | |
| tree | 9da056daa04cea797a7855d8070011fa72ec37e7 /include | |
| parent | ff3b3ade7fa1da60d391d1a746cdc0868c24f4bf (diff) | |
| download | frameworks_base-2ffbb18053b286a81c5b89a72e4dee3d0ab4dc45.zip frameworks_base-2ffbb18053b286a81c5b89a72e4dee3d0ab4dc45.tar.gz frameworks_base-2ffbb18053b286a81c5b89a72e4dee3d0ab4dc45.tar.bz2 | |
Protect notification callback parameters with a mutex.
This avoids the race condition where notifications are dispatched to a NULL receiver
after notifications have been disabled.
Change-Id: I6d351ffbee97616e2c35559c132a6c5e6a66948a
related-to-bug: 3394139
Diffstat (limited to 'include')
| -rw-r--r-- | include/media/MediaPlayerInterface.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/include/media/MediaPlayerInterface.h b/include/media/MediaPlayerInterface.h index c0963a6..048f041 100644 --- a/include/media/MediaPlayerInterface.h +++ b/include/media/MediaPlayerInterface.h @@ -126,8 +126,6 @@ public: virtual status_t setLooping(int loop) = 0; virtual player_type playerType() = 0; - virtual void setNotifyCallback(void* cookie, notify_callback_f notifyFunc) { - mCookie = cookie; mNotify = notifyFunc; } // Invoke a generic method on the player by using opaque parcels // for the request and reply. // @@ -149,9 +147,21 @@ public: return INVALID_OPERATION; }; - virtual void sendEvent(int msg, int ext1=0, int ext2=0) { if (mNotify) mNotify(mCookie, msg, ext1, ext2); } + void setNotifyCallback( + void* cookie, notify_callback_f notifyFunc) { + Mutex::Autolock autoLock(mNotifyLock); + mCookie = cookie; mNotify = notifyFunc; + } -protected: + void sendEvent(int msg, int ext1=0, int ext2=0) { + Mutex::Autolock autoLock(mNotifyLock); + if (mNotify) mNotify(mCookie, msg, ext1, ext2); + } + +private: + friend class MediaPlayerService; + + Mutex mNotifyLock; void* mCookie; notify_callback_f mNotify; }; |
