のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

Parcel::freeDataNoInit()

   1384 void Parcel::freeDataNoInit()
   1385 {
   1386     if (mOwner) {
   1387         //ALOGI("Freeing data ref of %p (pid=%d)\n", this, getpid());
   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 }