hardware.c revision 207753
1///////////////////////////////////////////////////////////////////////////////
2//
3/// \file       hardware.c
4/// \brief      Detection of available hardware resources
5//
6//  Author:     Lasse Collin
7//
8//  This file has been put into the public domain.
9//  You can do whatever you want with this file.
10//
11///////////////////////////////////////////////////////////////////////////////
12
13#include "private.h"
14#include "tuklib_cpucores.h"
15
16
17/// Maximum number of free *coder* threads. This can be set with
18/// the --threads=NUM command line option.
19static uint32_t threadlimit;
20
21/// Memory usage limit
22static uint64_t memlimit;
23
24/// Total amount of physical RAM
25static uint64_t total_ram;
26
27
28extern void
29hardware_threadlimit_set(uint32_t new_threadlimit)
30{
31	if (new_threadlimit == 0) {
32		// The default is the number of available CPU cores.
33		threadlimit = tuklib_cpucores();
34		if (threadlimit == 0)
35			threadlimit = 1;
36	} else {
37		threadlimit = new_threadlimit;
38	}
39
40	return;
41}
42
43
44extern uint32_t
45hardware_threadlimit_get(void)
46{
47	return threadlimit;
48}
49
50
51extern void
52hardware_memlimit_set(uint64_t new_memlimit)
53{
54	if (new_memlimit != 0) {
55		memlimit = new_memlimit;
56	} else {
57		// The default depends on the amount of RAM but so that
58		// on "low-memory" systems the relative limit is higher
59		// to make it more likely that files created with "xz -9"
60		// will still decompress without overriding the limit
61		// manually.
62		//
63		// If 40 % of RAM is 80 MiB or more, use 40 % of RAM as
64		// the limit.
65		memlimit = 40 * total_ram / 100;
66		if (memlimit < UINT64_C(80) * 1024 * 1024) {
67			// If 80 % of RAM is less than 80 MiB,
68			// use 80 % of RAM as the limit.
69			memlimit = 80 * total_ram / 100;
70			if (memlimit > UINT64_C(80) * 1024 * 1024) {
71				// Otherwise use 80 MiB as the limit.
72				memlimit = UINT64_C(80) * 1024 * 1024;
73			}
74		}
75	}
76
77	return;
78}
79
80
81extern void
82hardware_memlimit_set_percentage(uint32_t percentage)
83{
84	assert(percentage > 0);
85	assert(percentage <= 100);
86
87	memlimit = percentage * total_ram / 100;
88	return;
89}
90
91
92extern uint64_t
93hardware_memlimit_get(void)
94{
95	return memlimit;
96}
97
98
99extern void
100hardware_init(void)
101{
102	// Get the amount of RAM. If we cannot determine it,
103	// use the assumption defined by the configure script.
104	total_ram = lzma_physmem();
105	if (total_ram == 0)
106		total_ram = (uint64_t)(ASSUME_RAM) * 1024 * 1024;
107
108	// Set the defaults.
109	hardware_memlimit_set(0);
110	hardware_threadlimit_set(0);
111	return;
112}
113