diff options
Diffstat (limited to 'create_lz.cc')
-rw-r--r-- | create_lz.cc | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/create_lz.cc b/create_lz.cc index 797427b..e2aaf3d 100644 --- a/create_lz.cc +++ b/create_lz.cc @@ -368,7 +368,11 @@ void loop_encode( const uint8_t * const ibuf, const int isize, courier.collect_packet( new Opacket( obuf, opos ), worker_id ); opos = 0; obuf = new( std::nothrow ) uint8_t[max_packet_size]; if( !obuf ) { show_error( mem_msg2 ); cleanup_and_fail(); } - if( LZ_compress_finished( encoder ) == 1 ) break; + if( LZ_compress_finished( encoder ) == 1 ) + { + if( LZ_compress_restart_member( encoder, LLONG_MAX ) >= 0 ) break; + show_error( "LZ_compress_restart_member failed." ); cleanup_and_fail(); + } } } if( ipos > isize ) internal_error( "ipacket size exceeded in worker." ); @@ -401,27 +405,27 @@ extern "C" void * cworker( void * arg ) if( !rbuf.size() ) { show_error( mem_msg2 ); cleanup_and_fail(); } int opos = 0; + bool flushed = true; // avoid producing empty lzip members while( true ) { const Ipacket * const ipacket = courier.distribute_packet( worker_id ); if( !ipacket ) break; // no more packets to process - if( ipacket->filename.empty() ) // end of group, flush encoder + if( ipacket->filename.empty() ) // end of group { - if( !encoder ) { delete ipacket; continue; } // nothing to flush - loop_encode( 0, 0, data, opos, courier, encoder, worker_id, true ); + if( !flushed ) // this lzip member is not empty + loop_encode( 0, 0, data, opos, courier, encoder, worker_id, true ); courier.collect_packet( new Opacket, worker_id ); // end of member token - if( LZ_compress_restart_member( encoder, LLONG_MAX ) < 0 ) - { show_error( "LZ_compress_restart_member failed." ); cleanup_and_fail(); } - delete ipacket; continue; + flushed = true; delete ipacket; continue; } const int infd = ipacket->file_size ? open_instream( ipacket->filename.c_str() ) : -1; - if( ipacket->file_size && infd < 0 ) + if( ipacket->file_size && infd < 0 ) // can't read file data { delete[] ipacket->header; delete ipacket->extended; delete ipacket; - set_error_status( 1 ); continue; } + set_error_status( 1 ); continue; } // skip file - if( !encoder ) + flushed = false; + if( !encoder ) // init encoder just before using it { data = new( std::nothrow ) uint8_t[max_packet_size]; encoder = LZ_compress_open( dictionary_size, match_len_limit, LLONG_MAX ); @@ -494,17 +498,15 @@ extern "C" void * cworker( void * arg ) /* Get from courier the processed and sorted packets, and write their contents to the output archive. */ -void muxer( Packet_courier & courier, const char * const archive_name, - const int outfd ) +void muxer( Packet_courier & courier, const int outfd ) { while( true ) { const Opacket * const opacket = courier.deliver_packet(); if( !opacket ) break; // queue is empty. all workers exited - if( writeblock( outfd, opacket->data, opacket->size ) != opacket->size ) - { show_file_error( archive_name, "Write error", errno ); - cleanup_and_fail(); } + if( !writeblock_wrapper( outfd, opacket->data, opacket->size ) ) + cleanup_and_fail(); delete[] opacket->data; delete opacket; } @@ -514,9 +516,9 @@ void muxer( Packet_courier & courier, const char * const archive_name, // init the courier, then start the grouper and the workers and call the muxer -int encode_lz( const char * const archive_name, const Arg_parser & parser, - const int dictionary_size, const int match_len_limit, - const int num_workers, const int outfd, const int debug_level ) +int encode_lz( const Arg_parser & parser, const int dictionary_size, + const int match_len_limit, const int num_workers, + const int outfd, const int debug_level ) { const int in_slots = 65536; // max small files (<=512B) in 64 MiB const int total_in_slots = ( INT_MAX / num_workers >= in_slots ) ? @@ -552,7 +554,7 @@ int encode_lz( const char * const archive_name, const Arg_parser & parser, { show_error( "Can't create worker threads", errcode ); cleanup_and_fail(); } } - muxer( courier, archive_name, outfd ); + muxer( courier, outfd ); for( int i = num_workers - 1; i >= 0; --i ) { @@ -575,9 +577,7 @@ int encode_lz( const char * const archive_name, const Arg_parser & parser, 0xA3, 0xB7, 0x80, 0x0C, 0x82, 0xDB, 0xFF, 0xFF, 0x9F, 0xF0, 0x00, 0x00, 0x2E, 0xAF, 0xB5, 0xEF, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - if( writeblock( outfd, eof_member, eof_member_size ) != eof_member_size ) - { show_error( "Error writing end-of-archive blocks", errno ); - retval = 1; } + if( !writeblock_wrapper( outfd, eof_member, eof_member_size ) ) retval = 1; if( close( outfd ) != 0 && !retval ) { show_error( "Error closing archive", errno ); retval = 1; } |