summaryrefslogtreecommitdiff
path: root/opentracker.c
diff options
context:
space:
mode:
Diffstat (limited to 'opentracker.c')
-rw-r--r--opentracker.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/opentracker.c b/opentracker.c
index 441639a..cc0700c 100644
--- a/opentracker.c
+++ b/opentracker.c
@@ -156,7 +156,10 @@ static size_t header_complete( char * request, ssize_t byte_count ) {
156static void handle_dead( const int64 sock ) { 156static void handle_dead( const int64 sock ) {
157 struct http_data* cookie=io_getcookie( sock ); 157 struct http_data* cookie=io_getcookie( sock );
158 if( cookie ) { 158 if( cookie ) {
159 iob_reset( &cookie->batch ); 159 size_t i;
160 for ( i = 0; i < cookie->batches; ++i)
161 iob_reset( cookie->batch + i );
162 free( cookie->batch );
160 array_reset( &cookie->request ); 163 array_reset( &cookie->request );
161 if( cookie->flag & STRUCT_HTTP_FLAG_WAITINGFORTASK ) 164 if( cookie->flag & STRUCT_HTTP_FLAG_WAITINGFORTASK )
162 mutex_workqueue_canceltask( sock ); 165 mutex_workqueue_canceltask( sock );
@@ -204,12 +207,22 @@ static void handle_read( const int64 sock, struct ot_workstruct *ws ) {
204 207
205static void handle_write( const int64 sock ) { 208static void handle_write( const int64 sock ) {
206 struct http_data* cookie=io_getcookie( sock ); 209 struct http_data* cookie=io_getcookie( sock );
207 if( cookie ) { 210 size_t i;
208 int64 res = iob_send( sock, &cookie->batch ); 211
209 if (res == 0 || res == -3) 212 /* Look for the first io_batch still containing bytes to write */
210 handle_dead( sock ); 213 if( cookie )
211 } else 214 for( i = 0; i < cookie->batches; ++i )
212 handle_dead( sock ); 215 if( cookie->batch[i].bytesleft ) {
216 int64 res = iob_send( sock, cookie->batch + i );
217
218 if( res == -3 )
219 break;
220
221 if( res == -1 || res > 0 || i < cookie->batches - 1 )
222 return;
223 }
224
225 handle_dead( sock );
213} 226}
214 227
215static void handle_accept( const int64 serversocket ) { 228static void handle_accept( const int64 serversocket ) {