Changeset 6514 for lang/c

Show
Ignore:
Timestamp:
02/10/08 23:04:38 (5 years ago)
Author:
frsyuki
Message:

lang/c/mpio: changed event::wait() interface and added buffered_kqueue system

Location:
lang/c/mpio/trunk/mp
Files:
2 added
11 modified

Legend:

Unmodified
Added
Removed
  • lang/c/mpio/trunk/mp/dispatch.h

    r6251 r6514  
    5353        short event; 
    5454        int ret; 
    55         typename event_t::backlog* result; 
    5655        while(1) { 
    57                 if( (ret = m_event.wait(&result)) < 0 ) { return ret; } 
    58                 while( result->next(&fd, &event, &pcb) ) { 
     56                if( (ret = m_event.wait()) < 0 ) { return ret; } 
     57                while( m_event.next(&fd, &event, &pcb) ) { 
    5958                        pcb->callback(fd, event, pcb->data); 
    6059                } 
  • lang/c/mpio/trunk/mp/event.h

    r6251 r6514  
    1111#      define MP_SYSTEM epoll 
    1212#    elif defined(__APPLE__) && defined(__MACH__) 
    13 #      define MP_SYSTEM kqueue 
     13//#      define MP_SYSTEM kqueue   // FIXME doesn't work 
     14#      define MP_SYSTEM select 
     15//#    elif defined(BSD)           // FIXME 
     16//#      define MP_SYSTEM kqueue 
    1417#    else 
    1518#      define MP_SYSTEM select 
  • lang/c/mpio/trunk/mp/event_class.h

    r6251 r6514  
    1111public: 
    1212        typedef Data data_t; 
    13         typedef system< event<Data> > system_t; 
    14         typedef typename system_t::backlog backlog; 
    1513public: 
    1614        event(size_t initial_length = 8); 
    17         int add(int fd, short event, data_t data); 
    18         int remove(int fd, short event); 
    19         int wait(backlog** rback); 
    20         int wait(backlog** rback, int timeout_msec); 
    21         data_t& data(int fd); 
    22         size_t size(void); 
     15        inline int add(int fd, short event, data_t data); 
     16        inline int remove(int fd, short event); 
     17        inline int wait(void); 
     18        inline int wait(int timeout_msec); 
     19        inline bool next(int* fd, short* revent); 
     20        inline bool next(int* fd, short* revent, data_t** data); 
     21        inline data_t& data(int fd); 
    2322private: 
    24         system_t m_system; 
     23        system m_system; 
    2524        std::vector<data_t> m_events; 
     25private: 
     26        event(const event&); 
     27}; 
     28 
     29 
     30template <> 
     31class event<void> { 
     32public: 
     33        typedef void data_t; 
     34public: 
     35        event(size_t initial_length = 8); 
     36        inline int add(int fd, short event); 
     37        inline int remove(int fd, short event); 
     38        inline int wait(void); 
     39        inline int wait(int timeout_msec); 
     40        inline bool next(int* fd, short* revent); 
     41private: 
     42        system m_system; 
    2643private: 
    2744        event(const event&); 
  • lang/c/mpio/trunk/mp/event_impl.h

    r6251 r6514  
    77template <typename Data> 
    88event<Data>::event(size_t initial_length) : 
    9         m_system(this), m_events(initial_length) {} 
     9        m_events(initial_length) {} 
     10event<void>::event(size_t initial_length) {} 
    1011 
    1112template <typename Data> 
     
    1819        return m_system.add(fd, event); 
    1920} 
     21int event<void>::add(int fd, short event) 
     22{ 
     23        return m_system.add(fd, event); 
     24} 
    2025 
    2126template <typename Data> 
     
    2429        return m_system.remove(fd, event); 
    2530} 
    26  
    27 template <typename Data> 
    28 int event<Data>::wait(backlog** rback) 
     31int event<void>::remove(int fd, short event) 
    2932{ 
    30         return m_system.wait(rback); 
     33        return m_system.remove(fd, event); 
    3134} 
    3235 
    3336template <typename Data> 
    34 int event<Data>::wait(backlog** rback, int timeout_msec) 
     37int event<Data>::wait(void) 
    3538{ 
    36         return m_system.wait(rback, timeout_msec); 
     39        return m_system.wait(); 
     40} 
     41int event<void>::wait(void) 
     42{ 
     43        return m_system.wait(); 
     44} 
     45 
     46template <typename Data> 
     47int event<Data>::wait(int timeout_msec) 
     48{ 
     49        return m_system.wait(timeout_msec); 
     50} 
     51int event<void>::wait(int timeout_msec) 
     52{ 
     53        return m_system.wait(timeout_msec); 
     54} 
     55 
     56template <typename Data> 
     57bool event<Data>::next(int* fd, short* revent) 
     58{ 
     59        return m_system.next(fd, revent); 
     60} 
     61bool event<void>::next(int* fd, short* revent) 
     62{ 
     63        return m_system.next(fd, revent); 
     64} 
     65 
     66template <typename Data> 
     67bool event<Data>::next(int* fd, short* revent, data_t** data) 
     68{ 
     69        if( m_system.next(fd, revent) ) { 
     70                *data = &m_events[*fd]; 
     71                return true; 
     72        } 
     73        return false; 
    3774} 
    3875 
     
    4380} 
    4481 
    45 template <typename Data> 
    46 size_t event<Data>::size(void) 
    47 { 
    48         return m_events.size(); 
    49 } 
    50  
    5182 
    5283}  // namespace mp 
  • lang/c/mpio/trunk/mp/io.erb.h

    r6251 r6514  
    166166        short event; 
    167167        int ret; 
    168         typename event_t::backlog* result; 
    169168        while(1) { 
    170                 if( (ret = m_event.wait(&result)) < 0 ) { return ret; } 
    171                 while( result->next(&fd, &event, &ed) ) { 
     169                if( (ret = m_event.wait()) < 0 ) { return ret; } 
     170                while( m_event.next(&fd, &event, &ed) ) { 
    172171                        ios::next_t next = (*ed->ios_callback)(ed->ios_obj, fd, event); 
    173172                        int next_fd = MP_IO_NEXT_FD(next); 
  • lang/c/mpio/trunk/mp/system/epoll.h

    r6251 r6514  
    1515const static short EV_WRITE = EPOLLOUT; 
    1616 
    17 template <typename Framework> 
    1817class system { 
    19 public: 
    20         struct backlog { 
    21                 backlog() {} 
    22                 backlog(Framework* framework) : _framework(framework) {} 
    23                 bool next(int* rfd, short* revent, typename Framework::data_t** rdata); 
    24                 typename Framework::data_t& next(void); 
    25                 int _count; 
    26                 int _num; 
    27                 struct kevent _results[MP_EVENT_EPOLL_MAX_RESULT]; 
    28                 Framework* _framework; 
    29         }; 
    3018public: 
    3119        system(); 
    3220        int add(int fd, short event); 
    3321        int remove(int fd, short event); 
    34         int wait(Framework* framework, backlog** rback); 
    35         int wait(Framework* framework, backlog** rback, int timeout_msec); 
     22        int wait(void); 
     23        int wait(int timeout_msec); 
     24private: 
     25        struct backlog { 
     26                backlog() {} 
     27                bool next(int* rfd, short* revent); 
     28                int count; 
     29                int num; 
     30                struct epoll_event results[MP_EVENT_EPOLL_MAX_RESULT]; 
     31        }; 
     32        backlog m_backlog; 
    3633private: 
    3734        int m_epfd; 
    38         backlog m_backlog; 
    3935}; 
    4036 
  • lang/c/mpio/trunk/mp/system/epoll_impl.h

    r6251 r6514  
    55 
    66 
    7 template <typename Framework> 
    8 system<Framework>::system() 
     7system::system() 
    98{ 
    109        m_epfd = epoll_create(MP_EVENT_EPOLL_MAX_RESULT); 
    1110} 
    1211 
    13 template <typename Framework> 
    14 int system<Framework>::add(int fd, short event) 
     12system::backlog::backlog() : count(0), num(0) {} 
     13 
     14int system::add(int fd, short event) 
    1515{ 
    1616        struct epoll_event ep; 
     
    2020} 
    2121 
    22 template <typename Framework> 
    23 int system<Framework>::remove(int fd, short event) 
     22int system::remove(int fd, short event) 
    2423{ 
    2524        return epoll_ctl(m_epfd, EPOLL_CTL_DEL, fd, NULL); 
    2625} 
    2726 
    28 template <typename Framework> 
    29 int system<Framework>::wait(Framework* framework, backlog** rback) 
     27int system::wait() 
    3028{ 
    31         *rback = &m_backlog; 
    32         return m_backlog._num = epoll_wait(m_epfd, m_backlog._results, sizeof(m_backlog._results), -1); 
     29        return m_backlog.num = epoll_wait(m_epfd, m_backlog.results, MP_EVENT_EPOLL_MAX_RESULT, -1); 
    3330} 
    3431 
    35 template <typename Framework> 
    36 int system<Framework>::wait(Framework* framework, backlog** rback, int timeout_msec) 
     32int system::wait(int timeout_msec) 
    3733{ 
    38         *rback = &m_backlog; 
    39         return m_backlog._num = epoll_wait(m_epfd, m_backlog._results, sizeof(m_backlog._results), timeout_msec); 
     34        return m_backlog.num = epoll_wait(m_epfd, m_backlog.results, MP_EVENT_EPOLL_MAX_RESULT, timeout_msec); 
    4035} 
    4136 
    42 template <typename Framework> 
    43 bool system<Framework>::backlog::next(int* rfd, short* revent, typename Framework::data_t** rdata) 
     37bool system::next(int* rfd, short* revent) 
    4438{ 
    45         if( _count >= _num ) { return false; } 
    46         struct epoll_event* const ep = &_results[_count]; 
     39        if( m_backlog.count >= m_backlog.num ) { return false; } 
     40        struct epoll_event* const ep = &m_backlog.results[m_backlog.count]; 
    4741        *rfd = ep->data.fd; 
    4842        *revent = ep->events; 
    49         *rdata = &_framework->data(*rfd); 
    5043        return true; 
    5144} 
  • lang/c/mpio/trunk/mp/system/kqueue.h

    r6251 r6514  
    1616const static short EV_WRITE = EVFILT_WRITE; 
    1717 
    18 template <typename Framework> 
    1918class system { 
    2019public: 
    21         struct backlog { 
    22                 backlog(Framework* framework) : _framework(framework) {} 
    23                 bool next(int* rfd, short* revent, typename Framework::data_t** rdata); 
    24                 typename Framework::data_t& next(void); 
    25                 int _count; 
    26                 int _num; 
    27                 struct kevent _results[MP_EVENT_KQUEUE_MAX_RESULT]; 
    28                 Framework* _framework; 
    29         }; 
    30 public: 
    31         system(Framework* framework); 
     20        system(); 
    3221        int add(int fd, short event); 
    3322        int remove(int fd, short event); 
    34         int wait(backlog** rback); 
    35         int wait(backlog** rback, int timeout_msec); 
     23        int wait(void); 
     24        int wait(int timeout_msec); 
     25        bool next(int* rfd, short* revent); 
     26private: 
     27        struct backlog { 
     28                backlog(); 
     29                int count; 
     30                int num; 
     31                struct kevent results[MP_EVENT_KQUEUE_MAX_RESULT]; 
     32        }; 
     33        backlog m_backlog; 
    3634private: 
    3735        int m_kqfd; 
    38         backlog m_backlog; 
    3936}; 
    4037 
     
    4340 
    4441#endif /* mp/system/kqueue.h */ 
     42 
  • lang/c/mpio/trunk/mp/system/kqueue_impl.h

    r6251 r6514  
    55 
    66 
    7 template <typename Framework> 
    8 system<Framework>::system(Framework* framework) : m_backlog(framework) 
     7system::system() 
    98{ 
    109        m_kqfd = kqueue(); 
    1110} 
    1211 
    13 template <typename Framework> 
    14 int system<Framework>::add(int fd, short event) 
     12system::backlog::backlog() : count(0), num(0) {} 
     13 
     14 
     15int system::add(int fd, short event) 
    1516{ 
    1617        struct kevent kev; 
     
    1920} 
    2021 
    21 template <typename Framework> 
    22 int system<Framework>::remove(int fd, short event) 
     22int system::remove(int fd, short event) 
    2323{ 
    2424        if( event & EVFILT_READ && event & EVFILT_WRITE ) { 
     
    2727                EV_SET(&kev[1], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); 
    2828                return kevent(m_kqfd, kev, 2, NULL, 0, NULL); 
    29         } else { 
    30                 struct kevent kev; 
    31                 EV_SET(&kev, fd, event, EV_ADD, 0, 0, NULL); 
    32                 return kevent(m_kqfd, &kev, 1, NULL, 0, NULL); 
    3329        } 
    34         return -1;  /* never come here */ 
     30        struct kevent kev; 
     31        EV_SET(&kev, fd, event, EV_ADD, 0, 0, NULL); 
     32        return kevent(m_kqfd, &kev, 1, NULL, 0, NULL); 
    3533} 
    3634 
    37 template <typename Framework> 
    38 int system<Framework>::wait(backlog** rback) 
     35int system::wait() 
    3936{ 
    40         *rback = &m_backlog; 
    41         m_backlog._count = 0; 
    42         return m_backlog._num = kevent(m_kqfd, NULL, 0, m_backlog._results, sizeof(m_backlog._results), NULL); 
     37        m_backlog.count = 0; 
     38        return m_backlog.num = kevent(m_kqfd, NULL, 0, m_backlog.results, MP_EVENT_KQUEUE_MAX_RESULT, NULL); 
    4339} 
    4440 
    45 template <typename Framework> 
    46 int system<Framework>::wait(backlog** rback, int timeout_msec) 
     41int system::wait(int timeout_msec) 
    4742{ 
    4843        struct timespec ts; 
    4944        ts.tv_sec  = timeout_msec / 1000; 
    5045        ts.tv_nsec = (timeout_msec % 1000) * 1000000; 
    51         *rback = &m_backlog; 
    52         m_backlog._count = 0; 
    53         return m_backlog._num = kevent(m_kqfd, NULL, 0, m_backlog._results, sizeof(m_backlog._results), &ts); 
     46        m_backlog.count = 0; 
     47        return m_backlog.num = kevent(m_kqfd, NULL, 0, m_backlog.results, MP_EVENT_KQUEUE_MAX_RESULT, &ts); 
    5448} 
    5549 
    56 template <typename Framework> 
    57 bool system<Framework>::backlog::next(int* rfd, short* revent, typename Framework::data_t** rdata) 
     50bool system::next(int* rfd, short* revent) 
    5851{ 
    59         if( _count >= _num ) { return false; } 
    60         struct kevent* const kev = &_results[_count]; 
    61         ++_count; 
     52        if( m_backlog.count >= m_backlog.num ) { return false; } 
     53        struct kevent* const kev = &m_backlog.results[m_backlog.count]; 
     54        ++m_backlog.count; 
    6255        *rfd = kev->ident; 
    6356        *revent = kev->filter; 
    64         _framework->data(*rfd); 
    65         *rdata = &_framework->data(*rfd); 
    6657        return true; 
    6758} 
     
    7162 
    7263#endif /* mp/system/kqueue_impl.h */ 
     64 
  • lang/c/mpio/trunk/mp/system/select.h

    r6251 r6514  
    1212const static short EV_WRITE = 0x02; 
    1313 
    14 template <typename Framework> 
    1514class system { 
    1615public: 
    17         struct backlog { 
    18                 backlog(Framework* framework) : _framework(framework) {} 
    19                 bool next(int* rfd, short* revent, typename Framework::data_t** rdata); 
    20                 typename Framework::data_t& next(void); 
    21                 fd_set _readset; 
    22                 fd_set _writeset; 
    23                 fd_set* _source_readset; 
    24                 fd_set* _source_writeset; 
    25                 int _nfd; 
    26                 int _count; 
    27                 int _num; 
    28                 int _size; 
    29                 Framework* _framework; 
    30         }; 
    31 public: 
    32         system(Framework* framework); 
     16        system(); 
    3317        int add(int fd, short event); 
    3418        int remove(int fd, short event); 
    35         int wait(backlog** rback); 
    36         int wait(backlog** rback, int timeout_msec); 
     19        int wait(void); 
     20        int wait(int timeout_msec); 
     21        bool next(int* rfd, short* revent); 
     22private: 
     23        struct backlog { 
     24                backlog(); 
     25                int nfd; 
     26                int count; 
     27                int size; 
     28                int num; 
     29                fd_set readset; 
     30                fd_set writeset; 
     31        }; 
     32        backlog m_backlog; 
    3733private: 
    3834        int m_maxfd; 
    3935        fd_set m_readset; 
    4036        fd_set m_writeset; 
    41         backlog m_backlog; 
    4237        // FIXME: selectの第一引数が必要 
    4338}; 
  • lang/c/mpio/trunk/mp/system/select_impl.h

    r6251 r6514  
    44namespace mp { 
    55 
    6 template <typename Framework> 
    7 system<Framework>::system(Framework* framework) : m_backlog(framework) 
     6 
     7system::system() : m_maxfd(0) 
    88{ 
    9         m_maxfd = 0; 
    109        FD_ZERO(&m_readset); 
    1110        FD_ZERO(&m_writeset); 
    1211} 
    1312 
    14 template <typename Framework> 
    15 int system<Framework>::add(int fd, short event) 
     13system::backlog::backlog() : nfd(0), count(0), size(0), num(0) {} 
     14 
     15int system::add(int fd, short event) 
    1616{ 
    1717        if( fd > m_maxfd ) { m_maxfd = fd; } 
     
    2525} 
    2626 
    27 template <typename Framework> 
    28 int system<Framework>::remove(int fd, short event) 
     27int system::remove(int fd, short event) 
    2928{ 
    30         // FIXME m_maxfdはどすうる?m_backlog._framework->size(); 
     29        // FIXME m_maxfdはどすうる?m_framework->size(); 
    3130        FD_CLR(fd, &m_readset); 
    3231        FD_CLR(fd, &m_writeset); 
     
    3433} 
    3534 
    36 template <typename Framework> 
    37 int system<Framework>::wait(backlog** rback) 
     35int system::wait(void) 
    3836{ 
    39         FD_COPY(&m_readset,  &m_backlog._readset); 
    40         FD_COPY(&m_writeset, &m_backlog._writeset); 
    41         m_backlog._size = m_maxfd+1; 
    42         *rback = &m_backlog; 
    43         m_backlog._count = 0; 
    44         m_backlog._nfd = 0; 
    45         return m_backlog._num = select(m_backlog._size, &m_backlog._readset, &m_backlog._writeset, NULL, NULL); 
     37        FD_COPY(&m_readset,  &m_backlog.readset); 
     38        FD_COPY(&m_writeset, &m_backlog.writeset); 
     39        m_backlog.nfd = 0; 
     40        m_backlog.count = 0; 
     41        m_backlog.size = m_maxfd+1; 
     42        return m_backlog.num = select(m_backlog.size, &m_backlog.readset, &m_backlog.writeset, NULL, NULL); 
    4643} 
    4744 
    48 template <typename Framework> 
    49 int system<Framework>::wait(backlog** rback, int timeout_msec) 
     45int system::wait(int timeout_msec) 
    5046{ 
    5147        struct timeval tv; 
    5248        tv.tv_sec = timeout_msec / 1000; 
    5349        tv.tv_usec = (timeout_msec % 1000) * 1000; 
    54         FD_COPY(&m_readset,  &m_backlog._readset); 
    55         FD_COPY(&m_writeset, &m_backlog._writeset); 
    56         m_backlog._size = m_maxfd+1; 
    57         *rback = &m_backlog; 
    58         m_backlog._count = 0; 
    59         m_backlog._nfd = 0; 
    60         return m_backlog._num = select(m_backlog._size, &m_backlog._readset, &m_backlog._writeset, NULL, &tv); 
     50        FD_COPY(&m_readset,  &m_backlog.readset); 
     51        FD_COPY(&m_writeset, &m_backlog.writeset); 
     52        m_backlog.nfd = 0; 
     53        m_backlog.count = 0; 
     54        m_backlog.size = m_maxfd+1; 
     55        return m_backlog.num = select(m_backlog.size, &m_backlog.readset, &m_backlog.writeset, NULL, &tv); 
    6156} 
    6257 
    63 template <typename Framework> 
    64 bool system<Framework>::backlog::next(int* rfd, short* revent, typename Framework::data_t** rdata) 
     58bool system::next(int* rfd, short* revent) 
    6559{ 
    66         if( _count >= _num ) { return false; } 
    67         while( _nfd < _size ) { 
     60        if( m_backlog.count >= m_backlog.num ) { return false; } 
     61        while( m_backlog.nfd < m_backlog.size ) { 
    6862                short event = 0; 
    69                 if( FD_ISSET(_nfd, &_readset) ) { 
     63                if( FD_ISSET(m_backlog.nfd, &m_backlog.readset) ) { 
    7064                        event |= EV_READ; 
    7165                } 
    72                 if( FD_ISSET(_nfd, &_writeset) ) { 
     66                if( FD_ISSET(m_backlog.nfd, &m_backlog.writeset) ) { 
    7367                        event |= EV_WRITE; 
    7468                } 
    7569                if( event != 0 ) { 
    76                         *rfd = _nfd; 
     70                        *rfd = m_backlog.nfd; 
    7771                        *revent = event; 
    78                         *rdata = &_framework->data(_nfd); 
    79                         ++_nfd; 
    80                         ++_count; 
     72                        ++m_backlog.nfd; 
     73                        ++m_backlog.count; 
    8174                        return true; 
    8275                } 
    83                 ++_nfd; 
     76                ++m_backlog.nfd; 
    8477        } 
    8578        return false;