| Index: src/xz/hardware.c
|
| ===================================================================
|
| --- src/xz/hardware.c (revision 50504)
|
| +++ src/xz/hardware.c (working copy)
|
| @@ -18,9 +18,12 @@
|
| /// the --threads=NUM command line option.
|
| static uint32_t threadlimit;
|
|
|
| -/// Memory usage limit
|
| -static uint64_t memlimit;
|
| +/// Memory usage limit for compression
|
| +static uint64_t memlimit_compress;
|
|
|
| +/// Memory usage limit for decompression
|
| +static uint64_t memlimit_decompress;
|
| +
|
| /// Total amount of physical RAM
|
| static uint64_t total_ram;
|
|
|
| @@ -49,50 +52,79 @@
|
|
|
|
|
| extern void
|
| -hardware_memlimit_set(uint64_t new_memlimit)
|
| +hardware_memlimit_set(uint64_t new_memlimit,
|
| + bool set_compress, bool set_decompress, bool is_percentage)
|
| {
|
| - if (new_memlimit != 0) {
|
| - memlimit = new_memlimit;
|
| - } else {
|
| - // The default depends on the amount of RAM but so that
|
| - // on "low-memory" systems the relative limit is higher
|
| - // to make it more likely that files created with "xz -9"
|
| - // will still decompress without overriding the limit
|
| - // manually.
|
| - //
|
| - // If 40 % of RAM is 80 MiB or more, use 40 % of RAM as
|
| - // the limit.
|
| - memlimit = 40 * total_ram / 100;
|
| - if (memlimit < UINT64_C(80) * 1024 * 1024) {
|
| - // If 80 % of RAM is less than 80 MiB,
|
| - // use 80 % of RAM as the limit.
|
| - memlimit = 80 * total_ram / 100;
|
| - if (memlimit > UINT64_C(80) * 1024 * 1024) {
|
| - // Otherwise use 80 MiB as the limit.
|
| - memlimit = UINT64_C(80) * 1024 * 1024;
|
| - }
|
| - }
|
| + if (is_percentage) {
|
| + assert(new_memlimit > 0);
|
| + assert(new_memlimit <= 100);
|
| + new_memlimit = (uint32_t)new_memlimit * total_ram / 100;
|
| }
|
|
|
| + if (set_compress)
|
| + memlimit_compress = new_memlimit;
|
| +
|
| + if (set_decompress)
|
| + memlimit_decompress = new_memlimit;
|
| +
|
| return;
|
| }
|
|
|
|
|
| -extern void
|
| -hardware_memlimit_set_percentage(uint32_t percentage)
|
| +extern uint64_t
|
| +hardware_memlimit_get(enum operation_mode mode)
|
| {
|
| - assert(percentage > 0);
|
| - assert(percentage <= 100);
|
| + // Zero is a special value that indicates the default. Currently
|
| + // the default simply disables the limit. Once there is threading
|
| + // support, this might be a little more complex, because there will
|
| + // probably be a special case where a user asks for "optimal" number
|
| + // of threads instead of a specific number (this might even become
|
| + // the default mode). Each thread may use a significant amount of
|
| + // memory. When there are no memory usage limits set, we need some
|
| + // default soft limit for calculating the "optimal" number of
|
| + // threads.
|
| + const uint64_t memlimit = mode == MODE_COMPRESS
|
| + ? memlimit_compress : memlimit_decompress;
|
| + return memlimit != 0 ? memlimit : UINT64_MAX;
|
| +}
|
|
|
| - memlimit = percentage * total_ram / 100;
|
| +
|
| +/// Helper for hardware_memlimit_show() to print one human-readable info line.
|
| +static void
|
| +memlimit_show(const char *str, uint64_t value)
|
| +{
|
| + // The memory usage limit is considered to be disabled if value
|
| + // is 0 or UINT64_MAX. This might get a bit more complex once there
|
| + // is threading support. See the comment in hardware_memlimit_get().
|
| + if (value == 0 || value == UINT64_MAX)
|
| + printf("%s %s\n", str, _("Disabled"));
|
| + else
|
| + printf("%s %s MiB (%s B)\n", str,
|
| + uint64_to_str(round_up_to_mib(value), 0),
|
| + uint64_to_str(value, 1));
|
| +
|
| return;
|
| }
|
|
|
|
|
| -extern uint64_t
|
| -hardware_memlimit_get(void)
|
| +extern void
|
| +hardware_memlimit_show(void)
|
| {
|
| - return memlimit;
|
| + if (opt_robot) {
|
| + printf("%" PRIu64 "\t%" PRIu64 "\t%" PRIu64 "\n", total_ram,
|
| + memlimit_compress, memlimit_decompress);
|
| + } else {
|
| + // TRANSLATORS: Test with "xz --info-memory" to see if
|
| + // the alignment looks nice.
|
| + memlimit_show(_("Total amount of physical memory (RAM): "),
|
| + total_ram);
|
| + memlimit_show(_("Memory usage limit for compression: "),
|
| + memlimit_compress);
|
| + memlimit_show(_("Memory usage limit for decompression: "),
|
| + memlimit_decompress);
|
| + }
|
| +
|
| + tuklib_exit(E_SUCCESS, E_ERROR, message_verbosity_get() != V_SILENT);
|
| }
|
|
|
|
|
| @@ -106,7 +138,7 @@
|
| total_ram = (uint64_t)(ASSUME_RAM) * 1024 * 1024;
|
|
|
| // Set the defaults.
|
| - hardware_memlimit_set(0);
|
| + hardware_memlimit_set(0, true, true, false);
|
| hardware_threadlimit_set(0);
|
| return;
|
| }
|
|
|