Changeset 6633
- Timestamp:
- 02/13/08 17:48:48 (5 years ago)
- Location:
- lang/c/mpio/trunk/mp
- Files:
-
- 12 modified
-
dispatch.h (modified) (3 diffs)
-
event_class.h (modified) (2 diffs)
-
event_impl.h (modified) (2 diffs)
-
mempool.erb.h (modified) (2 diffs)
-
system/buffered_kqueue.h (modified) (3 diffs)
-
system/buffered_kqueue_impl.h (modified) (2 diffs)
-
system/epoll.h (modified) (1 diff)
-
system/epoll_impl.h (modified) (1 diff)
-
system/kqueue.h (modified) (3 diffs)
-
system/kqueue_impl.h (modified) (3 diffs)
-
system/select.h (modified) (1 diff)
-
system/select_impl.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
lang/c/mpio/trunk/mp/dispatch.h
r6514 r6633 30 30 31 31 32 template <> 33 class dispatch<void> { 34 public: 35 typedef Data data_t; 36 typedef std::function<void (int, short)> callback_t; 37 public: 38 dispatch(size_t initial_length = 8); 39 int add(int fd, short event, callback_t callback); 40 int remove(int fd, short event); 41 int run(void); 42 private: 43 struct cb_t { 44 cb_t() {} 45 cb_t(callback_t c) : callback(c) {} 46 callback_t callback; 47 }; 48 typedef event<cb_t> event_t; 49 event_t m_event; 50 }; 51 32 52 33 53 template <typename Data> 34 54 dispatch<Data>::dispatch(size_t initial_length) : m_event(initial_length) {} 55 dispatch<void>::dispatch(size_t initial_length) : m_event(initial_length) {} 35 56 36 57 template <typename Data> … … 39 60 return m_event.add(fd, event, cb_t(callback, data)); 40 61 } 62 int dispatch<void>::add(int fd, short event, callback_t callback) 63 { 64 return m_event.add(fd, event, cb_t(callback)); 65 } 66 41 67 42 68 template <typename Data> 43 69 int dispatch<Data>::remove(int fd, short event) 70 { 71 return m_event.remove(fd, event); 72 } 73 int dispatch<void>::remove(int fd, short event) 44 74 { 45 75 return m_event.remove(fd, event); … … 60 90 } 61 91 } 92 int dispatch<void>::run(void) 93 { 94 cb_t* pcb; 95 int fd; 96 short event; 97 int ret; 98 while(1) { 99 if( (ret = m_event.wait()) < 0 ) { return ret; } 100 while( m_event.next(&fd, &event, &pcb) ) { 101 pcb->callback(fd, event); 102 } 103 } 104 } 62 105 63 106 -
lang/c/mpio/trunk/mp/event_class.h
r6514 r6633 14 14 event(size_t initial_length = 8); 15 15 inline int add(int fd, short event, data_t data); 16 inline int remove(int fd, short event); 16 inline int remove(int fd, short oldevent); 17 inline int modify(int fd, short oldevent, short newevent); 17 18 inline int wait(void); 18 19 inline int wait(int timeout_msec); … … 35 36 event(size_t initial_length = 8); 36 37 inline int add(int fd, short event); 37 inline int remove(int fd, short event); 38 inline int remove(int fd, short oldevent); 39 inline int modify(int fd, short oldevent, short newevent); 38 40 inline int wait(void); 39 41 inline int wait(int timeout_msec); -
lang/c/mpio/trunk/mp/event_impl.h
r6514 r6633 14 14 { 15 15 if( static_cast<size_t>(fd) >= m_events.size() ) { 16 m_events.resize( m_events.size() * 2 ); 16 m_events.resize(fd + 1); 17 m_events.resize(m_events.capacity()); 17 18 } 18 19 m_events[fd] = data; … … 25 26 26 27 template <typename Data> 27 int event<Data>::remove(int fd, short event)28 int event<Data>::remove(int fd, short oldevent) 28 29 { 29 return m_system.remove(fd, event);30 return m_system.remove(fd, oldevent); 30 31 } 31 int event<void>::remove(int fd, short event)32 int event<void>::remove(int fd, short oldevent) 32 33 { 33 return m_system.remove(fd, event); 34 return m_system.remove(fd, oldevent); 35 } 36 37 template <typename Data> 38 int event<Data>::modify(int fd, short oldevent, short newevent) 39 { 40 return m_system.modify(fd, oldevent, newevent); 41 } 42 int event<void>::modify(int fd, short oldevent, short newevent) 43 { 44 return m_system.modify(fd, oldevent, newevent); 34 45 } 35 46 -
lang/c/mpio/trunk/mp/mempool.erb.h
r6251 r6633 29 29 template <size_t size> 30 30 inline void* malloc(); 31 public: 32 template <typename T> 33 inline void destroy(T* x) { 34 x->~T(); 35 this->free(x); 36 } 37 <% def args(n, sep = "", &block) 38 Array.new(n) {|i| yield i+1 } .join(sep) 39 end -%> 40 <% (0..16).each do |n| -%> 41 template <typename T<%= args(n) {|i| ", typename A#{i}" } %>> 42 inline T* construct(<%= args(n, ", ") {|i| "A#{i} a#{i}" } %>) { 43 return new( this->malloc<sizeof(T)>() ) T(<%= args(n, ", ") {|i| "a#{i}" } %>); 44 } 45 <% end -%> 31 46 private: 32 47 struct chunk_t { … … 49 64 private: 50 65 mempool(const mempool&); 51 public:52 template <typename T>53 inline void destroy(T* x) {54 x->~T();55 this->free(x);56 }57 <%58 def args(n, sep = "", &block)59 Array.new(n) {|i| yield i+1 } .join(sep)60 end61 -%>62 <% (0..16).each do |n| -%>63 template <typename T<%= args(n) {|i| ", typename A#{i}" } %>>64 inline T* construct(<%= args(n, ", ") {|i| "A#{i} a#{i}" } %>) {65 return new( this->malloc<sizeof(T)>() ) T(<%= args(n, ", ") {|i| "a#{i}" } %>);66 }67 <% end -%>68 66 }; 69 67 -
lang/c/mpio/trunk/mp/system/buffered_kqueue.h
r6514 r6633 13 13 namespace mp { 14 14 15 16 const static short EV_READ = EVFILT_READ; 17 const static short EV_WRITE = EVFILT_WRITE; 15 static const short EV_READ = 0x01; 16 static const short EV_WRITE = 0x02; 18 17 19 18 class system { … … 21 20 system(); 22 21 int add(int fd, short event); 23 int remove(int fd, short event); 22 int remove(int fd, short oldevent); 23 int modify(int fd, short oldevent, short newevent); 24 24 int wait(void); 25 25 int wait(int timeout_msec); … … 37 37 private: 38 38 int m_kqfd; 39 static const short EVFILT_MAP[3]; 39 40 }; 40 41 -
lang/c/mpio/trunk/mp/system/buffered_kqueue_impl.h
r6514 r6633 4 4 namespace mp { 5 5 6 7 const short system::EVFILT_MAP[3] = {0, EVFILT_READ, EVFILT_WRITE}; 6 8 7 9 system::system() … … 16 18 { 17 19 struct kevent kev; 18 EV_SET(&kev, fd, event, EV_ADD, 0, 0, NULL); 19 m_buffered.push_back(kev); 20 if( event & EV_READ ) { 21 EV_SET(&kev, fd, EV_READ, EV_ADD, 0, 0, NULL); 22 m_buffered.push_back(kev); 23 } 24 if( event & EV_WRITE ) { 25 EV_SET(&kev, fd, EV_WRITE, EV_ADD, 0, 0, NULL); 26 m_buffered.push_back(kev); 27 } 20 28 return 0; 21 29 } 22 30 23 int system::remove(int fd, short event)31 int system::remove(int fd, short oldevent) 24 32 { 25 33 struct kevent kev; 26 if( event & EV_READ ) {34 if( oldevent & EV_READ ) { 27 35 EV_SET(&kev, fd, EV_READ, EV_DELETE, 0, 0, NULL); 28 36 m_buffered.push_back(kev); 29 37 } 30 if( event & EV_WRITE ) {38 if( oldevent & EV_WRITE ) { 31 39 EV_SET(&kev, fd, EV_WRITE, EV_DELETE, 0, 0, NULL); 32 40 m_buffered.push_back(kev); 33 41 } 42 return 0; 43 } 44 45 int system::modify(int fd, short oldevent, short newevent) 46 { 47 short add_event = ~oldevent & newevent; 48 struct kevent kev; 49 if( add_event ) { 50 EV_SET(&kev, fd, EVFILT_MAP[add_event], EV_ADD, 0, 0, NULL); 51 } else { 52 short delete_event = oldevent & ~newevent; 53 EV_SET(&kev, fd, EVFILT_MAP[delete_event], EV_DELETE, 0, 0, NULL); 54 } 55 m_buffered.push_back(kev); 34 56 return 0; 35 57 } -
lang/c/mpio/trunk/mp/system/epoll.h
r6514 r6633 19 19 system(); 20 20 int add(int fd, short event); 21 int remove(int fd, short event); 21 int remove(int fd, short oldevent); 22 int modify(int fd, short oldevent, short newevent); 22 23 int wait(void); 23 24 int wait(int timeout_msec); 25 bool next(int* rfd, short* revent); 24 26 private: 25 27 struct backlog { 26 backlog() {} 27 bool next(int* rfd, short* revent); 28 backlog(); 28 29 int count; 29 30 int num; -
lang/c/mpio/trunk/mp/system/epoll_impl.h
r6514 r6633 20 20 } 21 21 22 int system::remove(int fd, short event)22 int system::remove(int fd, short oldevent) 23 23 { 24 24 return epoll_ctl(m_epfd, EPOLL_CTL_DEL, fd, NULL); 25 } 26 27 int system::modify(int fd, short oldevent, short newevent) 28 { 29 struct epoll_event ep; 30 ep.events = newevent; 31 ep.data.fd = fd; 32 return epoll_ctl(m_epfd, EPOLL_CTL_MOD, fd, &ep); 25 33 } 26 34 -
lang/c/mpio/trunk/mp/system/kqueue.h
r6514 r6633 12 12 namespace mp { 13 13 14 15 const static short EV_READ = EVFILT_READ; 16 const static short EV_WRITE = EVFILT_WRITE; 14 static const short EV_READ = 0x01; 15 static const short EV_WRITE = 0x02; 17 16 18 17 class system { … … 20 19 system(); 21 20 int add(int fd, short event); 22 int remove(int fd, short event); 21 int remove(int fd, short oldevent); 22 int modify(int fd, short oldevent, short newevent); 23 23 int wait(void); 24 24 int wait(int timeout_msec); … … 34 34 private: 35 35 int m_kqfd; 36 static const short EVFILT_MAP[3]; 36 37 }; 37 38 -
lang/c/mpio/trunk/mp/system/kqueue_impl.h
r6514 r6633 4 4 namespace mp { 5 5 6 7 const short system::EVFILT_MAP[3] = {0, EVFILT_READ, EVFILT_WRITE}; 6 8 7 9 system::system() … … 15 17 int system::add(int fd, short event) 16 18 { 19 if( event == EV_READ | EV_WRITE ) { 20 struct kevent kev[2]; 21 EV_SET(&kev[0], fd, EVFILT_READ, EV_ADD, 0, 0, NULL); 22 EV_SET(&kev[1], fd, EVFILT_WRITE, EV_ADD, 0, 0, NULL); 23 return kevent(m_kqfd, kev, 2, NULL, 0, NULL); 24 } 17 25 struct kevent kev; 18 EV_SET(&kev, fd, event, EV_ADD, 0, 0, NULL);26 EV_SET(&kev, fd, EVFILT_MAP[event], EV_ADD, 0, 0, NULL); 19 27 return kevent(m_kqfd, &kev, 1, NULL, 0, NULL); 20 28 } 21 29 22 int system::remove(int fd, short event)30 int system::remove(int fd, short oldevent) 23 31 { 24 if( event & EVFILT_READ && event & EVFILT_WRITE ) {32 if( oldevent == EV_READ | EV_WRITE ) { 25 33 struct kevent kev[2]; 26 34 EV_SET(&kev[0], fd, EVFILT_READ, EV_DELETE, 0, 0, NULL); … … 29 37 } 30 38 struct kevent kev; 31 EV_SET(&kev, fd, event, EV_ADD, 0, 0, NULL); 39 EV_SET(&kev, fd, EVFILT_MAP[oldevent], EV_DELETE, 0, 0, NULL); 40 return kevent(m_kqfd, &kev, 1, NULL, 0, NULL); 41 } 42 43 int system::modify(int fd, short oldevent, short newevent) 44 { 45 short add_event = ~oldevent & newevent; 46 struct kevent kev; 47 if( add_event ) { 48 EV_SET(&kev, fd, EVFILT_MAP[add_event], EV_ADD, 0, 0, NULL); 49 } else { 50 short delete_event = oldevent & ~newevent; 51 EV_SET(&kev, fd, EVFILT_MAP[delete_event], EV_DELETE, 0, 0, NULL); 52 } 32 53 return kevent(m_kqfd, &kev, 1, NULL, 0, NULL); 33 54 } -
lang/c/mpio/trunk/mp/system/select.h
r6514 r6633 16 16 system(); 17 17 int add(int fd, short event); 18 int remove(int fd, short event); 18 int remove(int fd, short oldevent); 19 int modify(int fd, short oldevent, short newevent); 19 20 int wait(void); 20 21 int wait(int timeout_msec); -
lang/c/mpio/trunk/mp/system/select_impl.h
r6514 r6633 25 25 } 26 26 27 int system::remove(int fd, short event)27 int system::remove(int fd, short oldevent) 28 28 { 29 29 // FIXME m_maxfdはどすうる?m_framework->size(); 30 30 FD_CLR(fd, &m_readset); 31 31 FD_CLR(fd, &m_writeset); 32 return 0; 33 } 34 35 int system::modify(int fd, short oldevent, short newevent) 36 { 37 FD_CLR(fd, &m_readset); 38 FD_CLR(fd, &m_writeset); 39 if( newevent & EV_READ ) { 40 FD_SET(fd, &m_readset); 41 } 42 if( newevent & EV_WRITE ) { 43 FD_SET(fd, &m_writeset); 44 } 32 45 return 0; 33 46 }
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)