From afc0c76a170bd17cbd29bbec6ae6d2227e398570 Mon Sep 17 00:00:00 2001 From: Alexander Couzens Date: Fri, 13 Jan 2017 22:00:37 +0100 Subject: [PATCH] remove frag_deflator_thread frag_deflator_thread compress fragments. Replace the deflator_thread with a function and use the function instead of the to_frag queue. --- squashfs-tools/info.c | 5 --- squashfs-tools/mksquashfs.c | 76 +++++++++++++------------------------ squashfs-tools/mksquashfs.h | 2 +- squashfs-tools/restore.c | 15 +------- 4 files changed, 30 insertions(+), 68 deletions(-) diff --git a/squashfs-tools/info.c b/squashfs-tools/info.c index 7968c77..028d578 100644 --- a/squashfs-tools/info.c +++ b/squashfs-tools/info.c @@ -96,11 +96,6 @@ void dump_state() printf("compressed block queue (deflate thread(s) -> main thread)\n"); dump_seq_queue(to_main, 0); - printf("uncompressed packed fragment queue (main thread -> fragment" - " deflate thread(s))\n"); - dump_queue(to_frag); - - printf("locked frag queue (compressed frags waiting while multi-block" " file is written)\n"); dump_queue(locked_fragment); diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c index cf48e40..cacf14c 100644 --- a/squashfs-tools/mksquashfs.c +++ b/squashfs-tools/mksquashfs.c @@ -270,10 +270,10 @@ unsigned int sid_count = 0, suid_count = 0, sguid_count = 0; struct cache *reader_buffer, *fragment_buffer, *reserve_cache; struct cache *bwriter_buffer, *fwriter_buffer; struct queue *to_reader, *to_deflate, *to_writer, *from_writer, - *to_frag, *locked_fragment, *to_process_frag; + *locked_fragment, *to_process_frag; struct seq_queue *to_main; pthread_t reader_thread, writer_thread, main_thread; -pthread_t *deflator_thread, *frag_deflator_thread, *frag_thread; +pthread_t *deflator_thread, *frag_thread; pthread_t *restore_thread = NULL; pthread_mutex_t fragment_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t pos_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -323,7 +323,7 @@ struct dir_info *scan1_opendir(char *pathname, char *subpath, int depth); void write_filesystem_tables(struct squashfs_super_block *sBlk, int nopad); unsigned short get_checksum_mem(char *buff, int bytes); void check_usable_phys_mem(int total_mem); - +void frag_deflator(struct file_buffer *file_buffer); void prep_exit() { @@ -1540,7 +1540,7 @@ void write_fragment(struct file_buffer *fragment) pthread_mutex_lock(&fragment_mutex); fragment_table[fragment->block].unused = 0; fragments_outstanding ++; - queue_put(to_frag, fragment); + frag_deflator(fragment); pthread_cleanup_pop(1); } @@ -2412,51 +2412,34 @@ void *deflator(void *arg) } -void *frag_deflator(void *arg) +void frag_deflator(struct file_buffer *file_buffer) { - void *stream = NULL; - int res; - res = compressor_init(comp, &stream, block_size, 1); - if(res) - BAD_ERROR("frag_deflator:: compressor_init failed\n"); - - pthread_cleanup_push((void *) pthread_mutex_unlock, &fragment_mutex); - - while(1) { - int c_byte, compressed_size; - struct file_buffer *file_buffer = queue_get(to_frag); - struct file_buffer *write_buffer = + int c_byte, compressed_size; + struct file_buffer *write_buffer = cache_get(fwriter_buffer, file_buffer->block); - c_byte = mangle2(stream, write_buffer->data, file_buffer->data, - file_buffer->size, block_size, noF, 1); - compressed_size = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); - write_buffer->size = compressed_size; - pthread_mutex_lock(&fragment_mutex); - if(fragments_locked == FALSE) { - fragment_table[file_buffer->block].size = c_byte; - fragment_table[file_buffer->block].start_block = bytes; - write_buffer->block = bytes; - bytes += compressed_size; - fragments_outstanding --; - queue_put(to_writer, write_buffer); - pthread_mutex_unlock(&fragment_mutex); - TRACE("Writing fragment %lld, uncompressed size %d, " - "compressed size %d\n", file_buffer->block, - file_buffer->size, compressed_size); - } else { - add_pending_fragment(write_buffer, c_byte, - file_buffer->block); - pthread_mutex_unlock(&fragment_mutex); - } - cache_block_put(file_buffer); + c_byte = mangle2(stream, write_buffer->data, file_buffer->data, + file_buffer->size, block_size, noF, 1); + compressed_size = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); + write_buffer->size = compressed_size; + if(fragments_locked == FALSE) { + fragment_table[file_buffer->block].size = c_byte; + fragment_table[file_buffer->block].start_block = bytes; + write_buffer->block = bytes; + bytes += compressed_size; + fragments_outstanding --; + queue_put(to_writer, write_buffer); + TRACE("Writing fragment %lld, uncompressed size %d, " + "compressed size %d\n", file_buffer->block, + file_buffer->size, compressed_size); + } else { + add_pending_fragment(write_buffer, c_byte, + file_buffer->block); } - - pthread_cleanup_pop(0); + cache_block_put(file_buffer); } - struct file_buffer *get_file_buffer() { struct file_buffer *file_buffer = seq_queue_get(to_main); @@ -4257,19 +4240,17 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, multiply_overflow(processors * 3, sizeof(pthread_t))) BAD_ERROR("Processors too large\n"); - deflator_thread = malloc(processors * 3 * sizeof(pthread_t)); + deflator_thread = malloc(processors * 2 * sizeof(pthread_t)); if(deflator_thread == NULL) MEM_ERROR(); - frag_deflator_thread = &deflator_thread[processors]; - frag_thread = &frag_deflator_thread[processors]; + frag_thread = &deflator_thread[processors]; to_reader = queue_init(1); to_deflate = queue_init(reader_size); to_process_frag = queue_init(reader_size); to_writer = queue_init(bwriter_size + fwriter_size); from_writer = queue_init(1); - to_frag = queue_init(fragment_size); locked_fragment = queue_init(fragment_size); to_main = seq_queue_init(); reader_buffer = cache_init(block_size, reader_size, 0, 0); @@ -4285,9 +4266,6 @@ void initialise_threads(int readq, int fragq, int bwriteq, int fwriteq, for(i = 0; i < processors; i++) { if(pthread_create(&deflator_thread[i], NULL, deflator, NULL)) BAD_ERROR("Failed to create thread\n"); - if(pthread_create(&frag_deflator_thread[i], NULL, frag_deflator, - NULL) != 0) - BAD_ERROR("Failed to create thread\n"); if(pthread_create(&frag_thread[i], NULL, frag_thrd, (void *) destination_file) != 0) BAD_ERROR("Failed to create thread\n"); diff --git a/squashfs-tools/mksquashfs.h b/squashfs-tools/mksquashfs.h index 55708a3..dc5bde4 100644 --- a/squashfs-tools/mksquashfs.h +++ b/squashfs-tools/mksquashfs.h @@ -135,7 +135,7 @@ struct append_file { extern struct cache *reader_buffer, *fragment_buffer, *reserve_cache; struct cache *bwriter_buffer, *fwriter_buffer; extern struct queue *to_reader, *to_deflate, *to_writer, *from_writer, - *to_frag, *locked_fragment, *to_process_frag; + *locked_fragment, *to_process_frag; extern struct append_file **file_mapping; extern struct seq_queue *to_main; extern pthread_mutex_t fragment_mutex, dup_mutex; diff --git a/squashfs-tools/restore.c b/squashfs-tools/restore.c index 5e336b3..a7aaf2e 100644 --- a/squashfs-tools/restore.c +++ b/squashfs-tools/restore.c @@ -47,8 +47,8 @@ #define TRUE 1 extern pthread_t reader_thread, writer_thread, main_thread; -extern pthread_t *deflator_thread, *frag_deflator_thread, *frag_thread; -extern struct queue *to_deflate, *to_writer, *to_frag, *to_process_frag; +extern pthread_t *deflator_thread, *frag_thread; +extern struct queue *to_deflate, *to_writer, *to_process_frag; extern struct seq_queue *to_main; extern void restorefs(); extern int processors; @@ -120,17 +120,6 @@ void *restore_thrd(void *arg) pthread_cancel(main_thread); pthread_join(main_thread, NULL); - /* then flush the main thread to fragment deflator thread(s) - * queue. The fragment deflator thread(s) will idle - */ - queue_flush(to_frag); - - /* now kill the fragment deflator thread(s) */ - for(i = 0; i < processors; i++) - pthread_cancel(frag_deflator_thread[i]); - for(i = 0; i < processors; i++) - pthread_join(frag_deflator_thread[i], NULL); - /* * then flush the main thread/fragment deflator thread(s) * to writer thread queue. The writer thread will idle -- 2.17.0