Home | History | Annotate | Download | only in adb

Lines Matching refs:fde

48 static void dump_fde(fdevent *fde, const char *info)
50 fprintf(stderr,"FDE #%03d %c%c%c %s\n", fde->fd,
51 fde->state & FDE_READ ? 'R' : ' ',
52 fde->state & FDE_WRITE ? 'W' : ' ',
53 fde->state & FDE_ERROR ? 'E' : ' ',
57 #define dump_fde(fde, info) do { } while(0)
100 static void fdevent_connect(fdevent *fde)
106 ev.data.ptr = fde;
109 if(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fde->fd, &ev)) {
116 static void fdevent_disconnect(fdevent *fde)
122 ev.data.ptr = fde;
129 epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fde->fd, &ev);
132 static void fdevent_update(fdevent *fde, unsigned events)
137 active = (fde->state & FDE_EVENTMASK) != 0;
141 ev.data.ptr = fde;
147 fde->state = (fde->state & FDE_STATEMASK) | events;
155 if(epoll_ctl(epoll_fd, EPOLL_CTL_MOD, fde->fd, &ev)) {
160 if(epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fde->fd, &ev)) {
170 if(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fde->fd, &ev)) {
181 fdevent *fde;
194 fde = ev->data.ptr;
197 fde->events |= FDE_READ;
200 fde->events |= FDE_WRITE;
203 fde->events |= FDE_ERROR;
205 if(fde->events) {
206 if(fde->state & FDE_PENDING) continue;
207 fde->state |= FDE_PENDING;
208 fdevent_plist_enqueue(fde);
234 static void fdevent_connect(fdevent *fde)
236 if(fde->fd >= select_n) {
237 select_n = fde->fd + 1;
241 static void fdevent_disconnect(fdevent *fde)
245 FD_CLR(fde->fd, &read_fds);
246 FD_CLR(fde->fd, &write_fds);
247 FD_CLR(fde->fd, &error_fds);
255 static void fdevent_update(fdevent *fde, unsigned events)
258 FD_SET(fde->fd, &read_fds);
260 FD_CLR(fde->fd, &read_fds);
263 FD_SET(fde->fd, &write_fds);
265 FD_CLR(fde->fd, &write_fds);
268 FD_SET(fde->fd, &error_fds);
270 FD_CLR(fde->fd, &error_fds);
273 fde->state = (fde->state & FDE_STATEMASK) | events;
279 fdevent *fde;
304 fde = fd_table[i];
305 if(fde == 0) FATAL("missing fde for fd %d\n", i);
307 fde->events |= events;
309 if(fde->state & FDE_PENDING) continue;
310 fde->state |= FDE_PENDING;
311 fdevent_plist_enqueue(fde);
318 static void fdevent_register(fdevent *fde)
320 if(fde->fd < 0) {
321 FATAL("bogus negative fd (%d)\n", fde->fd);
324 if(fde->fd >= fd_table_max) {
326 if(fde->fd > 32000) {
327 FATAL("bogus huuuuge fd (%d)\n", fde->fd);
333 while(fd_table_max <= fde->fd) {
343 fd_table[fde->fd] = fde;
346 static void fdevent_unregister(fdevent *fde)
348 if((fde->fd < 0) || (fde->fd >= fd_table_max)) {
349 FATAL("fd out of range (%d)\n", fde->fd);
352 if(fd_table[fde->fd] != fde) {
356 fd_table[fde->fd] = 0;
358 if(!(fde->state & FDE_DONT_CLOSE)) {
359 dump_fde(fde, "close");
360 close(fde->fd);
399 fdevent *fde = (fdevent*) malloc(sizeof(fdevent));
400 if(fde == 0) return 0;
401 fdevent_install(fde, fd, func, arg);
402 fde->state |= FDE_CREATED;
403 return fde;
406 void fdevent_destroy(fdevent *fde)
408 if(fde == 0) return;
409 if(!(fde->state & FDE_CREATED)) {
410 FATAL("fde %p not created by fdevent_create()\n", fde);
412 fdevent_remove(fde);
415 void fdevent_install(fdevent *fde, int fd, fd_func func, void *arg)
417 memset(fde, 0, sizeof(fdevent));
418 fde->state = FDE_ACTIVE;
419 fde->fd = fd;
420 fde->func = func;
421 fde->arg = arg;
426 fdevent_register(fde);
427 dump_fde(fde, "connect");
428 fdevent_connect(fde);
429 fde->state |= FDE_ACTIVE;
432 void fdevent_remove(fdevent *fde)
434 if(fde->state & FDE_PENDING) {
435 fdevent_plist_remove(fde);
438 if(fde->state & FDE_ACTIVE) {
439 fdevent_disconnect(fde);
440 dump_fde(fde, "disconnect");
441 fdevent_unregister(fde);
444 fde->state = 0;
445 fde->events = 0;
449 void fdevent_set(fdevent *fde, unsigned events)
453 if((fde->state & FDE_EVENTMASK) == events) return;
455 if(fde->state & FDE_ACTIVE) {
456 fdevent_update(fde, events);
457 dump_fde(fde, "update");
460 fde->state = (fde->state & FDE_STATEMASK) | events;
462 if(fde->state & FDE_PENDING) {
467 fde->events &= (~events);
468 if(fde->events == 0) {
469 fdevent_plist_remove(fde);
470 fde->state &= (~FDE_PENDING);
475 void fdevent_add(fdevent *fde, unsigned events)
478 fde, (fde->state & FDE_EVENTMASK) | (events & FDE_EVENTMASK));
481 void fdevent_del(fdevent *fde, unsigned events)
484 fde, (fde->state & FDE_EVENTMASK) & (~(events & FDE_EVENTMASK)));
489 fdevent *fde;
497 while((fde = fdevent_plist_dequeue())) {
498 unsigned events = fde->events;
499 fde->events = 0;
500 fde->state &= (~FDE_PENDING);
501 dump_fde(fde, "callback");
502 fde->func(fde->fd, events, fde->arg);