Add lzma_physmem().
I had hoped to keep liblzma as purely a compression library as possible (e.g. file I/O will go into a different library), but it seems that applications linking agaisnt liblzma need some way to determine the memory usage limit, and knowing the amount of RAM is one reasonable way to help making such decisions. Thanks to Jonathan Nieder for the original patch.
This commit is contained in:
parent
cf39faca59
commit
93e418562c
|
@ -12,7 +12,7 @@ CLEANFILES =
|
||||||
doc_DATA =
|
doc_DATA =
|
||||||
|
|
||||||
lib_LTLIBRARIES = liblzma.la
|
lib_LTLIBRARIES = liblzma.la
|
||||||
liblzma_la_SOURCES =
|
liblzma_la_SOURCES = $(top_srcdir)/src/common/tuklib_physmem.c
|
||||||
liblzma_la_CPPFLAGS = \
|
liblzma_la_CPPFLAGS = \
|
||||||
-I$(top_srcdir)/src/liblzma/api \
|
-I$(top_srcdir)/src/liblzma/api \
|
||||||
-I$(top_srcdir)/src/liblzma/common \
|
-I$(top_srcdir)/src/liblzma/common \
|
||||||
|
@ -23,7 +23,8 @@ liblzma_la_CPPFLAGS = \
|
||||||
-I$(top_srcdir)/src/liblzma/subblock \
|
-I$(top_srcdir)/src/liblzma/subblock \
|
||||||
-I$(top_srcdir)/src/liblzma/delta \
|
-I$(top_srcdir)/src/liblzma/delta \
|
||||||
-I$(top_srcdir)/src/liblzma/simple \
|
-I$(top_srcdir)/src/liblzma/simple \
|
||||||
-I$(top_srcdir)/src/common
|
-I$(top_srcdir)/src/common \
|
||||||
|
-DTUKLIB_SYMBOL_PREFIX=lzma_
|
||||||
liblzma_la_LDFLAGS = -no-undefined -version-info 0:0:0
|
liblzma_la_LDFLAGS = -no-undefined -version-info 0:0:0
|
||||||
|
|
||||||
include $(srcdir)/common/Makefile.inc
|
include $(srcdir)/common/Makefile.inc
|
||||||
|
|
|
@ -14,6 +14,7 @@ nobase_include_HEADERS = \
|
||||||
lzma/container.h \
|
lzma/container.h \
|
||||||
lzma/delta.h \
|
lzma/delta.h \
|
||||||
lzma/filter.h \
|
lzma/filter.h \
|
||||||
|
lzma/hardware.h \
|
||||||
lzma/index.h \
|
lzma/index.h \
|
||||||
lzma/index_hash.h \
|
lzma/index_hash.h \
|
||||||
lzma/lzma.h \
|
lzma/lzma.h \
|
||||||
|
|
|
@ -308,6 +308,9 @@ extern "C" {
|
||||||
#include "lzma/index.h"
|
#include "lzma/index.h"
|
||||||
#include "lzma/index_hash.h"
|
#include "lzma/index_hash.h"
|
||||||
|
|
||||||
|
/* Hardware information */
|
||||||
|
#include "lzma/hardware.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications
|
* All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications
|
||||||
* re-including the subheaders.
|
* re-including the subheaders.
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/**
|
||||||
|
* \file lzma/hardware.h
|
||||||
|
* \brief Hardware information
|
||||||
|
*
|
||||||
|
* Since liblzma can consume a lot of system resources, it also provides
|
||||||
|
* ways to limit the resource usage. Applications linking against liblzma
|
||||||
|
* need to do the actual decisions how much resources to let liblzma to use.
|
||||||
|
* To ease making these decisions, liblzma provides functions to find out
|
||||||
|
* the relevant capabilities of the underlaying hardware. Currently there
|
||||||
|
* is only a function to find out the amount of RAM, but in the future there
|
||||||
|
* will be also a function to detect how many concurrent threads the system
|
||||||
|
* can run.
|
||||||
|
*
|
||||||
|
* \note On some operating systems, these function may temporarily
|
||||||
|
* load a shared library or open file descriptor(s) to find out
|
||||||
|
* the requested hardware information. Unless the application
|
||||||
|
* assumes that specific file descriptors are not touched by
|
||||||
|
* other threads, this should have no effect on thread safety.
|
||||||
|
* Possible operations involving file descriptors will restart
|
||||||
|
* the syscalls if they return EINTR.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Author: Lasse Collin
|
||||||
|
*
|
||||||
|
* This file has been put into the public domain.
|
||||||
|
* You can do whatever you want with this file.
|
||||||
|
*
|
||||||
|
* See ../lzma.h for information about liblzma as a whole.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef LZMA_H_INTERNAL
|
||||||
|
# error Never include this file directly. Use <lzma.h> instead.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the total amount of physical memory (RAM) in bytes
|
||||||
|
*
|
||||||
|
* This function may be useful when determining a reasonable memory
|
||||||
|
* usage limit for decompressing or how much memory it is OK to use
|
||||||
|
* for compressing. For example, the default limit used by the xz
|
||||||
|
* command line tool is 40 % of RAM.
|
||||||
|
*
|
||||||
|
* \return On success, the total amount of physical memory in bytes
|
||||||
|
* is returned. If the amount of RAM cannot be determined,
|
||||||
|
* zero is returned. This can happen if an error occurs
|
||||||
|
* or if there is no code in liblzma to detect the amount
|
||||||
|
* of RAM on the specific operating system.
|
||||||
|
*/
|
||||||
|
extern LZMA_API(uint64_t) lzma_physmem(void) lzma_nothrow;
|
|
@ -14,6 +14,7 @@ liblzma_la_SOURCES += \
|
||||||
common/easy_preset.h \
|
common/easy_preset.h \
|
||||||
common/filter_common.c \
|
common/filter_common.c \
|
||||||
common/filter_common.h \
|
common/filter_common.h \
|
||||||
|
common/hardware_physmem.c \
|
||||||
common/index.c \
|
common/index.c \
|
||||||
common/index.h \
|
common/index.h \
|
||||||
common/stream_flags_common.c \
|
common/stream_flags_common.c \
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
/// \file hardware_physmem.c
|
||||||
|
/// \brief Get the total amount of physical memory (RAM)
|
||||||
|
//
|
||||||
|
// Author: Jonathan Nieder
|
||||||
|
//
|
||||||
|
// This file has been put into the public domain.
|
||||||
|
// You can do whatever you want with this file.
|
||||||
|
//
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
|
||||||
|
#include "tuklib_physmem.h"
|
||||||
|
|
||||||
|
|
||||||
|
extern LZMA_API(uint64_t)
|
||||||
|
lzma_physmem(void)
|
||||||
|
{
|
||||||
|
// It is simpler to make lzma_physmem() a wrapper for
|
||||||
|
// tuklib_physmem() than to hack appropriate symbol visiblity
|
||||||
|
// support for the tuklib modules.
|
||||||
|
return tuklib_physmem();
|
||||||
|
}
|
|
@ -32,7 +32,6 @@ xz_SOURCES = \
|
||||||
$(top_srcdir)/src/common/tuklib_open_stdxxx.c \
|
$(top_srcdir)/src/common/tuklib_open_stdxxx.c \
|
||||||
$(top_srcdir)/src/common/tuklib_progname.c \
|
$(top_srcdir)/src/common/tuklib_progname.c \
|
||||||
$(top_srcdir)/src/common/tuklib_exit.c \
|
$(top_srcdir)/src/common/tuklib_exit.c \
|
||||||
$(top_srcdir)/src/common/tuklib_physmem.c \
|
|
||||||
$(top_srcdir)/src/common/tuklib_cpucores.c
|
$(top_srcdir)/src/common/tuklib_cpucores.c
|
||||||
|
|
||||||
if COND_W32
|
if COND_W32
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "private.h"
|
#include "private.h"
|
||||||
#include "tuklib_physmem.h"
|
|
||||||
#include "tuklib_cpucores.h"
|
#include "tuklib_cpucores.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,7 +65,7 @@ hardware_memlimit_set_percentage(uint32_t percentage)
|
||||||
assert(percentage > 0);
|
assert(percentage > 0);
|
||||||
assert(percentage <= 100);
|
assert(percentage <= 100);
|
||||||
|
|
||||||
uint64_t mem = tuklib_physmem();
|
uint64_t mem = lzma_physmem();
|
||||||
|
|
||||||
// If we cannot determine the amount of RAM, use the assumption
|
// If we cannot determine the amount of RAM, use the assumption
|
||||||
// defined by the configure script.
|
// defined by the configure script.
|
||||||
|
|
|
@ -17,8 +17,7 @@ bin_PROGRAMS = xzdec lzmadec
|
||||||
xzdec_SOURCES = \
|
xzdec_SOURCES = \
|
||||||
xzdec.c \
|
xzdec.c \
|
||||||
$(top_srcdir)/src/common/tuklib_progname.c \
|
$(top_srcdir)/src/common/tuklib_progname.c \
|
||||||
$(top_srcdir)/src/common/tuklib_exit.c \
|
$(top_srcdir)/src/common/tuklib_exit.c
|
||||||
$(top_srcdir)/src/common/tuklib_physmem.c
|
|
||||||
|
|
||||||
if COND_W32
|
if COND_W32
|
||||||
xzdec_SOURCES += xzdec_w32res.rc
|
xzdec_SOURCES += xzdec_w32res.rc
|
||||||
|
@ -43,8 +42,7 @@ xzdec_LDADD += $(LTLIBINTL)
|
||||||
lzmadec_SOURCES = \
|
lzmadec_SOURCES = \
|
||||||
xzdec.c \
|
xzdec.c \
|
||||||
$(top_srcdir)/src/common/tuklib_progname.c \
|
$(top_srcdir)/src/common/tuklib_progname.c \
|
||||||
$(top_srcdir)/src/common/tuklib_exit.c \
|
$(top_srcdir)/src/common/tuklib_exit.c
|
||||||
$(top_srcdir)/src/common/tuklib_physmem.c
|
|
||||||
|
|
||||||
if COND_W32
|
if COND_W32
|
||||||
lzmadec_SOURCES += lzmadec_w32res.rc
|
lzmadec_SOURCES += lzmadec_w32res.rc
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "getopt.h"
|
#include "getopt.h"
|
||||||
#include "tuklib_progname.h"
|
#include "tuklib_progname.h"
|
||||||
#include "tuklib_exit.h"
|
#include "tuklib_exit.h"
|
||||||
#include "tuklib_physmem.h"
|
|
||||||
|
|
||||||
#ifdef TUKLIB_DOSLIKE
|
#ifdef TUKLIB_DOSLIKE
|
||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
|
@ -104,7 +103,7 @@ version(void)
|
||||||
static void
|
static void
|
||||||
memlimit_set_percentage(uint32_t percentage)
|
memlimit_set_percentage(uint32_t percentage)
|
||||||
{
|
{
|
||||||
uint64_t mem = tuklib_physmem();
|
uint64_t mem = lzma_physmem();
|
||||||
|
|
||||||
// If we cannot determine the amount of RAM, use the assumption
|
// If we cannot determine the amount of RAM, use the assumption
|
||||||
// set by the configure script.
|
// set by the configure script.
|
||||||
|
|
Loading…
Reference in New Issue