Changeset 35030

Show
Ignore:
Timestamp:
08/24/09 21:46:13 (4 years ago)
Author:
kazuho
Message:

now uses same strategy for epoll as libev does

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/c/picoev/trunk/picoev_epoll.c

    r35029 r35030  
    2828 */ 
    2929 
     30#include <errno.h> 
    3031#include <sys/epoll.h> 
    3132#include <unistd.h> 
     
    5556       socket was reopened, it might require re-assigning */ 
    5657    int old_events = BACKEND_GET_OLD_EVENTS(target->_backend); 
    57     if (target->events == 0) { 
     58    if (old_events != 0 && target->events == 0) { 
    5859      epoll_ctl(loop->epfd, EPOLL_CTL_DEL, fd, 0); 
    5960    } else { 
    6061      struct epoll_event ev; 
     62      int r; 
    6163      ev.events = ((target->events & PICOEV_READ) != 0 ? EPOLLIN : 0) 
    6264        | ((target->events & PICOEV_WRITE) != 0 ? EPOLLOUT : 0); 
    6365      ev.data.fd = fd; 
    64       if (old_events == 0 
    65           || epoll_ctl(loop->epfd, EPOLL_CTL_MOD, fd, &ev) != 0) { 
    66         int r = epoll_ctl(loop->epfd, EPOLL_CTL_ADD, fd, &ev); 
    67         assert(r == 0); 
     66      if (old_events != 0) { 
     67        if (epoll_ctl(loop->epfd, EPOLL_CTL_MOD, fd, &ev) != 0) { 
     68          assert(errno == ENOENT); 
     69          r = epoll_ctl(loop->epfd, EPOLL_CTL_ADD, fd, &ev); 
     70          assert(r == 0); 
     71        } 
     72      } else { 
     73        if (epoll_ctl(loop->epfd, EPOLL_CTL_ADD, fd, &ev) != 0) { 
     74          assert(errno == EEXIST); 
     75          r = epoll_ctl(loop->epfd, EPOLL_CTL_MOD, fd, &ev); 
     76          assert(r == 0); 
     77        } 
    6878      } 
    6979    } 
     
    177187                          target->cb_arg); 
    178188    } else { 
    179       CALL_EPOLL(loop->epfd, EPOLL_CTL_DEL, event->data.fd, 0); 
     189      epoll_ctl(loop->epfd, EPOLL_CTL_DEL, event->data.fd, 0); 
    180190    } 
    181191  }