diff options
author | Dirk Engling <erdgeist@erdgeist.org> | 2021-04-24 03:25:30 +0200 |
---|---|---|
committer | Dirk Engling <erdgeist@erdgeist.org> | 2021-04-24 03:25:30 +0200 |
commit | 95f1780f0b6229a6f52b6dbad1a645b4e91c6b06 (patch) | |
tree | 152d4f281d0eb1380fe5c4d31f32341e5ac22e50 /opentracker.c | |
parent | e87978860b1de6822db001cbc1d313694002ea28 (diff) |
Split huge iovecs over multiple io_batches
Diffstat (limited to 'opentracker.c')
-rw-r--r-- | opentracker.c | 27 |
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 ) { | |||
156 | static void handle_dead( const int64 sock ) { | 156 | static 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 | ||
205 | static void handle_write( const int64 sock ) { | 208 | static 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 | ||
215 | static void handle_accept( const int64 serversocket ) { | 228 | static void handle_accept( const int64 serversocket ) { |