1384 void Parcel::freeDataNoInit()
1385 {
1386 if (mOwner) {
1387
1388 mOwner(this, mData, mDataSize, mObjects, mObjectsSize, mOwnerCookie);
1389 } else {
1390 releaseObjects();
1391 if (mData) free(mData);
1392 if (mObjects) free(mObjects);
1393 }
1394 }
1350 void Parcel::releaseObjects()
1351 {
1352 const sp<ProcessState> proc(ProcessState::self());
1353 size_t i = mObjectsSize;
1354 uint8_t* const data = mData;
1355 size_t* const objects = mObjects;
1356 while (i > 0) {
1357 i--;
1358 const flat_binder_object* flat
1359 = reinterpret_cast<flat_binder_object*>(data+objects[i]);
1360 release_object(proc, *flat, this);
1361 }
1362 }
109 void release_object(const sp<ProcessState>& proc,
110 const flat_binder_object& obj, const void* who)
111 {
112 switch (obj.type) {
113 case BINDER_TYPE_BINDER:
114 if (obj.binder) {
115 LOG_REFS("Parcel %p releasing reference on local %p", who, obj.cookie);
116 static_cast<IBinder*>(obj.cookie)->decStrong(who);
117 }
118 return;
119 case BINDER_TYPE_WEAK_BINDER:
120 if (obj.binder)
121 static_cast<RefBase::weakref_type*>(obj.binder)->decWeak(who);
122 return;
123 case BINDER_TYPE_HANDLE: {
124 const sp<IBinder> b = proc->getStrongProxyForHandle(obj.handle);
125 if (b != NULL) {
126 LOG_REFS("Parcel %p releasing reference on remote %p", who, b.get());
127 b->decStrong(who);
128 }
129 return;
130 }
131 case BINDER_TYPE_WEAK_HANDLE: {
132 const wp<IBinder> b = proc->getWeakProxyForHandle(obj.handle);
133 if (b != NULL) b.get_refs()->decWeak(who);
134 return;
135 }
136 case BINDER_TYPE_FD: {
137 if (obj.cookie != (void*)0) close(obj.handle);
138 return;
139 }
140 }
141
142 ALOGE("Invalid object type 0x%08lx", obj.type);
143 }