am 2e6aff8e: Merge "ALooperRoster no longer holds strong references to handlers and loopers." into gingerbread
Merge commit '2e6aff8e19ce8292a36fe211f8051dccf1fb9670' into gingerbread-plus-aosp * commit '2e6aff8e19ce8292a36fe211f8051dccf1fb9670': ALooperRoster no longer holds strong references to handlers and loopers.
This commit is contained in:
@@ -38,8 +38,8 @@ struct ALooperRoster {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
struct HandlerInfo {
|
struct HandlerInfo {
|
||||||
sp<ALooper> mLooper;
|
wp<ALooper> mLooper;
|
||||||
sp<AHandler> mHandler;
|
wp<AHandler> mHandler;
|
||||||
};
|
};
|
||||||
|
|
||||||
Mutex mLock;
|
Mutex mLock;
|
||||||
|
|||||||
@@ -54,10 +54,15 @@ void ALooperRoster::unregisterHandler(ALooper::handler_id handlerID) {
|
|||||||
Mutex::Autolock autoLock(mLock);
|
Mutex::Autolock autoLock(mLock);
|
||||||
|
|
||||||
ssize_t index = mHandlers.indexOfKey(handlerID);
|
ssize_t index = mHandlers.indexOfKey(handlerID);
|
||||||
CHECK(index >= 0);
|
CHECK_GE(index, 0);
|
||||||
|
|
||||||
const HandlerInfo &info = mHandlers.valueAt(index);
|
const HandlerInfo &info = mHandlers.valueAt(index);
|
||||||
info.mHandler->setID(0);
|
|
||||||
|
sp<AHandler> handler = info.mHandler.promote();
|
||||||
|
|
||||||
|
if (handler != NULL) {
|
||||||
|
handler->setID(0);
|
||||||
|
}
|
||||||
|
|
||||||
mHandlers.removeItemsAt(index);
|
mHandlers.removeItemsAt(index);
|
||||||
}
|
}
|
||||||
@@ -74,7 +79,18 @@ void ALooperRoster::postMessage(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const HandlerInfo &info = mHandlers.valueAt(index);
|
const HandlerInfo &info = mHandlers.valueAt(index);
|
||||||
info.mLooper->post(msg, delayUs);
|
|
||||||
|
sp<ALooper> looper = info.mLooper.promote();
|
||||||
|
|
||||||
|
if (looper == NULL) {
|
||||||
|
LOG(WARNING) << "failed to post message. "
|
||||||
|
"Target handler still registered, but object gone.";
|
||||||
|
|
||||||
|
mHandlers.removeItemsAt(index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
looper->post(msg, delayUs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
|
void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
|
||||||
@@ -86,12 +102,21 @@ void ALooperRoster::deliverMessage(const sp<AMessage> &msg) {
|
|||||||
ssize_t index = mHandlers.indexOfKey(msg->target());
|
ssize_t index = mHandlers.indexOfKey(msg->target());
|
||||||
|
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
LOG(WARNING) << "failed to deliver message. Target handler not registered.";
|
LOG(WARNING) << "failed to deliver message. "
|
||||||
|
<< "Target handler not registered.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const HandlerInfo &info = mHandlers.valueAt(index);
|
const HandlerInfo &info = mHandlers.valueAt(index);
|
||||||
handler = info.mHandler;
|
handler = info.mHandler.promote();
|
||||||
|
|
||||||
|
if (handler == NULL) {
|
||||||
|
LOG(WARNING) << "failed to deliver message. "
|
||||||
|
"Target handler registered, but object gone.";
|
||||||
|
|
||||||
|
mHandlers.removeItemsAt(index);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handler->onMessageReceived(msg);
|
handler->onMessageReceived(msg);
|
||||||
@@ -106,7 +131,14 @@ sp<ALooper> ALooperRoster::findLooper(ALooper::handler_id handlerID) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mHandlers.valueAt(index).mLooper;
|
sp<ALooper> looper = mHandlers.valueAt(index).mLooper.promote();
|
||||||
|
|
||||||
|
if (looper == NULL) {
|
||||||
|
mHandlers.removeItemsAt(index);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return looper;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace android
|
} // namespace android
|
||||||
|
|||||||
Reference in New Issue
Block a user