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
- android /system/vold源码分析(4)
- android /system/vold源码分析(1)
- android /system/vold源码分析(2)
- android /system/vold源码分析(3)
- android /system/vold源码分析(5)
- android /system/vold源码分析(6)
- android /system/vold源码分析(7)
- android /system/vold源码分析(8)
- Android磁盘管理-之vold源码分析(4)
- Android磁盘管理-之vold源码分析(4)
- Android-vold源码分析之handleBlockEvent(5)
- Android-vold源码分析之startListener(6)
- Android-vold源码分析之runCommand(7)
- Android-vold源码分析之handleBlockEvent(5)
- Android-vold源码分析之startListener(6)
- Android-vold源码分析之runCommand(7)
- Android磁盘管理-之vold源码分析
- Android-vold源码分析之handleBlockEvent
- Android初级教程小案例之单选框RadioGroup与复选框CheckBox
- 【Java】letter combinations of phone number
- Java(数据类型,数组表达,Unicode编码)
- leetcode 19. Remove Nth Node From End of List
- 错误:找不到或无法加载主类HelloWorld
- android /system/vold源码分析(4)
- 一个 JavaScript 小时钟
- JavaAPI之AtomicInteger
- Spark之Streaming实时监听Hdfs文件目录
- Hibernate全方位总结
- error C2054: 在“inline”之后应输入“(”
- linux系统
- Android视图的绘制流程(上)——View的测量
- 22、jdbc入门2