Merge "Don't generate and send reply object in oneway calls."

This commit is contained in:
Martijn Coenen
2017-02-09 08:37:29 +00:00
committed by Gerrit Code Review

View File

@@ -127,18 +127,23 @@ status_t JHwBinder::onTransact(
uint32_t flags, uint32_t flags,
TransactCallback callback) { TransactCallback callback) {
JNIEnv *env = AndroidRuntime::getJNIEnv(); JNIEnv *env = AndroidRuntime::getJNIEnv();
bool isOneway = (flags & TF_ONE_WAY) != 0;
ScopedLocalRef<jobject> replyObj(env, nullptr);
sp<JHwParcel> replyContext = nullptr;
ScopedLocalRef<jobject> requestObj(env, JHwParcel::NewObject(env)); ScopedLocalRef<jobject> requestObj(env, JHwParcel::NewObject(env));
JHwParcel::GetNativeContext(env, requestObj.get())->setParcel( JHwParcel::GetNativeContext(env, requestObj.get())->setParcel(
const_cast<hardware::Parcel *>(&data), false /* assumeOwnership */); const_cast<hardware::Parcel *>(&data), false /* assumeOwnership */);
ScopedLocalRef<jobject> replyObj(env, JHwParcel::NewObject(env));
sp<JHwParcel> replyContext = if (!isOneway) {
JHwParcel::GetNativeContext(env, replyObj.get()); replyObj.reset(JHwParcel::NewObject(env));
replyContext->setParcel(reply, false /* assumeOwnership */); replyContext = JHwParcel::GetNativeContext(env, replyObj.get());
replyContext->setTransactCallback(callback);
replyContext->setParcel(reply, false /* assumeOwnership */);
replyContext->setTransactCallback(callback);
}
env->CallVoidMethod( env->CallVoidMethod(
mObject, mObject,
@@ -166,27 +171,29 @@ status_t JHwBinder::onTransact(
status_t err = OK; status_t err = OK;
if (!replyContext->wasSent()) { if (!isOneway) {
// The implementation never finished the transaction. if (!replyContext->wasSent()) {
err = UNKNOWN_ERROR; // XXX special error code instead? // The implementation never finished the transaction.
err = UNKNOWN_ERROR; // XXX special error code instead?
reply->setDataPosition(0 /* pos */);
}
// Release all temporary storage now that scatter-gather data
// has been consolidated, either by calling the TransactCallback,
// if wasSent() == true or clearing the reply parcel (setDataOffset above).
replyContext->getStorage()->release(env);
// We cannot permanently pass ownership of "data" and "reply" over to their
// Java object wrappers (we don't own them ourselves).
replyContext->setParcel(
NULL /* parcel */, false /* assumeOwnership */);
reply->setDataPosition(0 /* pos */);
} }
// Release all temporary storage now that scatter-gather data
// has been consolidated, either by calling the TransactCallback,
// if wasSent() == true or clearing the reply parcel (setDataOffset above).
replyContext->getStorage()->release(env);
// We cannot permanently pass ownership of "data" and "reply" over to their
// Java object wrappers (we don't own them ourselves).
JHwParcel::GetNativeContext(env, requestObj.get())->setParcel( JHwParcel::GetNativeContext(env, requestObj.get())->setParcel(
NULL /* parcel */, false /* assumeOwnership */); NULL /* parcel */, false /* assumeOwnership */);
replyContext->setParcel(
NULL /* parcel */, false /* assumeOwnership */);
return err; return err;
} }