您的位置:首页 > 移动开发 > Android开发

[Android]adb学习笔记(二)

2014-04-19 12:37 330 查看
2.通过fdevent_install()和fdevent_set()函数,现在要监听的fd已经通过epoll_ctrl()函数可以监听,

下一步就是调用fdevent_loop()函数调用epoll_wait()函数开始监听并调用相应的回调函数执行。

static fdevent list_pending = {
.next = &list_pending,
.prev = &list_pending,
};

void fdevent_loop()
{
fdevent *fde;
for(;;) {
fdevent_process();
while((fde = fdevent_plist_dequeue())) {
fdevent_call_fdfunc(fde);
}
}
}

static void fdevent_process()
{
struct epoll_event events[256];
fdevent *fde;
int i, n;

n = epoll_wait(epoll_fd, events, 256, -1);

if(n < 0) {
if(errno == EINTR) return;
}

for(i = 0; i < n; i++) {
struct epoll_event *ev = events + i;
fde = ev->data.ptr;
if(ev->events & EPOLLIN) {
fde->events |= FDE_READ;
}
if(ev->events & EPOLLOUT) {
fde->events |= FDE_WRITE;
}
if(ev->events & (EPOLLERR | EPOLLHUP)) {
fde->events |= FDE_ERROR;
}
if(fde->events) {
if(fde->state & FDE_PENDING) continue;
fde->state |= FDE_PENDING;
fdevent_plist_enqueue(fde);
}
}
}

static void fdevent_plist_enqueue(fdevent *node)
{
fdevent *list = &list_pending;

node->next = list;
node->prev = list->prev;
node->prev->next = node;
list->prev = node;
}

static void fdevent_call_fdfunc(fdevent* fde)
{
unsigned events = fde->events;
fde->events = 0;
if(!(fde->state & FDE_PENDING)) return;
fde->state &= (~FDE_PENDING);
dump_fde(fde, "callback");
fde->func(fde->fd, events, fde->arg);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: