Commit 171d5979946aace4d7d5b72676fe678ee4975d22

Authored by Georg Hopp
1 parent e3a6d0e9

Disable read completely when write is failing and buffer is full. Don't add endp…

…oints to read or write when they are already in fin state.
@@ -54,14 +54,15 @@ TR_CLASSVARS_DECL(TR_CommEndPoint) { @@ -54,14 +54,15 @@ TR_CLASSVARS_DECL(TR_CommEndPoint) {
54 #define TR_CEP_EVENT_DO_WRITE 1 // IoHandler 54 #define TR_CEP_EVENT_DO_WRITE 1 // IoHandler
55 #define TR_CEP_EVENT_READ_BLOCK 2 // CommManager 55 #define TR_CEP_EVENT_READ_BLOCK 2 // CommManager
56 #define TR_CEP_EVENT_WRITE_BLOCK 3 // CommManager 56 #define TR_CEP_EVENT_WRITE_BLOCK 3 // CommManager
57 -#define TR_CEP_EVENT_NEW_DATA 4 // ProtocolHandler  
58 -#define TR_CEP_EVENT_NEW_MSG 5 // Application  
59 -#define TR_CEP_EVENT_MSG_READY 6 // ProtocolHandler  
60 -#define TR_CEP_EVENT_DATA_READY 7 // CommManager  
61 -#define TR_CEP_EVENT_DATA_END 8 // CommManager  
62 -#define TR_CEP_EVENT_SHUT_READ 9 // CommManager  
63 -#define TR_CEP_EVENT_SHUT_WRITE 10 // CommManager  
64 -#define TR_CEP_EVENT_CLOSE 11 // CommManager 57 +#define TR_CEP_EVENT_WBUF_FULL 4 // CommManager
  58 +#define TR_CEP_EVENT_NEW_DATA 5 // ProtocolHandler
  59 +#define TR_CEP_EVENT_NEW_MSG 6 // Application
  60 +#define TR_CEP_EVENT_MSG_READY 7 // ProtocolHandler
  61 +#define TR_CEP_EVENT_DATA_READY 8 // CommManager
  62 +#define TR_CEP_EVENT_DATA_END 9 // CommManager
  63 +#define TR_CEP_EVENT_SHUT_READ 10 // CommManager
  64 +#define TR_CEP_EVENT_SHUT_WRITE 11 // CommManager
  65 +#define TR_CEP_EVENT_CLOSE 12 // CommManager
65 #define TR_CEP_EVENT_MAX ((size_t)TR_CEP_EVENT_CLOSE) 66 #define TR_CEP_EVENT_MAX ((size_t)TR_CEP_EVENT_CLOSE)
66 67
67 #define TR_cepSetClose(ep) ((ep)->do_close = 1) 68 #define TR_cepSetClose(ep) ((ep)->do_close = 1)
@@ -34,15 +34,19 @@ typedef TR_EventDone (* fptr_TR_commManagerAddEndpoint)(void *, TR_CommEndPoint) @@ -34,15 +34,19 @@ typedef TR_EventDone (* fptr_TR_commManagerAddEndpoint)(void *, TR_CommEndPoint)
34 typedef TR_EventDone (* fptr_TR_commManagerSelect)(void *, TR_Event, int); 34 typedef TR_EventDone (* fptr_TR_commManagerSelect)(void *, TR_Event, int);
35 typedef TR_EventDone (* fptr_TR_commManagerPollWrite)(void *, TR_Event); 35 typedef TR_EventDone (* fptr_TR_commManagerPollWrite)(void *, TR_Event);
36 typedef TR_EventDone (* fptr_TR_commManagerPollRead)(void *, TR_Event); 36 typedef TR_EventDone (* fptr_TR_commManagerPollRead)(void *, TR_Event);
  37 +typedef TR_EventDone (* fptr_TR_commManagerDisableWrite)(void *, TR_Event);
  38 +typedef TR_EventDone (* fptr_TR_commManagerDisableRead)(void *, TR_Event);
37 typedef TR_EventDone (* fptr_TR_commManagerClose)(void *, TR_Event); 39 typedef TR_EventDone (* fptr_TR_commManagerClose)(void *, TR_Event);
38 40
39 TR_INTERFACE(TR_CommManager) { 41 TR_INTERFACE(TR_CommManager) {
40 TR_IFID; 42 TR_IFID;
41 - fptr_TR_commManagerAddEndpoint addEndpoint;  
42 - fptr_TR_commManagerSelect select;  
43 - fptr_TR_commManagerPollWrite pollWrite;  
44 - fptr_TR_commManagerPollRead pollRead;  
45 - fptr_TR_commManagerClose close; 43 + fptr_TR_commManagerAddEndpoint addEndpoint;
  44 + fptr_TR_commManagerSelect select;
  45 + fptr_TR_commManagerPollWrite pollWrite;
  46 + fptr_TR_commManagerPollRead pollRead;
  47 + fptr_TR_commManagerDisableWrite disableWrite;
  48 + fptr_TR_commManagerDisableRead disableRead;
  49 + fptr_TR_commManagerClose close;
46 }; 50 };
47 51
48 void TR_commManagerAddEndpoint(void *, TR_CommEndPoint); 52 void TR_commManagerAddEndpoint(void *, TR_CommEndPoint);
@@ -92,6 +92,7 @@ commEndPointCvInit(TR_class_ptr cls) @@ -92,6 +92,7 @@ commEndPointCvInit(TR_class_ptr cls)
92 TR_EVENT_CREATE(cls, TR_CEP_EVENT_DO_WRITE); 92 TR_EVENT_CREATE(cls, TR_CEP_EVENT_DO_WRITE);
93 TR_EVENT_CREATE(cls, TR_CEP_EVENT_READ_BLOCK); 93 TR_EVENT_CREATE(cls, TR_CEP_EVENT_READ_BLOCK);
94 TR_EVENT_CREATE(cls, TR_CEP_EVENT_WRITE_BLOCK); 94 TR_EVENT_CREATE(cls, TR_CEP_EVENT_WRITE_BLOCK);
  95 + TR_EVENT_CREATE(cls, TR_CEP_EVENT_WBUF_FULL);
95 TR_EVENT_CREATE(cls, TR_CEP_EVENT_NEW_DATA); 96 TR_EVENT_CREATE(cls, TR_CEP_EVENT_NEW_DATA);
96 TR_EVENT_CREATE(cls, TR_CEP_EVENT_NEW_MSG); 97 TR_EVENT_CREATE(cls, TR_CEP_EVENT_NEW_MSG);
97 TR_EVENT_CREATE(cls, TR_CEP_EVENT_MSG_READY); 98 TR_EVENT_CREATE(cls, TR_CEP_EVENT_MSG_READY);
@@ -107,6 +108,7 @@ const char * TR_cepEventStrings[] = { @@ -107,6 +108,7 @@ const char * TR_cepEventStrings[] = {
107 "TR_CEP_EVENT_DO_WRITE", 108 "TR_CEP_EVENT_DO_WRITE",
108 "TR_CEP_EVENT_READ_BLOCK", 109 "TR_CEP_EVENT_READ_BLOCK",
109 "TR_CEP_EVENT_WRITE_BLOCK", 110 "TR_CEP_EVENT_WRITE_BLOCK",
  111 + "TR_CEP_EVENT_WBUF_FULL",
110 "TR_CEP_EVENT_NEW_DATA", 112 "TR_CEP_EVENT_NEW_DATA",
111 "TR_CEP_EVENT_NEW_MSG", 113 "TR_CEP_EVENT_NEW_MSG",
112 "TR_CEP_EVENT_MSG_READY", 114 "TR_CEP_EVENT_MSG_READY",
@@ -78,17 +78,6 @@ TR_commManagerEnableWrite(void * _this, TR_Event event) @@ -78,17 +78,6 @@ TR_commManagerEnableWrite(void * _this, TR_Event event)
78 78
79 static 79 static
80 TR_EventDone 80 TR_EventDone
81 -TR_commManagerDisableWrite(void * _this, TR_Event event)  
82 -{  
83 - TR_CommManager this = _this;  
84 -  
85 - TR_hashDeleteByVal(this->write, TR_hashableGetHash(event->subject));  
86 -  
87 - return TR_EVENT_DONE;  
88 -}  
89 -  
90 -static  
91 -TR_EventDone  
92 TR_commManagerAddEndpointEvt(TR_CommManager this, TR_Event event) 81 TR_commManagerAddEndpointEvt(TR_CommManager this, TR_Event event)
93 { 82 {
94 TR_commManagerAddEndpoint(this, (TR_CommEndPoint)event->subject); 83 TR_commManagerAddEndpoint(this, (TR_CommEndPoint)event->subject);
@@ -99,6 +88,8 @@ TR_commManagerAddEndpointEvt(TR_CommManager this, TR_Event event) @@ -99,6 +88,8 @@ TR_commManagerAddEndpointEvt(TR_CommManager this, TR_Event event)
99 TR_EventDone TR_commManagerSelect(void *, TR_Event, int); 88 TR_EventDone TR_commManagerSelect(void *, TR_Event, int);
100 TR_EventDone TR_commManagerPollWrite(void *, TR_Event); 89 TR_EventDone TR_commManagerPollWrite(void *, TR_Event);
101 TR_EventDone TR_commManagerPollRead(void *, TR_Event); 90 TR_EventDone TR_commManagerPollRead(void *, TR_Event);
  91 +TR_EventDone TR_commManagerDisableRead(void *, TR_Event);
  92 +TR_EventDone TR_commManagerDisableWrite(void *, TR_Event);
102 TR_EventDone TR_commManagerClose(void *, TR_Event); 93 TR_EventDone TR_commManagerClose(void *, TR_Event);
103 TR_EventDone TR_commManagerShutdownRead(TR_CommManager, TR_Event); 94 TR_EventDone TR_commManagerShutdownRead(TR_CommManager, TR_Event);
104 TR_EventDone TR_commManagerShutdownWrite(TR_CommManager, TR_Event); 95 TR_EventDone TR_commManagerShutdownWrite(TR_CommManager, TR_Event);
@@ -129,6 +120,10 @@ commManagerCvInit(TR_class_ptr cls) @@ -129,6 +120,10 @@ commManagerCvInit(TR_class_ptr cls)
129 TR_commManagerPollRead); 120 TR_commManagerPollRead);
130 TR_EVENT_HANDLER_SET_METHOD( 121 TR_EVENT_HANDLER_SET_METHOD(
131 cls, TR_CommEndPoint, 122 cls, TR_CommEndPoint,
  123 + TR_CEP_EVENT_WBUF_FULL,
  124 + TR_commManagerDisableRead);
  125 + TR_EVENT_HANDLER_SET_METHOD(
  126 + cls, TR_CommEndPoint,
132 TR_CEP_EVENT_CLOSE, 127 TR_CEP_EVENT_CLOSE,
133 TR_commManagerClose); 128 TR_commManagerClose);
134 TR_EVENT_HANDLER_SET_METHOD( 129 TR_EVENT_HANDLER_SET_METHOD(
@@ -151,7 +146,7 @@ commManagerCvInit(TR_class_ptr cls) @@ -151,7 +146,7 @@ commManagerCvInit(TR_class_ptr cls)
151 146
152 TR_INSTANCE(TR_Hash, commManagerEventMethods); 147 TR_INSTANCE(TR_Hash, commManagerEventMethods);
153 TR_INIT_IFACE(TR_Class, commManagerCtor, commManagerDtor, NULL); 148 TR_INIT_IFACE(TR_Class, commManagerCtor, commManagerDtor, NULL);
154 -TR_INIT_IFACE(TR_CommManager, NULL, NULL, NULL, NULL, NULL); 149 +TR_INIT_IFACE(TR_CommManager, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
155 TR_CREATE_CLASS( 150 TR_CREATE_CLASS(
156 TR_CommManager, 151 TR_CommManager,
157 TR_EventHandler, 152 TR_EventHandler,
@@ -73,7 +73,8 @@ TR_commManagerEpollAddEndpoint(void * _this, TR_CommEndPoint endpoint) @@ -73,7 +73,8 @@ TR_commManagerEpollAddEndpoint(void * _this, TR_CommEndPoint endpoint)
73 int handle = endpoint->transport->handle; 73 int handle = endpoint->transport->handle;
74 struct epoll_event event; 74 struct epoll_event event;
75 75
76 - this->events[handle] = EPOLLET; 76 + //this->events[handle] = EPOLLET;
  77 + this->events[handle] = 0;
77 event.data.ptr = endpoint; 78 event.data.ptr = endpoint;
78 event.events = this->events[handle]; 79 event.events = this->events[handle];
79 80
@@ -100,8 +101,9 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout) @@ -100,8 +101,9 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout)
100 && ((TR_TcpSocket)endpoint->transport)->listen) { 101 && ((TR_TcpSocket)endpoint->transport)->listen) {
101 TR_hashAdd(cmgr->accept, endpoint); 102 TR_hashAdd(cmgr->accept, endpoint);
102 } else { 103 } else {
103 - TR_hashAdd(cmgr->read, endpoint);  
104 - 104 + if (! event->subject->fin) {
  105 + TR_hashAdd(cmgr->read, endpoint);
  106 + }
105 } 107 }
106 108
107 this->events[handle] &= ~EPOLLIN; 109 this->events[handle] &= ~EPOLLIN;
@@ -111,11 +113,22 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout) @@ -111,11 +113,22 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout)
111 } 113 }
112 114
113 if ((events[i].events & EPOLLOUT) == EPOLLOUT) { 115 if ((events[i].events & EPOLLOUT) == EPOLLOUT) {
  116 + if (! event->subject->fin) {
114 TR_hashAdd(cmgr->write, endpoint); 117 TR_hashAdd(cmgr->write, endpoint);
115 - this->events[handle] &= ~EPOLLOUT;  
116 - _event.data.ptr = endpoint;  
117 - _event.events = this->events[handle];  
118 - epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &_event); 118 + }
  119 + this->events[handle] &= ~EPOLLOUT;
  120 + _event.data.ptr = endpoint;
  121 + _event.events = this->events[handle];
  122 + epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &_event);
  123 + }
  124 +
  125 + if ((events[i].events & EPOLLHUP) == EPOLLHUP) {
  126 + TR_eventHandlerIssueEvent(
  127 + (TR_EventHandler)_this,
  128 + TR_eventSubjectEmit(
  129 + (TR_EventSubject)endpoint,
  130 + TR_CEP_EVENT_SHUT_WRITE,
  131 + NULL));
119 } 132 }
120 } 133 }
121 } 134 }
@@ -123,6 +136,23 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout) @@ -123,6 +136,23 @@ TR_commManagerEpollSelect(void * _this, TR_Event event, int timeout)
123 static 136 static
124 inline 137 inline
125 void 138 void
  139 +TR_commManagerEpollDisable(void * _this, uint32_t mask, TR_Event event)
  140 +{
  141 + TR_CommManagerEpoll this = _this;
  142 + TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject;
  143 + int handle = endpoint->transport->handle;
  144 + struct epoll_event _event;
  145 +
  146 + this->events[handle] &= ~mask;
  147 + _event.data.ptr = endpoint;
  148 + _event.events = this->events[handle];
  149 +
  150 + epoll_ctl(this->handle, EPOLL_CTL_MOD, handle, &_event);
  151 +}
  152 +
  153 +static
  154 +inline
  155 +void
126 TR_commManagerEpollEnable(void * _this, uint32_t mask, TR_Event event) 156 TR_commManagerEpollEnable(void * _this, uint32_t mask, TR_Event event)
127 { 157 {
128 TR_CommManagerEpoll this = _this; 158 TR_CommManagerEpoll this = _this;
@@ -157,6 +187,20 @@ TR_commManagerEpollEnableRead(void * _this, TR_Event event) @@ -157,6 +187,20 @@ TR_commManagerEpollEnableRead(void * _this, TR_Event event)
157 187
158 static 188 static
159 void 189 void
  190 +TR_commManagerEpollDisableWrite(void * _this, TR_Event event)
  191 +{
  192 + TR_commManagerEpollDisable(_this, EPOLLOUT, event);
  193 +}
  194 +
  195 +static
  196 +void
  197 +TR_commManagerEpollDisableRead(void * _this, TR_Event event)
  198 +{
  199 + TR_commManagerEpollDisable(_this, EPOLLIN, event);
  200 +}
  201 +
  202 +static
  203 +void
160 TR_commManagerEpollClose(void * _this, TR_Event event) 204 TR_commManagerEpollClose(void * _this, TR_Event event)
161 { 205 {
162 TR_CommManagerEpoll this = _this; 206 TR_CommManagerEpoll this = _this;
@@ -178,6 +222,8 @@ TR_INIT_IFACE( @@ -178,6 +222,8 @@ TR_INIT_IFACE(
178 TR_commManagerEpollSelect, // TR_DISPATCHER_EVENT_DATA_WAIT 222 TR_commManagerEpollSelect, // TR_DISPATCHER_EVENT_DATA_WAIT
179 TR_commManagerEpollEnableWrite, // TR_CEP_EVENT_PENDING_DATA => WRITE_BLOCK 223 TR_commManagerEpollEnableWrite, // TR_CEP_EVENT_PENDING_DATA => WRITE_BLOCK
180 TR_commManagerEpollEnableRead, // TR_CEP_EVENT_READ_BLOCK 224 TR_commManagerEpollEnableRead, // TR_CEP_EVENT_READ_BLOCK
  225 + TR_commManagerEpollDisableWrite,
  226 + TR_commManagerEpollDisableRead,
181 TR_commManagerEpollClose); // TR_CEP_EVENT_CLOSE 227 TR_commManagerEpollClose); // TR_CEP_EVENT_CLOSE
182 TR_CREATE_CLASS( 228 TR_CREATE_CLASS(
183 TR_CommManagerEpoll, 229 TR_CommManagerEpoll,
@@ -96,16 +96,31 @@ TR_commManagerPollSelect(void * _this, TR_Event event, int timeout) @@ -96,16 +96,31 @@ TR_commManagerPollSelect(void * _this, TR_Event event, int timeout)
96 && ((TR_TcpSocket)endpoint->transport)->listen) { 96 && ((TR_TcpSocket)endpoint->transport)->listen) {
97 TR_hashAdd(cmgr->accept, endpoint); 97 TR_hashAdd(cmgr->accept, endpoint);
98 } else { 98 } else {
99 - TR_hashAdd(cmgr->read, endpoint); 99 + if (! event->subject->fin) {
  100 + TR_hashAdd(cmgr->read, endpoint);
  101 + }
100 } 102 }
101 this->fds[endpoint->transport->handle].events &= ~POLLIN; 103 this->fds[endpoint->transport->handle].events &= ~POLLIN;
102 } 104 }
103 105
104 if ((this->fds[i].revents & POLLOUT) == POLLOUT) { 106 if ((this->fds[i].revents & POLLOUT) == POLLOUT) {
105 - TR_hashAdd(cmgr->write, endpoint);  
106 - this->fds[endpoint->transport->handle].events &= ~POLLOUT; 107 + if (! event->subject->fin) {
  108 + TR_hashAdd(cmgr->write, endpoint);
  109 + }
  110 + this->fds[endpoint->transport->handle].events &=
  111 + ~(POLLOUT|POLLHUP);
  112 + }
  113 +
  114 + if ((this->fds[i].revents & POLLHUP) == POLLHUP) {
  115 + TR_eventHandlerIssueEvent(
  116 + (TR_EventHandler)_this,
  117 + TR_eventSubjectEmit(
  118 + (TR_EventSubject)endpoint,
  119 + TR_CEP_EVENT_SHUT_WRITE,
  120 + NULL));
107 } 121 }
108 122
  123 + this->fds[i].revents = 0;
109 if (nevents <= 0) break; 124 if (nevents <= 0) break;
110 } 125 }
111 } 126 }
@@ -120,7 +135,7 @@ TR_commManagerPollEnableWrite(void * _this, TR_Event event) @@ -120,7 +135,7 @@ TR_commManagerPollEnableWrite(void * _this, TR_Event event)
120 TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject; 135 TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject;
121 136
122 if (! TR_socketFinWr(endpoint->transport)) { 137 if (! TR_socketFinWr(endpoint->transport)) {
123 - this->fds[endpoint->transport->handle].events |= POLLOUT; 138 + this->fds[endpoint->transport->handle].events |= POLLOUT|POLLHUP;
124 } 139 }
125 } 140 }
126 141
@@ -138,6 +153,26 @@ TR_commManagerPollEnableRead(void * _this, TR_Event event) @@ -138,6 +153,26 @@ TR_commManagerPollEnableRead(void * _this, TR_Event event)
138 153
139 static 154 static
140 void 155 void
  156 +TR_commManagerPollDisableWrite(void * _this, TR_Event event)
  157 +{
  158 + TR_CommManagerPoll this = _this;
  159 + TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject;
  160 +
  161 + this->fds[endpoint->transport->handle].events &= ~(POLLOUT|POLLHUP);
  162 +}
  163 +
  164 +static
  165 +void
  166 +TR_commManagerPollDisableRead(void * _this, TR_Event event)
  167 +{
  168 + TR_CommManagerPoll this = _this;
  169 + TR_CommEndPoint endpoint = (TR_CommEndPoint)event->subject;
  170 +
  171 + this->fds[endpoint->transport->handle].events &= ~POLLIN;
  172 +}
  173 +
  174 +static
  175 +void
