遇到了一个bug,需要看看eventhub这边的getevent是咋工作的
首先看getevent的一个最重要的东西
int pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, timeoutMillis); //不停的读event
这个mEpollFd怎么来的呢
result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mINotifyFd, &eventItem);
将被监听的描述符添加到epoll句柄或从epool句柄中删除或者对监听事件进行修改。
mINotifyFd = inotify_init();
int result = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE); //这个static const char *DEVICE_PATH = "/dev/input";
所以其实监视的就是这个文件的上报
这个目录下是啥东西呢
root@ASUS_Z00L_63:/dev/input # ls
event0
event1
event2
event3
event4
event5
event6
event7
event8
mice
也就是所有的input设备在驱动中调用input_register_device(struct input_dev *dev)产生的。
而真正的event的读取在
if (eventItem.events & EPOLLIN) {
int32_t readSize = read(device->fd, readBuffer,sizeof(struct input_event) * capacity);
从inputdevice中获取数据到buffer然后在
for (size_t i = 0; i < count; i++) {
struct input_event& iev = readBuffer[i]; //从buffer中提取数据
再放到event中
event->deviceId = deviceId;
event->type = iev.type;
event->code = iev.code;
event->value = iev.value;
这个ssize_t deviceIndex = mDevices.indexOfKey(eventItem.data.u32);
mDevices是个vector类型数据也就是个数组
while (mPendingEventIndex < mPendingEventCount) {
ALOGD("matt-mPendingEventIndex=%d,mPendingEventCount=%d",mPendingEventIndex,mPendingEventCount);
const struct epoll_event& eventItem = mPendingEventItems[mPendingEventIndex++]; //每次读都加1 还有上面的eventItem
其中mPendingEventCount = size_t(pollResult); mPendingEventIndex = 0;是这样初始化的