Improve memory efficiency when total file size < total size of chunks.
Fix freeing of Zlib structures.
This commit is contained in:
parent
bf149e880d
commit
d4e9cd0140
2 changed files with 27 additions and 25 deletions
50
main.c
50
main.c
|
@ -605,6 +605,27 @@ start_decompress(const char *filename, const char *to_filename)
|
||||||
if (main_cancel) break;
|
if (main_cancel) break;
|
||||||
tdat->id = chunk_num;
|
tdat->id = chunk_num;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First read length of compressed chunk.
|
||||||
|
*/
|
||||||
|
rb = Read(compfd, &tdat->len_cmp, sizeof (tdat->len_cmp));
|
||||||
|
if (rb != sizeof (tdat->len_cmp)) {
|
||||||
|
if (rb < 0) perror("Read: ");
|
||||||
|
else
|
||||||
|
fprintf(stderr, "Incomplete chunk %d header,"
|
||||||
|
"file corrupt\n", chunk_num);
|
||||||
|
UNCOMP_BAIL;
|
||||||
|
}
|
||||||
|
tdat->len_cmp = htonll(tdat->len_cmp);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Zero compressed len means end of file.
|
||||||
|
*/
|
||||||
|
if (tdat->len_cmp == 0) {
|
||||||
|
bail = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Delayed allocation. Allocate chunks if not already done. The compressed
|
* Delayed allocation. Allocate chunks if not already done. The compressed
|
||||||
* file format does not provide any info on how many chunks are there in
|
* file format does not provide any info on how many chunks are there in
|
||||||
|
@ -627,27 +648,6 @@ start_decompress(const char *filename, const char *to_filename)
|
||||||
tdat->cmp_seg = tdat->uncompressed_chunk;
|
tdat->cmp_seg = tdat->uncompressed_chunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* First read length of compressed chunk.
|
|
||||||
*/
|
|
||||||
rb = Read(compfd, &tdat->len_cmp, sizeof (tdat->len_cmp));
|
|
||||||
if (rb != sizeof (tdat->len_cmp)) {
|
|
||||||
if (rb < 0) perror("Read: ");
|
|
||||||
else
|
|
||||||
fprintf(stderr, "Incomplete chunk %d header,"
|
|
||||||
"file corrupt\n", chunk_num);
|
|
||||||
UNCOMP_BAIL;
|
|
||||||
}
|
|
||||||
tdat->len_cmp = htonll(tdat->len_cmp);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Zero compressed len means end of file.
|
|
||||||
*/
|
|
||||||
if (tdat->len_cmp == 0) {
|
|
||||||
bail = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdat->len_cmp > largest_chunk)
|
if (tdat->len_cmp > largest_chunk)
|
||||||
largest_chunk = tdat->len_cmp;
|
largest_chunk = tdat->len_cmp;
|
||||||
if (tdat->len_cmp < smallest_chunk)
|
if (tdat->len_cmp < smallest_chunk)
|
||||||
|
@ -1192,6 +1192,10 @@ start_compress(const char *filename, uint64_t chunksize, int level)
|
||||||
sem_wait(&tdat->write_done_sem);
|
sem_wait(&tdat->write_done_sem);
|
||||||
if (main_cancel) break;
|
if (main_cancel) break;
|
||||||
|
|
||||||
|
if (rbytes == 0) { /* EOF */
|
||||||
|
bail = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* Delayed allocation. Allocate chunks if not already done.
|
* Delayed allocation. Allocate chunks if not already done.
|
||||||
*/
|
*/
|
||||||
|
@ -1258,10 +1262,6 @@ start_compress(const char *filename, uint64_t chunksize, int level)
|
||||||
bail = 1;
|
bail = 1;
|
||||||
perror("Read: ");
|
perror("Read: ");
|
||||||
COMP_BAIL;
|
COMP_BAIL;
|
||||||
|
|
||||||
} else if (tdat->rbytes == 0) { /* EOF */
|
|
||||||
bail = 1;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* Signal the compression thread to start */
|
/* Signal the compression thread to start */
|
||||||
|
|
|
@ -84,6 +84,8 @@ int
|
||||||
zlib_deinit(void **data)
|
zlib_deinit(void **data)
|
||||||
{
|
{
|
||||||
if (*data) {
|
if (*data) {
|
||||||
|
z_stream *zs = (z_stream *)(*data);
|
||||||
|
deflateEnd(zs);
|
||||||
slab_free(NULL, *data);
|
slab_free(NULL, *data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue