Adding upstream version 0.13.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
454dd91a77
commit
ab822ce17b
21 changed files with 280 additions and 225 deletions
44
create_lz.cc
44
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; }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue