aboutsummaryrefslogtreecommitdiff
path: root/src/xz/hardware.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xz/hardware.c')
-rw-r--r--src/xz/hardware.c86
1 files changed, 36 insertions, 50 deletions
diff --git a/src/xz/hardware.c b/src/xz/hardware.c
index 8d206b2e..72dc2cb1 100644
--- a/src/xz/hardware.c
+++ b/src/xz/hardware.c
@@ -17,51 +17,55 @@
/// Maximum number of free *coder* threads. This can be set with
/// the --threads=NUM command line option.
-static uint32_t threads_max;
+static uint32_t threadlimit;
+/// Memory usage limit
+static uint64_t memlimit;
-/// Memory usage limit for encoding
-static uint64_t memlimit_encoder;
-/// Memory usage limit for decoding
-static uint64_t memlimit_decoder;
-
-/// Memory usage limit given on the command line or environment variable.
-/// Zero indicates the default (memlimit_encoder or memlimit_decoder).
-static uint64_t memlimit_custom = 0;
-
-
-/// Get the number of CPU cores, and set opt_threads to default to that value.
-/// User can then override this with --threads command line option.
-static void
-hardware_threadlimit_init(void)
+extern void
+hardware_threadlimit_set(uint32_t new_threadlimit)
{
- threads_max = cpucores();
- if (threads_max == 0)
- threads_max = 1;
+ if (new_threadlimit == 0) {
+ // The default is the number of available CPU cores.
+ threadlimit = cpucores();
+ if (threadlimit == 0)
+ threadlimit = 1;
+ } else {
+ threadlimit = new_threadlimit;
+ }
return;
}
-extern void
-hardware_threadlimit_set(uint32_t threadlimit)
+extern uint32_t
+hardware_threadlimit_get(void)
{
- threads_max = threadlimit;
- return;
+ return threadlimit;
}
-extern uint32_t
-hardware_threadlimit_get(void)
+extern void
+hardware_memlimit_set(uint64_t new_memlimit)
{
- return threads_max;
+ if (new_memlimit == 0) {
+ // The default is 40 % of total installed physical RAM.
+ hardware_memlimit_set_percentage(40);
+ } else {
+ memlimit = new_memlimit;
+ }
+
+ return;
}
-static void
-hardware_memlimit_init(void)
+extern void
+hardware_memlimit_set_percentage(uint32_t percentage)
{
+ assert(percentage > 0);
+ assert(percentage <= 100);
+
uint64_t mem = physmem();
// If we cannot determine the amount of RAM, assume 32 MiB. Maybe
@@ -70,40 +74,22 @@ hardware_memlimit_init(void)
if (mem == 0)
mem = UINT64_C(32) * 1024 * 1024;
- // Use at maximum of 90 % of RAM when encoding and 33 % when decoding.
- memlimit_encoder = mem - mem / 10;
- memlimit_decoder = mem / 3;
-
+ memlimit = percentage * mem / 100;
return;
}
-extern void
-hardware_memlimit_set(uint64_t memlimit)
-{
- memlimit_custom = memlimit;
- return;
-}
-
-
-extern uint64_t
-hardware_memlimit_encoder(void)
-{
- return memlimit_custom != 0 ? memlimit_custom : memlimit_encoder;
-}
-
-
extern uint64_t
-hardware_memlimit_decoder(void)
+hardware_memlimit_get(void)
{
- return memlimit_custom != 0 ? memlimit_custom : memlimit_decoder;
+ return memlimit;
}
extern void
hardware_init(void)
{
- hardware_memlimit_init();
- hardware_threadlimit_init();
+ hardware_memlimit_set(0);
+ hardware_threadlimit_set(0);
return;
}