summaryrefslogtreecommitdiff
path: root/ot_fullscrape.c
diff options
context:
space:
mode:
Diffstat (limited to 'ot_fullscrape.c')
-rw-r--r--ot_fullscrape.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/ot_fullscrape.c b/ot_fullscrape.c
index b147b6a..86b9e26 100644
--- a/ot_fullscrape.c
+++ b/ot_fullscrape.c
@@ -262,33 +262,36 @@ fprintf(stderr, "GZIP path\n");
262 if( deflate( &strm, Z_FINISH ) < Z_OK ) 262 if( deflate( &strm, Z_FINISH ) < Z_OK )
263 fprintf( stderr, "deflate() failed while in fullscrape_make()'s endgame.\n" ); 263 fprintf( stderr, "deflate() failed while in fullscrape_make()'s endgame.\n" );
264 264
265 if( !strm.avail_out ) { 265 iovector.iov_len = (char *)strm.next_out - (char *)iovector.iov_base;
266 if (mutex_workqueue_pushchunked(taskid, &iovector) ) {
267 free(iovector.iov_base);
268 return mutex_bucket_unlock( bucket, 0 );
269 }
270
271 {
266 unsigned int pending; 272 unsigned int pending;
267 int bits; 273 int bits;
268 deflatePending( &strm, &pending, &bits); 274 deflatePending( &strm, &pending, &bits);
269 pending += ( bits ? 1 : 0 ); 275 pending += ( bits ? 1 : 0 );
270 276
271 iovector.iov_len = (char *)strm.next_out - (char *)iovector.iov_base; 277 if (pending) {
272 if (mutex_workqueue_pushchunked(taskid, &iovector) ) { 278 /* Allocate a fresh output buffer */
273 free(iovector.iov_base); 279 iovector.iov_base = malloc( pending );
280 iovector.iov_len = pending;
281
282 if( !iovector.iov_base ) {
283 fprintf( stderr, "Problem with iovec_fix_increase_or_free\n" );
284 deflateEnd(&strm);
274 return mutex_bucket_unlock( bucket, 0 ); 285 return mutex_bucket_unlock( bucket, 0 );
275 } 286 }
276 /* Allocate a fresh output buffer */ 287 strm.next_out = iovector.iov_base;
277 iovector.iov_base = malloc( pending ); 288 strm.avail_out = pending;
278 iovector.iov_len = pending; 289 if( deflate( &strm, Z_FINISH ) < Z_OK )
290 fprintf( stderr, "deflate() failed while in fullscrape_make()'s endgame.\n" );
279 291
280 if( !iovector.iov_base ) { 292 if( mutex_workqueue_pushchunked(taskid, &iovector) )
281 fprintf( stderr, "Problem with iovec_fix_increase_or_free\n" ); 293 free(iovector.iov_base);
282 deflateEnd(&strm);
283 return mutex_bucket_unlock( bucket, 0 );
284 } 294 }
285 strm.next_out = iovector.iov_base;
286 strm.avail_out = pending;
287 if( deflate( &strm, Z_FINISH ) < Z_OK )
288 fprintf( stderr, "deflate() failed while in fullscrape_make()'s endgame.\n" );
289
290 if( mutex_workqueue_pushchunked(taskid, &iovector) )
291 free(iovector.iov_base);
292 } 295 }
293 296
294 deflateEnd(&strm); 297 deflateEnd(&strm);