141 TR_commManagerPollClose(void * _this, TR_Event event) 176 TR_commManagerPollClose(void * _this, TR_Event event)
142 { 177 {
143 TR_CommManagerPoll this = _this; 178 TR_CommManagerPoll this = _this;
@@ -160,6 +195,8 @@ TR_INIT_IFACE( @@ -160,6 +195,8 @@ TR_INIT_IFACE(
160 TR_commManagerPollSelect, 195 TR_commManagerPollSelect,
161 TR_commManagerPollEnableWrite, 196 TR_commManagerPollEnableWrite,
162 TR_commManagerPollEnableRead, 197 TR_commManagerPollEnableRead,
  198 + TR_commManagerPollDisableWrite,
  199 + TR_commManagerPollDisableRead,
163 TR_commManagerPollClose); 200 TR_commManagerPollClose);
164 TR_CREATE_CLASS( 201 TR_CREATE_CLASS(
165 TR_CommManagerPoll, 202 TR_CommManagerPoll,
@@ -144,6 +144,30 @@ TR_commManagerPollRead(void * _this, TR_Event event) @@ -144,6 +144,30 @@ TR_commManagerPollRead(void * _this, TR_Event event)
144 } 144 }
145 145
146 TR_EventDone 146 TR_EventDone
  147 +TR_commManagerDisableRead(void * _this, TR_Event event)
  148 +{
  149 + TR_CommManager this = _this;
  150 + TR_hashDeleteByVal(this->read, TR_hashableGetHash(event->subject));
  151 + TR_CALL(_this, TR_CommManager, disableRead, event);
  152 +
  153 + return TR_EVENT_DONE;
  154 +}
  155 +
  156 +TR_EventDone
  157 +TR_commManagerDisableWrite(void * _this, TR_Event event)
  158 +{
  159 + TR_CommManager this = _this;
  160 +
  161 + TR_hashDeleteByVal(this->write, TR_hashableGetHash(event->subject));
  162 + if (! event->subject->fin) {
  163 + TR_hashAdd(this->read, event->subject);
  164 + }
  165 + TR_CALL(_this, TR_CommManager, disableWrite, event);
  166 +
  167 + return TR_EVENT_DONE;
  168 +}
  169 +
  170 +TR_EventDone
147 TR_commManagerClose(void * _this, TR_Event event) 171 TR_commManagerClose(void * _this, TR_Event event)
148 { 172 {
149 TR_CommManager this = _this; 173 TR_CommManager this = _this;
@@ -155,12 +179,14 @@ TR_commManagerClose(void * _this, TR_Event event) @@ -155,12 +179,14 @@ TR_commManagerClose(void * _this, TR_Event event)
155 } 179 }
156 180
157 if (handle == this->max_handle) { 181 if (handle == this->max_handle) {
158 - while (! this->endpoints[--this->max_handle]); 182 + while (! this->endpoints[--this->max_handle] &&
  183 + this->max_handle > 0);
159 } 184 }
160 185
161 if (this->endpoints[handle]) { 186 if (this->endpoints[handle]) {
162 TR_eventSubjectFinalize((TR_EventSubject)this->endpoints[handle]); 187 TR_eventSubjectFinalize((TR_EventSubject)this->endpoints[handle]);
163 - this->endpoints[handle] = NULL; 188 + TR_CALL(_this, TR_CommManager, disableWrite, event);
  189 + TR_CALL(_this, TR_CommManager, disableRead, event);
164 TR_hashDeleteByVal(this->write, TR_hashableGetHash(endpoint)); 190 TR_hashDeleteByVal(this->write, TR_hashableGetHash(endpoint));
165 TR_hashDeleteByVal(this->read, TR_hashableGetHash(endpoint)); 191 TR_hashDeleteByVal(this->read, TR_hashableGetHash(endpoint));
166 } 192 }
@@ -51,44 +51,42 @@ ioHandlerRead(void * _this, TR_Event event) @@ -51,44 +51,42 @@ ioHandlerRead(void * _this, TR_Event event)
51 TR_Event revent; 51 TR_Event revent;
52 TR_RemoteData data; 52 TR_RemoteData data;
53 53
54 - if (endpoint->write_buffer_size < CEP_WRITE_BUFFER_THRESHOLD) {  
55 - switch (TR_commEndPointRead(endpoint, &data)) {  
56 - case FALSE: // EAGAIN  
57 - revent = TR_eventSubjectEmit(  
58 - event->subject,  
59 - TR_CEP_EVENT_READ_BLOCK,  
60 - NULL);  
61 - break;  
62 -  
63 - case -1: // error  
64 - revent = TR_eventSubjectEmit(  
65 - event->subject,  
66 - TR_CEP_EVENT_CLOSE,  
67 - NULL);  
68 - break; 54 + switch (TR_commEndPointRead(endpoint, &data)) {
  55 + case FALSE: // EAGAIN
  56 + revent = TR_eventSubjectEmit(
  57 + event->subject,
  58 + TR_CEP_EVENT_READ_BLOCK,
  59 + NULL);
  60 + break;
69 61
70 - default:  
71 - case -2: // remote close  
72 - revent = TR_eventSubjectEmit(  
73 - event->subject,  
74 - TR_CEP_EVENT_SHUT_READ,  
75 - NULL);  
76 - break; 62 + case -1: // error
  63 + revent = TR_eventSubjectEmit(
  64 + event->subject,
  65 + TR_CEP_EVENT_CLOSE,
  66 + NULL);
  67 + break;
77 68
78 - case -3: // read limit  
79 - return TR_EVENT_DONE; 69 + default:
  70 + case -2: // remote close
  71 + revent = TR_eventSubjectEmit(
  72 + event->subject,
  73 + TR_CEP_EVENT_SHUT_READ,
  74 + NULL);
  75 + break;
80 76
81 - case TRUE:  
82 - revent = TR_eventSubjectEmit(  
83 - event->subject,  
84 - TR_CEP_EVENT_NEW_DATA,  
85 - data);  
86 - break;  
87 - } 77 + case -3: // read limit
  78 + return TR_EVENT_DONE;
88 79
89 - TR_eventHandlerIssueEvent((TR_EventHandler)_this, revent); 80 + case TRUE:
  81 + revent = TR_eventSubjectEmit(
  82 + event->subject,
  83 + TR_CEP_EVENT_NEW_DATA,
  84 + data);
  85 + break;
90 } 86 }
91 87
  88 + TR_eventHandlerIssueEvent((TR_EventHandler)_this, revent);
  89 +
92 return TR_EVENT_DONE; 90 return TR_EVENT_DONE;
93 } 91 }
94 92
@@ -89,6 +89,15 @@ protocolHandlerCompose(void * _this, TR_Event event) @@ -89,6 +89,15 @@ protocolHandlerCompose(void * _this, TR_Event event)
89 if ((message_size = TR_cepCompose(endpoint, message))) { 89 if ((message_size = TR_cepCompose(endpoint, message))) {
90 endpoint->write_buffer_size += message_size; 90 endpoint->write_buffer_size += message_size;
91 91
  92 + if (endpoint->write_buffer_size >= CEP_WRITE_BUFFER_THRESHOLD) {
  93 + TR_eventHandlerIssueEvent(
  94 + (TR_EventHandler)_this,
  95 + TR_eventSubjectEmit(
  96 + event->subject,
  97 + TR_CEP_EVENT_WBUF_FULL,
  98 + NULL));
  99 + }
  100 +
92 if (endpoint->write_buffer->nmsg == 1) { 101 if (endpoint->write_buffer->nmsg == 1) {
93 TR_eventHandlerIssueEvent( 102 TR_eventHandlerIssueEvent(
94 (TR_EventHandler)_this, 103 (TR_EventHandler)_this,
@@ -11,7 +11,9 @@ static @@ -11,7 +11,9 @@ static
11 TR_EventDone 11 TR_EventDone
12 testHandlerHeartbeat(TR_EventHandler this, TR_Event event) 12 testHandlerHeartbeat(TR_EventHandler this, TR_Event event)
13 { 13 {
14 - printf("handled: %llu/s\n", ((TestHandler)this)->handled); 14 + printf("%zd beats since last beat / handled: %llu/s\n",
  15 + ((TR_EventDispatcher)event->subject)->n_beats,
  16 + ((TestHandler)this)->handled);
15 ((TestHandler)this)->handled = 0; 17 ((TestHandler)this)->handled = 0;
16 18
17 return TR_EVENT_DONE; 19 return TR_EVENT_DONE;
@@ -51,7 +53,7 @@ static @@ -51,7 +53,7 @@ static
51 TR_EventDone 53 TR_EventDone
52 testHandlerClose(TR_EventHandler this, TR_Event event) 54 testHandlerClose(TR_EventHandler this, TR_Event event)
53 { 55 {
54 - puts("close"); 56 +// puts("close");
55 57
56 return TR_EVENT_PENDING; 58 return TR_EVENT_PENDING;
57 } 59 }
1 #!/bin/sh 1 #!/bin/sh
2 2
3 BS=8192 3 BS=8192
4 -COUNT=25000 4 +COUNT=10000
5 CONCURENT=200 5 CONCURENT=200
6 IP="192.168.2.13" 6 IP="192.168.2.13"
7 pids="" 7 pids=""
8 i=0 8 i=0
9 9
  10 +MESSAGE="GET / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"
  11 +
10 while [ $i -lt ${CONCURENT} ] 12 while [ $i -lt ${CONCURENT} ]
11 do 13 do
12 - dd if=/dev/zero bs=${BS} count=${COUNT} | nc ${IP} 5678 >/dev/null & 14 + dd if=/dev/zero bs=${BS} count=${COUNT} | nc -q 1 ${IP} 5678 >/dev/null &
  15 + #echo -en "${MESSAGE}" | nc -q 1 ${IP} 5678 &
  16 +
13 pids="${pids} $!" 17 pids="${pids} $!"
14 i=$((i + 1)) 18 i=$((i + 1))
15 done 19 done
Please register or login to post a comment