在EventHub的构造函数中:
mEpollFd = epoll_create(EPOLL_SIZE_HINT);
mINotifyFd = inotify_init();
//DEVICE_PATH定义为"/dev/input"
int result = inotify_add_watch(mINotifyFd, DEVICE_PATH, IN_DELETE | IN_CREATE);
result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mINotifyFd, &eventItem);
result = pipe(wakeFds);
mWakeReadPipeFd = wakeFds[0];
mWakeWritePipeFd = wakeFds[1];
result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK);
result = fcntl(mWakeWritePipeFd, F_SETFL, O_NONBLOCK);
result = epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mWakeReadPipeFd, &eventItem);
InputReaderThread通过循环调用EventHub的getEvents()函数获取输入事件。
EventHub::getEvents() 函数功能
1. 初次启动或者配置改变时,重新扫描设备,加载设备配置信息。
scanDevicesLocked();
2. 执行epoll_wait 监听设备节点,如果监听到设备节点有变化,则登记设备节点到pending 列表;否则阻塞等待。
int pollResult = epoll_wait(mEpollFd, mPendingEventItems, EPOLL_MAX_EVENTS, timeoutMillis);
按键按下
mP mPendingEventCount=1
/dev/input/event0 got: t0=658, t1=765679, type=1, code=1, value=0
按键松开
mPmPendingEventCount=1
/dev/input/event0 got: t0=658, t1=765679, type=1, code=1, value=03. 把pending 列表里的event 里记录的设备节点,读取节点数据,并保存到buffer里返回给调用者。
4. 如果读取到event,则退出for循环,把event数据返回给调用则。