From c704c9c205c6d278f5aabec63f8757b8208cfee3 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 11 Mar 2012 16:41:10 +0000 Subject: [PATCH] New command -data_cache_size --- libisoburn/libisoburn.ver | 1 + xorriso/base_obj.c | 3 ++ xorriso/drive_mgt.c | 6 +++ xorriso/iso_img.c | 1 + xorriso/lib_mgt.c | 23 ++++++++ xorriso/opts_d_h.c | 24 +++++++++ xorriso/parse_exec.c | 7 ++- xorriso/text_io.c | 13 +++++ xorriso/xorriso.1 | 19 ++++++- xorriso/xorriso.h | 5 ++ xorriso/xorriso.info | 101 +++++++++++++++++++++--------------- xorriso/xorriso.texi | 21 +++++++- xorriso/xorriso_private.h | 4 ++ xorriso/xorriso_timestamp.h | 2 +- xorriso/xorrisoburn.h | 3 ++ 15 files changed, 187 insertions(+), 46 deletions(-) diff --git a/libisoburn/libisoburn.ver b/libisoburn/libisoburn.ver index d01ee218..a3490d89 100644 --- a/libisoburn/libisoburn.ver +++ b/libisoburn/libisoburn.ver @@ -161,6 +161,7 @@ Xorriso_option_cp_clone; Xorriso_option_cpri; Xorriso_option_cpx; Xorriso_option_cut_out; +Xorriso_option_data_cache_size; Xorriso_option_dev; Xorriso_option_devices; Xorriso_option_dialog; diff --git a/xorriso/base_obj.c b/xorriso/base_obj.c index df799225..e24028aa 100644 --- a/xorriso/base_obj.c +++ b/xorriso/base_obj.c @@ -192,6 +192,9 @@ int Xorriso_new(struct XorrisO ** xorriso,char *progname, int flag) m->displacement_sign= 0; m->drives_exclusive= 1; m->early_stdio_test= 0; + m->cache_num_tiles= 0; + m->cache_tile_blocks= 0; + m->cache_default= 1 | 2; m->do_calm_drive= 1; m->indev[0]= 0; m->in_drive_handle= NULL; diff --git a/xorriso/drive_mgt.c b/xorriso/drive_mgt.c index 61d362b4..f97a512f 100644 --- a/xorriso/drive_mgt.c +++ b/xorriso/drive_mgt.c @@ -429,6 +429,12 @@ int Xorriso_aquire_drive(struct XorrisO *xorriso, char *adr, char *show_adr, if(ret<=0) goto ex; + ret= Xorriso_set_data_cache(xorriso, ropts, xorriso->cache_num_tiles, + xorriso->cache_tile_blocks, + xorriso->cache_default); + if(ret<=0) + goto ex; + ext= isoburn_ropt_noiso1999; if((xorriso->ino_behavior & (1 | 2)) && !(xorriso->do_aaip & (1 | 4 | 32)) && !(xorriso->do_md5 & 1)) diff --git a/xorriso/iso_img.c b/xorriso/iso_img.c index 90291c04..56f13a58 100644 --- a/xorriso/iso_img.c +++ b/xorriso/iso_img.c @@ -95,6 +95,7 @@ int Xorriso_create_empty_iso(struct XorrisO *xorriso, int flag) /* Note: no return before isoburn_ropt_destroy() */ isoburn_ropt_set_extensions(ropts, isoburn_ropt_pretend_blank); isoburn_ropt_set_input_charset(ropts, xorriso->in_charset); + isoburn_ropt_set_data_cache(ropts, 1, 1, 0); isoburn_set_read_pacifier(drive, NULL, NULL); ret= isoburn_read_image(drive, ropts, &volset); Xorriso_process_msg_queues(xorriso,0); diff --git a/xorriso/lib_mgt.c b/xorriso/lib_mgt.c index f959f237..b302645a 100644 --- a/xorriso/lib_mgt.c +++ b/xorriso/lib_mgt.c @@ -863,3 +863,26 @@ int Xorriso_list_extras(struct XorrisO *xorriso, char *mode, int flag) return(1); } + +/* @param flag bit0= set num_tiles to default value + bit1= set tile_blocks to default value +*/ +int Xorriso_set_data_cache(struct XorrisO *xorriso, void *o, + int num_tiles, int tile_blocks, int flag) +{ + int ret, tiles, blocks, set_flag; + struct isoburn_read_opts *ropts; + + ropts= (struct isoburn_read_opts *) o; + if(flag & (1 | 2)) { + isoburn_ropt_get_data_cache(ropts, &tiles, &blocks, &set_flag, 1); + if(flag & 1) + num_tiles= tiles; + if(flag & 2) + tile_blocks= blocks; + } + ret= isoburn_ropt_set_data_cache(ropts, num_tiles, tile_blocks, 0); + return(ret); +} + + diff --git a/xorriso/opts_d_h.c b/xorriso/opts_d_h.c index bfece9a0..c95e4e3a 100644 --- a/xorriso/opts_d_h.c +++ b/xorriso/opts_d_h.c @@ -30,6 +30,28 @@ #include "xorrisoburn.h" +/* Command -data_cache_size */ +int Xorriso_option_data_cache_size(struct XorrisO *xorriso, char *num_tiles, + char *tile_blocks, int flag) +{ + int ret, blocks= -1, tiles= -1, to_default= 0; + + sscanf(num_tiles, "%d", &tiles); + sscanf(tile_blocks, "%d", &blocks); + if(strcmp(num_tiles, "default") == 0 || num_tiles[0] == 0) + to_default|= 1; + if(strcmp(tile_blocks, "default") == 0 || tile_blocks[0] == 0) + to_default|= 2; + ret= Xorriso_set_data_cache(xorriso, NULL, tiles, blocks, to_default); + if(ret > 0) { + xorriso->cache_num_tiles= tiles; + xorriso->cache_tile_blocks= blocks; + xorriso->cache_default= to_default; + } + return(ret); +} + + /* Options -dev , -indev, -outdev */ /** @param flag bit0= use as indev bit1= use as outdev @@ -1493,6 +1515,8 @@ int Xorriso_option_help(struct XorrisO *xorriso, int flag) " Allow for writing only the usage of optical drives.", " -early_stdio_test \"on\"|\"appendable_wo\"|\"off\"", " Classify stdio drives by effective access permissions.", +" -data_cache_size number_of_tiles blocks_per_tile", +" Adjust size and granularity of the data read cache.", " -blank \"fast\"|\"all\"|\"deformat\"|\"deformat_quickest\"", " Blank medium resp. invalidate ISO image on medium.", " -close_damaged \"as_needed\"|\"force\"", diff --git a/xorriso/parse_exec.c b/xorriso/parse_exec.c index 5882e8bb..ac408e84 100644 --- a/xorriso/parse_exec.c +++ b/xorriso/parse_exec.c @@ -483,6 +483,7 @@ int Xorriso_count_args(struct XorrisO *xorriso, int argc, char **argv, }; static char arg2_commands[][40]= { "assert_volid","boot_image","clone","compare","compare_r","drive_class", + "data_cache_size", "errfile_log","error_behavior","extract","extract_single", "jigdo","load","logfile", "map","map_single","page","return_with", @@ -606,7 +607,7 @@ int Xorriso_cmd_sorting_rank(struct XorrisO *xorriso, "load", "displacement", "drive_class", "assert_volid", "in_charset", "auto_charset", "hardlinks", "acl", "xattr", "md5", "for_backup", "disk_dev_ino", "rom_toc_scan", "calm_drive", "ban_stdio_write", - "early_stdio_test", + "early_stdio_test", "data_cache_size", "* Character sets:", "charset", "local_charset", @@ -1119,6 +1120,10 @@ next_command:; ret= Xorriso_option_cut_out(xorriso, arg1, arg2, argv[(*idx)-2], argv[(*idx)-1], 0); + } else if(strcmp(cmd,"data_cache_size")==0) { + (*idx)+= 2; + ret= Xorriso_option_data_cache_size(xorriso, arg1, arg2, 0); + } else if(strcmp(cmd,"dev")==0) { (*idx)++; ret= Xorriso_option_dev(xorriso, arg1, 3); diff --git a/xorriso/text_io.c b/xorriso/text_io.c index 3c611fd8..835b7ee5 100644 --- a/xorriso/text_io.c +++ b/xorriso/text_io.c @@ -1289,6 +1289,19 @@ int Xorriso_status(struct XorrisO *xorriso, char *filter, FILE *fp, int flag) if(!(is_default && no_defaults)) Xorriso_status_result(xorriso,filter,fp,flag&2); + is_default= ((xorriso->cache_default & 3) == 3); + sprintf(line, "-data_cache_size "); + if(xorriso->cache_default & 1) + sprintf(line + strlen(line), "default "); + else + sprintf(line + strlen(line), "%d ", xorriso->cache_num_tiles); + if(xorriso->cache_default & 2) + sprintf(line + strlen(line), "default\n"); + else + sprintf(line + strlen(line), "%d\n", xorriso->cache_tile_blocks); + if(!(is_default && no_defaults)) + Xorriso_status_result(xorriso,filter,fp,flag&2); + is_default= (xorriso->allow_restore==0 && xorriso->do_concat_split==1 && xorriso->do_auto_chmod==0 && xorriso->drives_exclusive == 1); mode_pt= "off"; diff --git a/xorriso/xorriso.1 b/xorriso/xorriso.1 index 2401edaf..6824fda1 100644 --- a/xorriso/xorriso.1 +++ b/xorriso/xorriso.1 @@ -9,7 +9,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH XORRISO 1 "Version 1.2.1, Mar 10, 2012" +.TH XORRISO 1 "Version 1.2.1, Mar 11, 2012" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -945,6 +945,23 @@ of severe problems, and may avoid some less severe error events. Mode "appendable_wo" is like "on" with the additional property that non\-empty write\-only files are regarded as appendable rather than blank. .TP +\fB\-data_cache_size\fR number_of_tiles blocks_per_tile +Set the size and granularity of the data cache which is used when ISO images +are loaded and when file content is read from ISO images. The cache consists +of several tiles, which each consists of several blocks. A larger cache +reduces the need for tiles being read multiple times. Larger tiles might +additionally improve the data throughput from the drive, but can be +wasteful if the data are scattered over the medium. +.br +Larger cache sizes help best with image loading from MMC drives. They are an +inferior alternative to \-osirrox option "sort_lba_on". +.br +blocks_per_tile must be a power of 2. E.g. 16, 32, or 64. The overall cache +size must not exceed 1 GiB. +The default values can be restored by parameter "default" instead of one or +both of the numbers. +Currently the default is 32 tiles of 32 blocks = 2 MiB. +.TP .B Inserting files into ISO image: .PP The following commands expect file addresses of two kinds: diff --git a/xorriso/xorriso.h b/xorriso/xorriso.h index 90088154..13e369af 100644 --- a/xorriso/xorriso.h +++ b/xorriso/xorriso.h @@ -818,6 +818,11 @@ int Xorriso_option_cut_out(struct XorrisO *xorriso, char *disk_path, */ int Xorriso_option_dev(struct XorrisO *xorriso, char *adr, int flag); +/* Command -data_cache_size */ +/* @since 1.2.2 */ +int Xorriso_option_data_cache_size(struct XorrisO *xorriso, char *num_tiles, + char *tile_blocks, int flag); + /* Command -devices */ /* @param flag bit0= perform -device_links rather than -devices @return <=0 error , 1 success, 2 revoked by -reassure diff --git a/xorriso/xorriso.info b/xorriso/xorriso.info index 2382405d..4038d486 100644 --- a/xorriso/xorriso.info +++ b/xorriso/xorriso.info @@ -884,6 +884,21 @@ activate them only after image loading. non-empty write-only files are regarded as appendable rather than blank. +-data_cache_size number_of_tiles blocks_per_tile + Set the size and granularity of the data cache which is used when + ISO images are loaded and when file content is read from ISO + images. The cache consists of several tiles, which each consists + of several blocks. A larger cache reduces the need for tiles being + read multiple times. Larger tiles might additionally improve the + data throughput from the drive, but can be wasteful if the data + are scattered over the medium. + Larger cache sizes help best with image loading from MMC drives. + They are an inferior alternative to -osirrox option "sort_lba_on". + blocks_per_tile must be a power of 2. E.g. 16, 32, or 64. The + overall cache size must not exceed 1 GiB. The default values can + be restored by parameter "default" instead of one or both of the + numbers. Currently the default is 32 tiles of 32 blocks = 2 MiB. +  File: xorriso.info, Node: Insert, Next: SetInsert, Prev: Loading, Up: Options @@ -4388,6 +4403,7 @@ File: xorriso.info, Node: CommandIdx, Next: ConceptIdx, Prev: Legal, Up: Top * -cpr inserts like with cp -r: Insert. (line 152) * -cpx copies files to disk: Restore. (line 92) * -cut_out inserts piece of data file: Insert. (line 126) +* -data_cache_size adjusts read cache size: Loading. (line 265) * -dev acquires one drive for input and output: AqDrive. (line 12) * -device_links gets list of drives: Inquiry. (line 18) * -devices gets list of drives: Inquiry. (line 7) @@ -4641,6 +4657,7 @@ File: xorriso.info, Node: ConceptIdx, Prev: CommandIdx, Up: Top * Growing, _definition: Methods. (line 19) * Hard links, control handling, -hardlinks: Loading. (line 110) * hidden, set in ISO image, -hide: Manip. (line 171) +* Image reading, cache size, -data_cache_size: Loading. (line 265) * Image, _definition: Model. (line 9) * Image, demand volume id, -assert_volid: Loading. (line 84) * Image, discard pending changes, -rollback: Writing. (line 9) @@ -4832,47 +4849,47 @@ Node: Options23730 Node: ArgSort25404 Node: AqDrive26894 Node: Loading29938 -Node: Insert44222 -Node: SetInsert53937 -Node: Manip62513 -Node: CmdFind71249 -Node: Filter83358 -Node: Writing87913 -Node: SetWrite96877 -Node: Bootable112152 -Node: Jigdo125374 -Node: Charset129620 -Node: Exception132381 -Node: DialogCtl138500 -Node: Inquiry141097 -Node: Navigate145963 -Node: Verify154224 -Node: Restore162913 -Node: Emulation169822 -Node: Scripting179633 -Node: Frontend186793 -Node: Examples188093 -Node: ExDevices189270 -Node: ExCreate189929 -Node: ExDialog191214 -Node: ExGrowing192479 -Node: ExModifying193284 -Node: ExBootable193788 -Node: ExCharset194340 -Node: ExPseudo195161 -Node: ExCdrecord196059 -Node: ExMkisofs196376 -Node: ExGrowisofs197716 -Node: ExException198851 -Node: ExTime199305 -Node: ExIncBackup199764 -Node: ExRestore203755 -Node: ExRecovery204715 -Node: Files205285 -Node: Seealso206584 -Node: Bugreport207307 -Node: Legal207888 -Node: CommandIdx208818 -Node: ConceptIdx224333 +Node: Insert45147 +Node: SetInsert54862 +Node: Manip63438 +Node: CmdFind72174 +Node: Filter84283 +Node: Writing88838 +Node: SetWrite97802 +Node: Bootable113077 +Node: Jigdo126299 +Node: Charset130545 +Node: Exception133306 +Node: DialogCtl139425 +Node: Inquiry142022 +Node: Navigate146888 +Node: Verify155149 +Node: Restore163838 +Node: Emulation170747 +Node: Scripting180558 +Node: Frontend187718 +Node: Examples189018 +Node: ExDevices190195 +Node: ExCreate190854 +Node: ExDialog192139 +Node: ExGrowing193404 +Node: ExModifying194209 +Node: ExBootable194713 +Node: ExCharset195265 +Node: ExPseudo196086 +Node: ExCdrecord196984 +Node: ExMkisofs197301 +Node: ExGrowisofs198641 +Node: ExException199776 +Node: ExTime200230 +Node: ExIncBackup200689 +Node: ExRestore204680 +Node: ExRecovery205640 +Node: Files206210 +Node: Seealso207509 +Node: Bugreport208232 +Node: Legal208813 +Node: CommandIdx209743 +Node: ConceptIdx225331  End Tag Table diff --git a/xorriso/xorriso.texi b/xorriso/xorriso.texi index b23580d2..fc51bdef 100644 --- a/xorriso/xorriso.texi +++ b/xorriso/xorriso.texi @@ -50,7 +50,7 @@ @c man .\" First parameter, NAME, should be all caps @c man .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection @c man .\" other parameters are allowed: see man(7), man(1) -@c man .TH XORRISO 1 "Version 1.2.1, Mar 10, 2012" +@c man .TH XORRISO 1 "Version 1.2.1, Mar 11, 2012" @c man .\" Please adjust this date whenever revising the manpage. @c man .\" @c man .\" Some roff macros, for reference: @@ -1189,6 +1189,25 @@ of severe problems, and may avoid some less severe error events. @* Mode "appendable_wo" is like "on" with the additional property that non-empty write-only files are regarded as appendable rather than blank. +@c man .TP +@item -data_cache_size number_of_tiles blocks_per_tile +@kindex -data_cache_size adjusts read cache size +@cindex Image reading, cache size, -data_cache_size +Set the size and granularity of the data cache which is used when ISO images +are loaded and when file content is read from ISO images. The cache consists +of several tiles, which each consists of several blocks. A larger cache +reduces the need for tiles being read multiple times. Larger tiles might +additionally improve the data throughput from the drive, but can be +wasteful if the data are scattered over the medium. +@* +Larger cache sizes help best with image loading from MMC drives. They are an +inferior alternative to -osirrox option "sort_lba_on". +@* +blocks_per_tile must be a power of 2. E.g. 16, 32, or 64. The overall cache +size must not exceed 1 GiB. +The default values can be restored by parameter "default" instead of one or +both of the numbers. +Currently the default is 32 tiles of 32 blocks = 2 MiB. @end table @c man .TP @c man .B Inserting files into ISO image: diff --git a/xorriso/xorriso_private.h b/xorriso/xorriso_private.h index 8ecc9354..b7b608c0 100644 --- a/xorriso/xorriso_private.h +++ b/xorriso/xorriso_private.h @@ -267,6 +267,10 @@ struct XorrisO { /* the global context of xorriso */ burn_write_opts_set_start_byte(). */ + int cache_num_tiles; /* -data_cache_size */ + int cache_tile_blocks; + int cache_default; /* bit0= cache_num_tiles, bit1= cache_tile_blocks */ + int do_calm_drive; /* bit0= calm down drive after aquiring it */ char indev[SfileadrL]; diff --git a/xorriso/xorriso_timestamp.h b/xorriso/xorriso_timestamp.h index 7b912e44..a5d3c587 100644 --- a/xorriso/xorriso_timestamp.h +++ b/xorriso/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2012.03.11.162050" +#define Xorriso_timestamP "2012.03.11.164130" diff --git a/xorriso/xorrisoburn.h b/xorriso/xorrisoburn.h index b6d03fd1..6d036cc7 100644 --- a/xorriso/xorrisoburn.h +++ b/xorriso/xorrisoburn.h @@ -595,5 +595,8 @@ int Xorriso_close_damaged(struct XorrisO *xorriso, int flag); int Xorriso_list_extras(struct XorrisO *xorriso, char *mode, int flag); +int Xorriso_set_data_cache(struct XorrisO *xorriso, void *ropts, + int num_tiles, int tile_blocks, int flag); + #endif /* Xorrisoburn_includeD */