simpler block queuing; go back to dict_size blocks; run test in bash, some sh have no "time"

pull/2/head
root 15 years ago
parent 8a90a6dce7
commit c158b057f2

@ -1,4 +1,4 @@
#!/bin/sh #!/bin/bash
#base=lmnopuz #base=lmnopuz
#file=lmnopuz/CheckPUZ.app/Contents/Resources/script #file=lmnopuz/CheckPUZ.app/Contents/Resources/script

@ -58,7 +58,8 @@ static archive_close_callback tar_ok;
static void block_init(lzma_block *block); static void block_init(lzma_block *block);
static void stream_edge(lzma_vli backward_size); static void stream_edge(lzma_vli backward_size);
static void write_blocks(io_block_t **ibs, size_t *seq); static void write_blocks(size_t *seq, io_block_t **ibs, io_block_t *ib);
static void write_block(io_block_t *ib);
static void encode_index(void); static void encode_index(void);
static void write_file_index(void); static void write_file_index(void);
@ -84,7 +85,7 @@ int main(int argc, char **argv) {
.options = &lzma_opts }; .options = &lzma_opts };
gFilters[1] = (lzma_filter){ .id = LZMA_VLI_UNKNOWN, .options = NULL }; gFilters[1] = (lzma_filter){ .id = LZMA_VLI_UNKNOWN, .options = NULL };
gBlockInSize = lzma_opts.dict_size * 2.0; gBlockInSize = lzma_opts.dict_size * 1.0;
gBlockOutSize = lzma_block_buffer_bound(gBlockInSize); gBlockOutSize = lzma_block_buffer_bound(gBlockInSize);
// thread setup // thread setup
@ -121,9 +122,7 @@ int main(int argc, char **argv) {
if (msg == MSG_STOP) if (msg == MSG_STOP)
break; break;
ib->next = ibs; write_blocks(&seq, &ibs, ib);
ibs = ib;
write_blocks(&ibs, &seq);
} }
// file index // file index
@ -321,38 +320,43 @@ static void stream_edge(lzma_vli backward_size) {
die("Error writing stream edge"); die("Error writing stream edge");
} }
static void write_blocks(io_block_t **ibs, size_t *seq) { static void write_block(io_block_t *ib) {
// check if we can write anything // Does it make sense to chunk this?
bool block_missing = false; size_t written = 0;
while (!block_missing) { while (ib->outsize > written) {
block_missing = true; // assume no match size_t size = ib->outsize - written;
if (size > CHUNKSIZE)
io_block_t *prev = NULL; size = CHUNKSIZE;
for (io_block_t *ib = *ibs; ib; ib = ib->next) { if (fwrite(ib->output + written, size, 1, gOutFile) != 1)
if (ib->seq == *seq) { // we have the next block die("Error writing block data");
if (fwrite(ib->output, ib->outsize, 1, gOutFile) != 1) written += size;
die("Error writing block data"); }
if (lzma_index_append(gIndex, NULL,
lzma_block_unpadded_size(&ib->block), if (lzma_index_append(gIndex, NULL,
ib->block.uncompressed_size) != LZMA_OK) lzma_block_unpadded_size(&ib->block),
die("Error adding to index"); ib->block.uncompressed_size) != LZMA_OK)
die("Error adding to index");
// remove the found block }
if (prev) {
prev->next = ib->next; static void write_blocks(size_t *seq, io_block_t **ibs, io_block_t *ib) {
} else { // insert it into the queue, in order
*ibs = ib->next; io_block_t **prev = ibs, *post = *ibs;
} while (post && post->seq < ib->seq) {
queue_push(gReadQ, MSG_BLOCK, ib); prev = &post->next;
post = post->next;
++*seq; }
block_missing = false; ib->next = post;
break; *prev = ib;
}
// write the blocks that we can
prev = ib; io_block_t *cur = *ibs;
} // for io_block_t while (cur && cur->seq == *seq) {
} // while !block_missing write_block(cur);
queue_push(gReadQ, MSG_BLOCK, cur);
++*seq;
cur = cur->next;
}
*ibs = cur;
} }
static void encode_index(void) { static void encode_index(void) {

Loading…
Cancel
Save