android /system/vold源码分析(4)

来源:互联网 发布:淘宝手机地址转换 编辑:程序博客网 时间:2024/06/06 07:20

继续看后面的代码:

        /* Process the pending list, since it is owned by the thread,         * there is no need to lock it */        while (!pendingList->empty()) {            /* Pop the first item from the list */            it = pendingList->begin();            SocketClient* c = *it;            pendingList->erase(it);            /* Process it, if false is returned and our sockets are             * connection-based, remove and destroy it */            if (!onDataAvailable(c) && mListen) {                /* Remove the client from our array */                SLOGV("going to zap %d for %s", c->getSocket(), mSocketName);                pthread_mutex_lock(&mClientsLock);                for (it = mClients->begin(); it != mClients->end(); ++it) {                    if (*it == c) {                        mClients->erase(it);                        break;                    }                }                pthread_mutex_unlock(&mClientsLock);                /* Remove our reference to the client */                c->decRef();            }        }    }    delete pendingList;
pendingList中的成员的socket都是有数据可读的,调用onDataAvailable(c)进行接收数据并处理。onDataAvailable()的代码在NetlinkListener类中:

bool NetlinkListener::onDataAvailable(SocketClient *cli){    int socket = cli->getSocket();    ssize_t count;    uid_t uid = -1;        //将接收的数据保存到mBuffer中    count = TEMP_FAILURE_RETRY(uevent_kernel_multicast_uid_recv(                                       socket, mBuffer, sizeof(mBuffer), &uid));    if (count < 0) {        if (uid > 0)            LOG_EVENT_INT(65537, uid);        SLOGE("recvmsg failed (%s)", strerror(errno));        return false;    }    NetlinkEvent *evt = new NetlinkEvent();    if (!evt->decode(mBuffer, count, mFormat)) { //解析数据        SLOGE("Error decoding NetlinkEvent");    } else {        onEvent(evt);    }    delete evt;    return true;}

代码将接收的数据保存到mBuffer中,调用evt->decode()解析数据:

bool NetlinkEvent::decode(char *buffer, int size, int format) {    if (format == NetlinkListener::NETLINK_FORMAT_BINARY) {        return parseBinaryNetlinkMessage(buffer, size);    } else {        return parseAsciiNetlinkMessage(buffer, size);    }}

如果decode成功,调用onEvent()。onEvent()的代码在NetlinkHandle类中:

void NetlinkHandler::onEvent(NetlinkEvent *evt) {    VolumeManager *vm = VolumeManager::Instance();    const char *subsys = evt->getSubsystem();    if (!subsys) {        SLOGW("No subsystem found in netlink event");        return;    }    if (!strcmp(subsys, "block")) {        vm->handleBlockEvent(evt);    }}


这段代码在最后调用了vm->handleBlockEvent(),只处理了subsys=”block”的情况。


0 0