- Timestamp:
- 02/10/08 23:04:38 (5 years ago)
- Location:
- lang/c/mpio/trunk/mp
- Files:
-
- 2 added
- 11 modified
-
dispatch.h (modified) (1 diff)
-
event.h (modified) (1 diff)
-
event_class.h (modified) (1 diff)
-
event_impl.h (modified) (4 diffs)
-
io.erb.h (modified) (1 diff)
-
system/buffered_kqueue.h (added)
-
system/buffered_kqueue_impl.h (added)
-
system/epoll.h (modified) (1 diff)
-
system/epoll_impl.h (modified) (2 diffs)
-
system/kqueue.h (modified) (2 diffs)
-
system/kqueue_impl.h (modified) (4 diffs)
-
system/select.h (modified) (1 diff)
-
system/select_impl.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/c/mpio/trunk/mp/dispatch.h
r6251 r6514 53 53 short event; 54 54 int ret; 55 typename event_t::backlog* result;56 55 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) ) { 59 58 pcb->callback(fd, event, pcb->data); 60 59 } -
lang/c/mpio/trunk/mp/event.h
r6251 r6514 11 11 # define MP_SYSTEM epoll 12 12 # 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 14 17 # else 15 18 # define MP_SYSTEM select -
lang/c/mpio/trunk/mp/event_class.h
r6251 r6514 11 11 public: 12 12 typedef Data data_t; 13 typedef system< event<Data> > system_t;14 typedef typename system_t::backlog backlog;15 13 public: 16 14 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); 23 22 private: 24 system _tm_system;23 system m_system; 25 24 std::vector<data_t> m_events; 25 private: 26 event(const event&); 27 }; 28 29 30 template <> 31 class event<void> { 32 public: 33 typedef void data_t; 34 public: 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); 41 private: 42 system m_system; 26 43 private: 27 44 event(const event&); -
lang/c/mpio/trunk/mp/event_impl.h
r6251 r6514 7 7 template <typename Data> 8 8 event<Data>::event(size_t initial_length) : 9 m_system(this), m_events(initial_length) {} 9 m_events(initial_length) {} 10 event<void>::event(size_t initial_length) {} 10 11 11 12 template <typename Data> … … 18 19 return m_system.add(fd, event); 19 20 } 21 int event<void>::add(int fd, short event) 22 { 23 return m_system.add(fd, event); 24 } 20 25 21 26 template <typename Data> … … 24 29 return m_system.remove(fd, event); 25 30 } 26 27 template <typename Data> 28 int event<Data>::wait(backlog** rback) 31 int event<void>::remove(int fd, short event) 29 32 { 30 return m_system. wait(rback);33 return m_system.remove(fd, event); 31 34 } 32 35 33 36 template <typename Data> 34 int event<Data>::wait( backlog** rback, int timeout_msec)37 int event<Data>::wait(void) 35 38 { 36 return m_system.wait(rback, timeout_msec); 39 return m_system.wait(); 40 } 41 int event<void>::wait(void) 42 { 43 return m_system.wait(); 44 } 45 46 template <typename Data> 47 int event<Data>::wait(int timeout_msec) 48 { 49 return m_system.wait(timeout_msec); 50 } 51 int event<void>::wait(int timeout_msec) 52 { 53 return m_system.wait(timeout_msec); 54 } 55 56 template <typename Data> 57 bool event<Data>::next(int* fd, short* revent) 58 { 59 return m_system.next(fd, revent); 60 } 61 bool event<void>::next(int* fd, short* revent) 62 { 63 return m_system.next(fd, revent); 64 } 65 66 template <typename Data> 67 bool 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; 37 74 } 38 75 … … 43 80 } 44 81 45 template <typename Data>46 size_t event<Data>::size(void)47 {48 return m_events.size();49 }50 51 82 52 83 } // namespace mp -
lang/c/mpio/trunk/mp/io.erb.h
r6251 r6514 166 166 short event; 167 167 int ret; 168 typename event_t::backlog* result;169 168 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) ) { 172 171 ios::next_t next = (*ed->ios_callback)(ed->ios_obj, fd, event); 173 172 int next_fd = MP_IO_NEXT_FD(next); -
lang/c/mpio/trunk/mp/system/epoll.h
r6251 r6514 15 15 const static short EV_WRITE = EPOLLOUT; 16 16 17 template <typename Framework>18 17 class 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 };30 18 public: 31 19 system(); 32 20 int add(int fd, short event); 33 21 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); 24 private: 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; 36 33 private: 37 34 int m_epfd; 38 backlog m_backlog;39 35 }; 40 36 -
lang/c/mpio/trunk/mp/system/epoll_impl.h
r6251 r6514 5 5 6 6 7 template <typename Framework> 8 system<Framework>::system() 7 system::system() 9 8 { 10 9 m_epfd = epoll_create(MP_EVENT_EPOLL_MAX_RESULT); 11 10 } 12 11 13 template <typename Framework> 14 int system<Framework>::add(int fd, short event) 12 system::backlog::backlog() : count(0), num(0) {} 13 14 int system::add(int fd, short event) 15 15 { 16 16 struct epoll_event ep; … … 20 20 } 21 21 22 template <typename Framework> 23 int system<Framework>::remove(int fd, short event) 22 int system::remove(int fd, short event) 24 23 { 25 24 return epoll_ctl(m_epfd, EPOLL_CTL_DEL, fd, NULL); 26 25 } 27 26 28 template <typename Framework> 29 int system<Framework>::wait(Framework* framework, backlog** rback) 27 int system::wait() 30 28 { 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); 33 30 } 34 31 35 template <typename Framework> 36 int system<Framework>::wait(Framework* framework, backlog** rback, int timeout_msec) 32 int system::wait(int timeout_msec) 37 33 { 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); 40 35 } 41 36 42 template <typename Framework> 43 bool system<Framework>::backlog::next(int* rfd, short* revent, typename Framework::data_t** rdata) 37 bool system::next(int* rfd, short* revent) 44 38 { 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]; 47 41 *rfd = ep->data.fd; 48 42 *revent = ep->events; 49 *rdata = &_framework->data(*rfd);50 43 return true; 51 44 } -
lang/c/mpio/trunk/mp/system/kqueue.h
r6251 r6514 16 16 const static short EV_WRITE = EVFILT_WRITE; 17 17 18 template <typename Framework>19 18 class system { 20 19 public: 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(); 32 21 int add(int fd, short event); 33 22 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); 26 private: 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; 36 34 private: 37 35 int m_kqfd; 38 backlog m_backlog;39 36 }; 40 37 … … 43 40 44 41 #endif /* mp/system/kqueue.h */ 42 -
lang/c/mpio/trunk/mp/system/kqueue_impl.h
r6251 r6514 5 5 6 6 7 template <typename Framework> 8 system<Framework>::system(Framework* framework) : m_backlog(framework) 7 system::system() 9 8 { 10 9 m_kqfd = kqueue(); 11 10 } 12 11 13 template <typename Framework> 14 int system<Framework>::add(int fd, short event) 12 system::backlog::backlog() : count(0), num(0) {} 13 14 15 int system::add(int fd, short event) 15 16 { 16 17 struct kevent kev; … … 19 20 } 20 21 21 template <typename Framework> 22 int system<Framework>::remove(int fd, short event) 22 int system::remove(int fd, short event) 23 23 { 24 24 if( event & EVFILT_READ && event & EVFILT_WRITE ) { … … 27 27 EV_SET(&kev[1], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL); 28 28 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);33 29 } 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); 35 33 } 36 34 37 template <typename Framework> 38 int system<Framework>::wait(backlog** rback) 35 int system::wait() 39 36 { 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); 43 39 } 44 40 45 template <typename Framework> 46 int system<Framework>::wait(backlog** rback, int timeout_msec) 41 int system::wait(int timeout_msec) 47 42 { 48 43 struct timespec ts; 49 44 ts.tv_sec = timeout_msec / 1000; 50 45 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); 54 48 } 55 49 56 template <typename Framework> 57 bool system<Framework>::backlog::next(int* rfd, short* revent, typename Framework::data_t** rdata) 50 bool system::next(int* rfd, short* revent) 58 51 { 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; 62 55 *rfd = kev->ident; 63 56 *revent = kev->filter; 64 _framework->data(*rfd);65 *rdata = &_framework->data(*rfd);66 57 return true; 67 58 } … … 71 62 72 63 #endif /* mp/system/kqueue_impl.h */ 64 -
lang/c/mpio/trunk/mp/system/select.h
r6251 r6514 12 12 const static short EV_WRITE = 0x02; 13 13 14 template <typename Framework>15 14 class system { 16 15 public: 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(); 33 17 int add(int fd, short event); 34 18 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); 22 private: 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; 37 33 private: 38 34 int m_maxfd; 39 35 fd_set m_readset; 40 36 fd_set m_writeset; 41 backlog m_backlog;42 37 // FIXME: selectの第一引数が必要 43 38 }; -
lang/c/mpio/trunk/mp/system/select_impl.h
r6251 r6514 4 4 namespace mp { 5 5 6 template <typename Framework> 7 system <Framework>::system(Framework* framework) : m_backlog(framework)6 7 system::system() : m_maxfd(0) 8 8 { 9 m_maxfd = 0;10 9 FD_ZERO(&m_readset); 11 10 FD_ZERO(&m_writeset); 12 11 } 13 12 14 template <typename Framework> 15 int system<Framework>::add(int fd, short event) 13 system::backlog::backlog() : nfd(0), count(0), size(0), num(0) {} 14 15 int system::add(int fd, short event) 16 16 { 17 17 if( fd > m_maxfd ) { m_maxfd = fd; } … … 25 25 } 26 26 27 template <typename Framework> 28 int system<Framework>::remove(int fd, short event) 27 int system::remove(int fd, short event) 29 28 { 30 // FIXME m_maxfdはどすうる?m_ backlog._framework->size();29 // FIXME m_maxfdはどすうる?m_framework->size(); 31 30 FD_CLR(fd, &m_readset); 32 31 FD_CLR(fd, &m_writeset); … … 34 33 } 35 34 36 template <typename Framework> 37 int system<Framework>::wait(backlog** rback) 35 int system::wait(void) 38 36 { 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); 46 43 } 47 44 48 template <typename Framework> 49 int system<Framework>::wait(backlog** rback, int timeout_msec) 45 int system::wait(int timeout_msec) 50 46 { 51 47 struct timeval tv; 52 48 tv.tv_sec = timeout_msec / 1000; 53 49 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); 61 56 } 62 57 63 template <typename Framework> 64 bool system<Framework>::backlog::next(int* rfd, short* revent, typename Framework::data_t** rdata) 58 bool system::next(int* rfd, short* revent) 65 59 { 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 ) { 68 62 short event = 0; 69 if( FD_ISSET( _nfd, &_readset) ) {63 if( FD_ISSET(m_backlog.nfd, &m_backlog.readset) ) { 70 64 event |= EV_READ; 71 65 } 72 if( FD_ISSET( _nfd, &_writeset) ) {66 if( FD_ISSET(m_backlog.nfd, &m_backlog.writeset) ) { 73 67 event |= EV_WRITE; 74 68 } 75 69 if( event != 0 ) { 76 *rfd = _nfd;70 *rfd = m_backlog.nfd; 77 71 *revent = event; 78 *rdata = &_framework->data(_nfd); 79 ++_nfd; 80 ++_count; 72 ++m_backlog.nfd; 73 ++m_backlog.count; 81 74 return true; 82 75 } 83 ++ _nfd;76 ++m_backlog.nfd; 84 77 } 85 78 return false;
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)