Commit 521003633534d3e7ce8dd9eaa9ea65f9205c67e0
1 parent
8cab362d
generally epoll is working... sadly I removed the is_writing flag in the CommEnd…
…Point which was neccessary... I have to add it again.
Showing
18 changed files
with
187 additions
and
119 deletions
... | ... | @@ -24,7 +24,6 @@ |
24 | 24 | #define __TR_COMM_MANAGER_H__ |
25 | 25 | |
26 | 26 | #include <sys/types.h> |
27 | -#include <poll.h> | |
28 | 27 | |
29 | 28 | #include "trbase.h" |
30 | 29 | #include "trevent.h" |
... | ... | @@ -35,8 +34,8 @@ TR_CLASS(TR_CommManager) { |
35 | 34 | TR_EXTENDS(TR_EventHandler); |
36 | 35 | |
37 | 36 | TR_CommEndPoint * endpoints; |
38 | - nfds_t n_endpoints; | |
39 | - nfds_t max_handle; | |
37 | + size_t n_endpoints; | |
38 | + size_t max_handle; | |
40 | 39 | }; |
41 | 40 | TR_INSTANCE_INIT(TR_CommManager); |
42 | 41 | TR_CLASSVARS_DECL(TR_CommManager) { | ... | ... |
... | ... | @@ -27,6 +27,7 @@ |
27 | 27 | #include <sys/epoll.h> |
28 | 28 | |
29 | 29 | #include "trbase.h" |
30 | +#include "trdata.h" | |
30 | 31 | #include "trevent.h" |
31 | 32 | |
32 | 33 | TR_CLASS(TR_CommManagerEpoll) { |
... | ... | @@ -34,6 +35,8 @@ TR_CLASS(TR_CommManagerEpoll) { |
34 | 35 | |
35 | 36 | int handle; |
36 | 37 | struct epoll_event * events; |
38 | + TR_Queue read_ready; | |
39 | + TR_Queue write_ready; | |
37 | 40 | }; |
38 | 41 | TR_INSTANCE_INIT(TR_CommManagerEpoll); |
39 | 42 | TR_CLASSVARS_DECL(TR_CommManagerEpoll) { | ... | ... |
... | ... | @@ -32,7 +32,7 @@ |
32 | 32 | TR_CLASS(TR_CommManagerPoll) { |
33 | 33 | TR_EXTENDS(TR_CommManager); |
34 | 34 | |
35 | - struct pollfd * fds; | |
35 | + struct pollfd * fds; | |
36 | 36 | }; |
37 | 37 | TR_INSTANCE_INIT(TR_CommManagerPoll); |
38 | 38 | TR_CLASSVARS_DECL(TR_CommManagerPoll) { |
... | ... | @@ -42,4 +42,3 @@ TR_CLASSVARS_DECL(TR_CommManagerPoll) { |
42 | 42 | #endif // __TR_COMM_MANAGER_POLL_H__ |
43 | 43 | |
44 | 44 | // vim: set ts=4 sw=4: |
45 | - | ... | ... |
... | ... | @@ -47,8 +47,8 @@ TR_INTERFACE(TR_CommManager) { |
47 | 47 | fptr_TR_commManagerDisableWrite disableWrite; |
48 | 48 | fptr_TR_commManagerEnableRead enableRead; |
49 | 49 | fptr_TR_commManagerClose close; |
50 | - fptr_TR_commManagerShutdownRead shutdownWrite; | |
51 | - fptr_TR_commManagerShutdownWrite shutdownRead; | |
50 | + fptr_TR_commManagerShutdownWrite shutdownWrite; | |
51 | + fptr_TR_commManagerShutdownRead shutdownRead; | |
52 | 52 | }; |
53 | 53 | |
54 | 54 | void TR_commManagerAddEndpoint(void *, TR_CommEndPoint); | ... | ... |
... | ... | @@ -28,12 +28,24 @@ |
28 | 28 | int |
29 | 29 | TR_cepWriteBuffered(TR_CommEndPoint this) |
30 | 30 | { |
31 | - TR_RemoteData data = TR_cepNextWriteData(this); | |
32 | - int send = TR_socketSend(this->transport, data); | |
31 | + TR_RemoteData data; | |
32 | + int send; | |
33 | + | |
34 | +// fprintf(stderr, "%s(%p): before get write data: %p / %zd messages\n", | |
35 | +// __func__, this, data, this->write_buffer->nmsg); | |
36 | + data = TR_cepNextWriteData(this); | |
37 | +// fprintf(stderr, "%s(%p): get write data: %p / %zd messages\n", | |
38 | +// __func__, this, data, this->write_buffer->nmsg); | |
39 | +// fflush(stderr); | |
40 | + | |
41 | + send = TR_socketSend(this->transport, data); | |
33 | 42 | |
34 | 43 | switch (send) { |
35 | 44 | case FALSE: // EAGAIN |
36 | 45 | TR_queuePutFirst(this->write_buffer, data); |
46 | +// fprintf(stderr, "%s(%p): put first write data: %p / %zd messages\n", | |
47 | +// __func__, this, data, this->write_buffer->nmsg); | |
48 | +// fflush(stderr); | |
37 | 49 | break; |
38 | 50 | |
39 | 51 | case -1: // FAILURE | ... | ... |
... | ... | @@ -77,6 +77,21 @@ commEndPointCvInit(TR_class_ptr cls) |
77 | 77 | TR_EVENT_CREATE(cls, TR_CEP_EVENT_CLOSE); |
78 | 78 | } |
79 | 79 | |
80 | +const char * TR_cepEventStrings[] = { | |
81 | + "TR_CEP_EVENT_READ_READY", | |
82 | + "TR_CEP_EVENT_READ_BLOCK", | |
83 | + "TR_CEP_EVENT_WRITE_READY", | |
84 | + "TR_CEP_EVENT_UPGRADE", | |
85 | + "TR_CEP_EVENT_NEW_DATA", | |
86 | + "TR_CEP_EVENT_PENDING_DATA", | |
87 | + "TR_CEP_EVENT_END_DATA", | |
88 | + "TR_CEP_EVENT_NEW_MSG", | |
89 | + "TR_CEP_EVENT_SEND_MSG", | |
90 | + "TR_CEP_EVENT_SHUT_READ", | |
91 | + "TR_CEP_EVENT_SHUT_WRITE", | |
92 | + "TR_CEP_EVENT_CLOSE" | |
93 | +}; | |
94 | + | |
80 | 95 | intptr_t comm_end_point_events[TR_CEP_EVENT_MAX + 1]; |
81 | 96 | TR_INIT_IFACE(TR_Class, commEndPointCtor, commEndPointDtor, NULL); |
82 | 97 | TR_INIT_IFACE(TR_CommEndPoint, NULL, NULL); |
... | ... | @@ -87,6 +102,7 @@ TR_CREATE_CLASS( |
87 | 102 | TR_IF(TR_Class), |
88 | 103 | TR_IF(TR_CommEndPoint)) = { |
89 | 104 | { |
105 | + TR_cepEventStrings, | |
90 | 106 | TR_CEP_EVENT_MAX + 1, |
91 | 107 | comm_end_point_events |
92 | 108 | } | ... | ... |
... | ... | @@ -25,6 +25,7 @@ |
25 | 25 | #include <sys/epoll.h> |
26 | 26 | |
27 | 27 | #include "trbase.h" |
28 | +#include "trdata.h" | |
28 | 29 | #include "trevent.h" |
29 | 30 | |
30 | 31 | #include "tr/comm_manager.h" |
... | ... | @@ -44,16 +45,14 @@ commManagerEpollCtor(void * _this, va_list * params) |
44 | 45 | { |
45 | 46 | TR_CommManagerEpoll this = _this; |
46 | 47 | TR_CommManager cmgr = _this; |
47 | - nfds_t i; | |
48 | 48 | |
49 | 49 | TR_PARENTCALL(TR_CommManagerEpoll, _this, TR_Class, ctor, params); |
50 | - this->handle = epoll_create(cmgr->n_endpoints); | |
51 | - this->events = TR_malloc(sizeof(struct epoll_event) * cmgr->n_endpoints); | |
52 | - for (i = 0; i < cmgr->n_endpoints; i++) { | |
53 | - this->events[i].data.ptr = NULL; | |
54 | - this->events[i].events = EPOLLET | EPOLLONESHOT; | |
55 | - } | |
50 | + this->handle = epoll_create(cmgr->n_endpoints); | |
51 | + this->read_ready = TR_new(TR_Queue); | |
52 | + this->write_ready = TR_new(TR_Queue); | |
56 | 53 | |
54 | + this->read_ready->free_msgs = 0; | |
55 | + this->write_ready->free_msgs = 0; | |
57 | 56 | |
58 | 57 | return 0; |
59 | 58 | } |
... | ... | @@ -64,8 +63,10 @@ commManagerEpollDtor(void * _this) |
64 | 63 | { |
65 | 64 | TR_CommManagerEpoll this = _this; |
66 | 65 | |
66 | + TR_delete(this->read_ready); | |
67 | + TR_delete(this->write_ready); | |
68 | + | |
67 | 69 | close(this->handle); |
68 | - TR_MEM_FREE(this->events); | |
69 | 70 | TR_PARENTCALL(TR_CommManagerEpoll, _this, TR_Class, dtor); |
70 | 71 | } |
71 | 72 | |
... | ... | @@ -75,11 +76,12 @@ TR_commManagerEpollAddEndpoint(void * _this, TR_CommEndPoint endpoint) |
75 | 76 | { |
76 | 77 | TR_CommManagerEpoll this = _this; |
77 | 78 | int handle = endpoint->transport->handle; |
79 | + struct epoll_event event; | |
78 | 80 | |
79 | - this->events[handle].data.ptr = endpoint; | |
80 | - this->events[handle].events |= EPOLLIN; | |
81 | + event.data.ptr = endpoint; | |
82 | + event.events = EPOLLIN | EPOLLOUT | EPOLLET; | |
81 | 83 | |
82 | - epoll_ctl(this->handle, EPOLL_CTL_ADD, handle, &(this->events[handle])); | |
84 | + epoll_ctl(this->handle, EPOLL_CTL_ADD, handle, &event); | |
83 | 85 | } |
84 | 86 | |
85 | 87 | static |
... | ... | @@ -88,6 +90,11 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout) |
88 | 90 | { |
89 | 91 | TR_CommManagerEpoll this = _this; |
90 | 92 | int i, nevents; |
93 | + TR_Queue node; | |
94 | + | |
95 | + if (0 != (this->read_ready->nmsg & this->write_ready->nmsg)) { | |
96 | + timeout = 0; | |
97 | + } | |
91 | 98 | |
92 | 99 | nevents = epoll_wait(this->handle, events, MAXEVENTS, timeout); |
93 | 100 | |
... | ... | @@ -95,113 +102,132 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout) |
95 | 102 | TR_CommEndPoint endpoint = (TR_CommEndPoint)events[i].data.ptr; |
96 | 103 | |
97 | 104 | if ((events[i].events & EPOLLIN) == EPOLLIN) { |
98 | - TR_Event event; | |
99 | - | |
100 | 105 | if (TR_INSTANCE_OF(TR_TcpSocket, endpoint->transport) |
101 | 106 | && ((TR_TcpSocket)endpoint->transport)->listen) { |
102 | - event = TR_eventSubjectEmit( | |
103 | - (TR_EventSubject)endpoint, | |
104 | - TR_CET_EVENT_ACC_READY, | |
105 | - NULL); | |
107 | + TR_eventHandlerIssueEvent((TR_EventHandler)this, | |
108 | + TR_eventSubjectEmit( | |
109 | + (TR_EventSubject)endpoint, | |
110 | + TR_CET_EVENT_ACC_READY, | |
111 | + NULL)); | |
106 | 112 | } else { |
107 | - event = TR_eventSubjectEmit( | |
108 | - (TR_EventSubject)endpoint, | |
109 | - TR_CEP_EVENT_READ_READY, | |
110 | - NULL); | |
113 | + if (! ((TR_EventSubject)endpoint)->fin) { | |
114 | + TR_queuePut(this->read_ready, endpoint); | |
115 | + } | |
111 | 116 | } |
112 | - | |
113 | - TR_eventHandlerIssueEvent((TR_EventHandler)this, event); | |
114 | - this->events[i].events &= ~EPOLLIN; | |
115 | 117 | } |
116 | 118 | |
117 | 119 | if ((events[i].events & EPOLLOUT) == EPOLLOUT) { |
118 | - TR_Event _event = TR_eventSubjectEmit( | |
119 | - (TR_EventSubject)endpoint, | |
120 | - TR_CEP_EVENT_WRITE_READY, | |
121 | - NULL); | |
120 | + if (TR_cepHasPendingData(endpoint) && | |
121 | + ! ((TR_EventSubject)endpoint)->fin) { | |
122 | + TR_queuePut(this->write_ready, endpoint); | |
123 | + } | |
124 | + } | |
125 | + } | |
126 | + | |
127 | + /* now issue reads and write events */ | |
128 | + for (node=this->read_ready->first; node; node=node->next) { | |
129 | + TR_CommEndPoint endpoint = (TR_CommEndPoint)node->msg; | |
130 | + | |
131 | + if (! TR_socketFinRd(endpoint->transport)) { | |
132 | + TR_eventHandlerIssueEvent( | |
133 | + (TR_EventHandler)this, | |
134 | + TR_eventSubjectEmit( | |
135 | + (TR_EventSubject)endpoint, | |
136 | + TR_CEP_EVENT_READ_READY, | |
137 | + NULL)); | |
138 | + } | |
139 | + } | |
122 | 140 | |
123 | - TR_eventHandlerIssueEvent((TR_EventHandler)this, _event); | |
124 | - this->events[i].events &= ~EPOLLOUT; | |
141 | + for (node=this->write_ready->first; node; node=node->next) { | |
142 | + TR_CommEndPoint endpoint = (TR_CommEndPoint)node->msg; | |
143 | + | |
144 | + if (! TR_socketFinWr(endpoint->transport)) { | |
145 | + TR_eventHandlerIssueEvent( | |
146 | + (TR_EventHandler)this, | |
147 | + TR_eventSubjectEmit( | |
148 | + (TR_EventSubject)endpoint, | |
149 | + TR_CEP_EVENT_WRITE_READY, | |
150 | + NULL)); | |
125 | 151 | } |
126 | 152 | } |
127 | 153 | } |
128 | 154 | |
129 | 155 | static |
130 | 156 | void |
131 | -TR_commManagerEpollEnableWrite(void * _this, TR_Event event) | |
157 | +TR_commManagerEpollRemoveWrite(void * _this, TR_Event event) | |
132 | 158 | { |
133 | 159 | TR_CommManagerEpoll this = _this; |
134 | 160 | TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
135 | 161 | |
136 | - if (! TR_socketFinWr(endpoint->transport)) { | |
137 | - int handle = endpoint->transport->handle; | |
138 | - | |
139 | - this->events[handle].data.ptr = endpoint; | |
140 | - this->events[handle].events |= EPOLLOUT; | |
141 | - | |
142 | - epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &(this->events[handle])); | |
143 | - } | |
162 | + TR_queueDelete(this->write_ready, endpoint); | |
144 | 163 | } |
145 | 164 | |
146 | 165 | static |
147 | 166 | void |
148 | -TR_commManagerEpollDisableWrite(void * _this, TR_Event event) | |
167 | +TR_commManagerEpollRemoveRead(void * _this, TR_Event event) | |
149 | 168 | { |
150 | 169 | TR_CommManagerEpoll this = _this; |
151 | 170 | TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
152 | - int handle = endpoint->transport->handle; | |
153 | - | |
154 | - this->events[handle].data.ptr = endpoint; | |
155 | - this->events[handle].events &= ~EPOLLOUT; | |
156 | 171 | |
157 | - epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &(this->events[handle])); | |
172 | + TR_queueDelete(this->read_ready, endpoint); | |
158 | 173 | } |
159 | 174 | |
160 | 175 | static |
161 | 176 | void |
162 | -TR_commManagerEpollEnableRead(void * _this, TR_Event event) | |
177 | +TR_commManagerEpollClose(void * _this, TR_Event event) | |
163 | 178 | { |
164 | 179 | TR_CommManagerEpoll this = _this; |
165 | 180 | TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
166 | 181 | |
167 | - if (! TR_socketFinRd(endpoint->transport)) { | |
168 | - int handle = endpoint->transport->handle; | |
169 | - | |
170 | - this->events[handle].data.ptr = endpoint; | |
171 | - this->events[handle].events |= EPOLLIN; | |
182 | + TR_queueDelete(this->read_ready, endpoint); | |
183 | + TR_queueDelete(this->write_ready, endpoint); | |
172 | 184 | |
173 | - epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &(this->events[handle])); | |
174 | - } | |
185 | + epoll_ctl(this->handle, EPOLL_CTL_DEL, endpoint->transport->handle, NULL); | |
175 | 186 | } |
176 | 187 | |
177 | 188 | static |
178 | 189 | void |
179 | -TR_commManagerEpollDisableRead(void * _this, TR_Event event) | |
190 | +TR_commManagerEpollShutRead(void * _this, TR_Event event) | |
180 | 191 | { |
181 | 192 | TR_CommManagerEpoll this = _this; |
182 | 193 | TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
183 | - int handle = endpoint->transport->handle; | |
194 | + struct epoll_event _event; | |
195 | + | |
196 | + TR_queueDelete(this->read_ready, endpoint); | |
184 | 197 | |
185 | - this->events[handle].data.ptr = endpoint; | |
186 | - this->events[handle].events &= ~EPOLLIN; | |
198 | + _event.data.ptr = endpoint; | |
199 | + _event.events = EPOLLOUT | EPOLLET; | |
187 | 200 | |
188 | - epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &(this->events[handle])); | |
201 | + epoll_ctl( | |
202 | + this->handle, | |
203 | + EPOLL_CTL_MOD, | |
204 | + endpoint->transport->handle, | |
205 | + &_event); | |
189 | 206 | } |
190 | 207 | |
191 | 208 | static |
192 | 209 | void |
193 | -TR_commManagerEpollClose(void * _this, TR_Event event) | |
210 | +TR_commManagerEpollShutWrite(void * _this, TR_Event event) | |
194 | 211 | { |
195 | 212 | TR_CommManagerEpoll this = _this; |
196 | 213 | TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; |
197 | - int handle = endpoint->transport->handle; | |
214 | + struct epoll_event _event; | |
215 | + | |
216 | + TR_queueDelete(this->write_ready, endpoint); | |
198 | 217 | |
199 | - this->events[handle].data.ptr = NULL; | |
200 | - this->events[handle].events = EPOLLET | EPOLLONESHOT; | |
218 | + _event.data.ptr = endpoint; | |
219 | + _event.events = EPOLLIN | EPOLLET; | |
201 | 220 | |
202 | - epoll_ctl(this->handle, EPOLL_CTL_DEL, handle, NULL); | |
221 | + epoll_ctl( | |
222 | + this->handle, | |
223 | + EPOLL_CTL_MOD, | |
224 | + endpoint->transport->handle, | |
225 | + &_event); | |
203 | 226 | } |
204 | 227 | |
228 | + | |
229 | +static void TR_commManagerEpollNoop(void * _this, TR_Event event) {} | |
230 | + | |
205 | 231 | static |
206 | 232 | void |
207 | 233 | TR_commManagerEpollCvInit(TR_class_ptr cls) { |
... | ... | @@ -211,14 +237,14 @@ TR_commManagerEpollCvInit(TR_class_ptr cls) { |
211 | 237 | TR_INIT_IFACE(TR_Class, commManagerEpollCtor, commManagerEpollDtor, NULL); |
212 | 238 | TR_INIT_IFACE( |
213 | 239 | TR_CommManager, |
214 | - TR_commManagerEpollAddEndpoint, | |
215 | - TR_commManagerEpollSelect, | |
216 | - TR_commManagerEpollEnableWrite, | |
217 | - TR_commManagerEpollDisableWrite, | |
218 | - TR_commManagerEpollEnableRead, | |
219 | - TR_commManagerEpollClose, | |
220 | - TR_commManagerEpollDisableRead, | |
221 | - TR_commManagerEpollDisableWrite); | |
240 | + TR_commManagerEpollAddEndpoint, // TR_CON_EVENT_NEW_CON | |
241 | + TR_commManagerEpollSelect, // TR_DISPATCHER_EVENT_DATA_WAIT | |
242 | + TR_commManagerEpollRemoveWrite, // TR_CEP_EVENT_PENDING_DATA => WRITE_BLOCK | |
243 | + TR_commManagerEpollNoop, // TR_CEP_EVENT_END_DATA | |
244 | + TR_commManagerEpollRemoveRead, // TR_CEP_EVENT_READ_BLOCK | |
245 | + TR_commManagerEpollClose, // TR_CEP_EVENT_CLOSE | |
246 | + TR_commManagerEpollShutWrite, // TR_CEP_EVENT_SHUT_READ | |
247 | + TR_commManagerEpollShutRead); // TR_CEP_EVENT_SHUT_WRITE | |
222 | 248 | TR_CREATE_CLASS( |
223 | 249 | TR_CommManagerEpoll, |
224 | 250 | TR_CommManager, | ... | ... |
... | ... | @@ -42,6 +42,7 @@ commManagerPollCtor(void * _this, va_list * params) |
42 | 42 | nfds_t i; |
43 | 43 | |
44 | 44 | TR_PARENTCALL(TR_CommManagerPoll, _this, TR_Class, ctor, params); |
45 | + | |
45 | 46 | this->fds = TR_malloc(sizeof(struct pollfd) * cmgr->n_endpoints); |
46 | 47 | for (i = 0; i < cmgr->n_endpoints; i++) { |
47 | 48 | this->fds[i].fd = -1; |
... | ... | @@ -59,7 +60,6 @@ commManagerPollDtor(void * _this) |
59 | 60 | TR_CommManagerPoll this = _this; |
60 | 61 | |
61 | 62 | TR_MEM_FREE(this->fds); |
62 | - TR_PARENTCALL(TR_CommManagerPoll, _this, TR_Class, dtor); | |
63 | 63 | } |
64 | 64 | |
65 | 65 | static |
... | ... | @@ -67,6 +67,7 @@ void |
67 | 67 | TR_commManagerPollAddEndpoint(void * _this, TR_CommEndPoint endpoint) |
68 | 68 | { |
69 | 69 | TR_CommManagerPoll this = _this; |
70 | + | |
70 | 71 | this->fds[endpoint->transport->handle].fd = endpoint->transport->handle; |
71 | 72 | this->fds[endpoint->transport->handle].events = POLLIN; |
72 | 73 | } |
... | ... | @@ -104,21 +105,16 @@ TR_commManagerPollSelect(void * _this, TR_Event event, int timeout) |
104 | 105 | } |
105 | 106 | |
106 | 107 | TR_eventHandlerIssueEvent((TR_EventHandler)this, event); |
107 | - // deactivate read poll mimic edge level behaviour | |
108 | - this->fds[endpoint->transport->handle].events &= ~POLLIN; | |
109 | 108 | } |
110 | 109 | |
111 | 110 | if ((this->fds[i].revents & POLLOUT) == POLLOUT) { |
111 | + nevents--; | |
112 | 112 | TR_Event _event = TR_eventSubjectEmit( |
113 | 113 | (TR_EventSubject)endpoint, |
114 | 114 | TR_CEP_EVENT_WRITE_READY, |
115 | 115 | NULL); |
116 | 116 | |
117 | 117 | TR_eventHandlerIssueEvent((TR_EventHandler)this, _event); |
118 | - nevents--; | |
119 | - | |
120 | - // deactivate write poll mimic edge level behaviour | |
121 | - this->fds[endpoint->transport->handle].events &= ~POLLOUT; | |
122 | 118 | } |
123 | 119 | |
124 | 120 | if (nevents <= 0) break; |
... | ... | @@ -196,8 +192,8 @@ TR_INIT_IFACE( |
196 | 192 | TR_commManagerPollDisableWrite, |
197 | 193 | TR_commManagerPollEnableRead, |
198 | 194 | TR_commManagerPollClose, |
199 | - TR_commManagerPollDisableRead, | |
200 | - TR_commManagerPollDisableWrite); | |
195 | + TR_commManagerPollDisableWrite, | |
196 | + TR_commManagerPollDisableRead); | |
201 | 197 | TR_CREATE_CLASS( |
202 | 198 | TR_CommManagerPoll, |
203 | 199 | TR_CommManager, | ... | ... |
... | ... | @@ -34,7 +34,7 @@ TR_commManagerShutdown(void * _this, TR_Event event) |
34 | 34 | TR_CommManager this = _this; |
35 | 35 | nfds_t i; |
36 | 36 | |
37 | - for (i=0; i<this->n_endpoints; i++) { | |
37 | + for (i=0; i<=this->max_handle; i++) { | |
38 | 38 | if (this->endpoints[i]) { |
39 | 39 | TR_eventHandlerIssueEvent( |
40 | 40 | (TR_EventHandler)_this, | ... | ... |
... | ... | @@ -60,6 +60,10 @@ connEntryPointCvInit(TR_class_ptr cls) |
60 | 60 | TR_EVENT_CREATE(cls, TR_CET_EVENT_ACC_READY); |
61 | 61 | } |
62 | 62 | |
63 | +const char * TR_cetEventStrings[] = { | |
64 | + "TR_CET_EVENT_ACC_READY" | |
65 | +}; | |
66 | + | |
63 | 67 | intptr_t connEntryPoint_events[TR_CET_EVENT_MAX + 1]; |
64 | 68 | TR_INIT_IFACE(TR_Class, connEntryPointCtor, connEntryPointDtor, NULL); |
65 | 69 | TR_INIT_IFACE(TR_CommEndPoint, NULL, NULL); |
... | ... | @@ -70,8 +74,9 @@ TR_CREATE_CLASS( |
70 | 74 | TR_IF(TR_Class), |
71 | 75 | TR_IF(TR_CommEndPoint)) = { |
72 | 76 | {{ |
73 | - TR_CET_EVENT_MAX + 1, | |
74 | - connEntryPoint_events | |
77 | + TR_cetEventStrings, | |
78 | + TR_CET_EVENT_MAX + 1, | |
79 | + connEntryPoint_events | |
75 | 80 | }} |
76 | 81 | }; |
77 | 82 | ... | ... |
... | ... | @@ -123,6 +123,11 @@ connectionCompose(void * _this, TR_ProtoMessage message) |
123 | 123 | } |
124 | 124 | |
125 | 125 | TR_queuePut(((TR_CommEndPoint)_this)->write_buffer, data); |
126 | +// fprintf(stderr, "%s(%p): put write data: %p / %zd messages\n", | |
127 | +// __func__, (TR_CommEndPoint)_this, data, | |
128 | +// ((TR_CommEndPoint)_this)->write_buffer->nmsg); | |
129 | +// fflush(stderr); | |
130 | + | |
126 | 131 | return TRUE; |
127 | 132 | } |
128 | 133 | |
... | ... | @@ -133,6 +138,10 @@ connectionCvInit(TR_class_ptr cls) |
133 | 138 | TR_EVENT_CREATE(cls, TR_CON_EVENT_NEW_CON); |
134 | 139 | } |
135 | 140 | |
141 | +const char * TR_connectionEventStrings[] = { | |
142 | + "TR_CON_EVENT_NEW_CON" | |
143 | +}; | |
144 | + | |
136 | 145 | intptr_t connection_events[TR_CON_EVENT_MAX + 1]; |
137 | 146 | TR_INIT_IFACE(TR_Class, connectionCtor, connectionDtor, NULL); |
138 | 147 | TR_INIT_IFACE( |
... | ... | @@ -146,8 +155,9 @@ TR_CREATE_CLASS( |
146 | 155 | TR_IF(TR_Class), |
147 | 156 | TR_IF(TR_CommEndPoint)) = { |
148 | 157 | {{ |
149 | - TR_CON_EVENT_MAX + 1, | |
150 | - connection_events | |
158 | + TR_connectionEventStrings, | |
159 | + TR_CON_EVENT_MAX + 1, | |
160 | + connection_events | |
151 | 161 | }} |
152 | 162 | }; |
153 | 163 | ... | ... |
... | ... | @@ -110,6 +110,10 @@ datagramServiceCompose(void * _this, TR_ProtoMessage message) |
110 | 110 | } |
111 | 111 | |
112 | 112 | TR_queuePut(((TR_CommEndPoint)_this)->write_buffer, data); |
113 | +// fprintf(stderr, "%s(%p): put write data: %p / %zd messages\n", | |
114 | +// __func__, (TR_CommEndPoint)_this, data, | |
115 | +// ((TR_CommEndPoint)_this)->write_buffer->nmsg); | |
116 | +// fflush(stderr); | |
113 | 117 | return TRUE; |
114 | 118 | } |
115 | 119 | |
... | ... | @@ -126,8 +130,9 @@ TR_CREATE_CLASS( |
126 | 130 | TR_IF(TR_Class), |
127 | 131 | TR_IF(TR_CommEndPoint)) = { |
128 | 132 | {{ |
129 | - TR_CEP_EVENT_MAX + 1, | |
130 | - datagramService_events | |
133 | + NULL, | |
134 | + TR_CEP_EVENT_MAX + 1, | |
135 | + datagramService_events | |
131 | 136 | }} |
132 | 137 | }; |
133 | 138 | ... | ... |
... | ... | @@ -44,8 +44,7 @@ static |
44 | 44 | TR_EventDone |
45 | 45 | ioHandlerRead(void * _this, TR_Event event) |
46 | 46 | { |
47 | - TR_Event revent; | |
48 | - TR_EventDone done = TR_EVENT_DONE; | |
47 | + TR_Event revent; | |
49 | 48 | |
50 | 49 | switch (TR_cepBufferRead((TR_CommEndPoint)event->subject)) { |
51 | 50 | case FALSE: // EAGAIN |
... | ... | @@ -75,26 +74,26 @@ ioHandlerRead(void * _this, TR_Event event) |
75 | 74 | event->subject, |
76 | 75 | TR_CEP_EVENT_NEW_DATA, |
77 | 76 | NULL); |
78 | - | |
79 | - done = TR_EVENT_PENDING; | |
80 | 77 | break; |
81 | 78 | } |
82 | 79 | |
83 | 80 | TR_eventHandlerIssueEvent((TR_EventHandler)_this, revent); |
84 | - return done; | |
81 | + | |
82 | + return TR_EVENT_DONE; | |
85 | 83 | } |
86 | 84 | |
87 | 85 | static |
88 | 86 | TR_EventDone |
89 | 87 | ioHandlerWrite(void * _this, TR_Event event) |
90 | 88 | { |
91 | - TR_Event revent, close_event = NULL; | |
89 | + TR_Event revent = NULL, | |
90 | + close_event = NULL; | |
92 | 91 | |
93 | 92 | switch (TR_cepWriteBuffered((TR_CommEndPoint)event->subject)) { |
94 | 93 | case FALSE: // EAGAIN |
95 | 94 | revent = TR_eventSubjectEmit( |
96 | 95 | event->subject, |
97 | - TR_CEP_EVENT_PENDING_DATA, | |
96 | + TR_CEP_EVENT_PENDING_DATA, // is WRITE_BLOCK | |
98 | 97 | NULL); |
99 | 98 | break; |
100 | 99 | |
... | ... | @@ -129,9 +128,7 @@ ioHandlerWrite(void * _this, TR_Event event) |
129 | 128 | } |
130 | 129 | |
131 | 130 | TR_eventHandlerIssueEvent((TR_EventHandler)_this, revent); |
132 | - if (close_event) { | |
133 | - TR_eventHandlerIssueEvent((TR_EventHandler)_this, close_event); | |
134 | - } | |
131 | + TR_eventHandlerIssueEvent((TR_EventHandler)_this, close_event); | |
135 | 132 | |
136 | 133 | return TR_EVENT_DONE; |
137 | 134 | } | ... | ... |
... | ... | @@ -25,6 +25,7 @@ testHandlerNewMessage(TR_EventHandler this, TR_Event event) |
25 | 25 | // TR_SizedData data = (TR_SizedData)msg->data; |
26 | 26 | // char buf[data->size + 1]; |
27 | 27 | // int i; |
28 | + TR_Event _event; | |
28 | 29 | |
29 | 30 | ((TestHandler)this)->handled++; |
30 | 31 | |
... | ... | @@ -36,12 +37,12 @@ testHandlerNewMessage(TR_EventHandler this, TR_Event event) |
36 | 37 | // } |
37 | 38 | // printf("echo message: %s(%zd)\n", buf, data->size); |
38 | 39 | |
39 | - TR_eventHandlerIssueEvent( | |
40 | - (TR_EventHandler)this, | |
41 | - TR_eventSubjectEmit( | |
42 | - event->subject, | |
43 | - TR_CEP_EVENT_SEND_MSG, | |
44 | - event->data)); | |
40 | + _event = TR_eventSubjectEmit( | |
41 | + event->subject, | |
42 | + TR_CEP_EVENT_SEND_MSG, | |
43 | + event->data); | |
44 | + | |
45 | + TR_eventHandlerIssueEvent((TR_EventHandler)this, _event); | |
45 | 46 | |
46 | 47 | return TR_EVENT_DONE; |
47 | 48 | } | ... | ... |
Please
register
or
login
to post a comment