]> git.ipfire.org Git - thirdparty/xz.git/commitdiff
Add lzma_physmem().
authorLasse Collin <lasse.collin@tukaani.org>
Sun, 15 Nov 2009 10:40:17 +0000 (12:40 +0200)
committerLasse Collin <lasse.collin@tukaani.org>
Sun, 15 Nov 2009 10:40:17 +0000 (12:40 +0200)
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.

src/liblzma/Makefile.am
src/liblzma/api/Makefile.am
src/liblzma/api/lzma.h
src/liblzma/api/lzma/hardware.h [new file with mode: 0644]
src/liblzma/common/Makefile.inc
src/liblzma/common/hardware_physmem.c [new file with mode: 0644]
src/xz/Makefile.am
src/xz/hardware.c
src/xzdec/Makefile.am
src/xzdec/xzdec.c

index 6d5753b14fc9edf4e7d23cefe584b5a8bc4d1741..a4d2c1e6361a475316cc206fdb4d11938b552417 100644 (file)
@@ -12,7 +12,7 @@ CLEANFILES =
 doc_DATA =
 
 lib_LTLIBRARIES = liblzma.la
-liblzma_la_SOURCES =
+liblzma_la_SOURCES = $(top_srcdir)/src/common/tuklib_physmem.c
 liblzma_la_CPPFLAGS = \
        -I$(top_srcdir)/src/liblzma/api \
        -I$(top_srcdir)/src/liblzma/common \
@@ -23,7 +23,8 @@ liblzma_la_CPPFLAGS = \
        -I$(top_srcdir)/src/liblzma/subblock \
        -I$(top_srcdir)/src/liblzma/delta \
        -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
 
 include $(srcdir)/common/Makefile.inc
index 0992d221044c3e8f0529d132ff94aaa060bef05b..4536b0ac32036ff7e3a2608e9dc2f0355dd51858 100644 (file)
@@ -14,6 +14,7 @@ nobase_include_HEADERS = \
        lzma/container.h \
        lzma/delta.h \
        lzma/filter.h \
+       lzma/hardware.h \
        lzma/index.h \
        lzma/index_hash.h \
        lzma/lzma.h \
index dab29636bcd4c052fc38c8127660a89c9d6f26c7..f5ab30d13466ed9eb57d2c8883eaa71447081dec 100644 (file)
@@ -308,6 +308,9 @@ extern "C" {
 #include "lzma/index.h"
 #include "lzma/index_hash.h"
 
+/* Hardware information */
+#include "lzma/hardware.h"
+
 /*
  * All subheaders included. Undefine LZMA_H_INTERNAL to prevent applications
  * re-including the subheaders.
diff --git a/src/liblzma/api/lzma/hardware.h b/src/liblzma/api/lzma/hardware.h
new file mode 100644 (file)
index 0000000..f44cb60
--- /dev/null
@@ -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;
index aaaeee933070005a6bebe85caec8e73b2d5a6d5a..29f43ff1dbe71263427295224eab1c2a643735ce 100644 (file)
@@ -14,6 +14,7 @@ liblzma_la_SOURCES += \
        common/easy_preset.h \
        common/filter_common.c \
        common/filter_common.h \
+       common/hardware_physmem.c \
        common/index.c \
        common/index.h \
        common/stream_flags_common.c \
diff --git a/src/liblzma/common/hardware_physmem.c b/src/liblzma/common/hardware_physmem.c
new file mode 100644 (file)
index 0000000..7405b65
--- /dev/null
@@ -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();
+}
index cc617053a2cd65f7b2bd2fc865a82990f06829ba..08ac236f9a2f4f87904da1b05cbb30bd66ab7110 100644 (file)
@@ -32,7 +32,6 @@ xz_SOURCES = \
        $(top_srcdir)/src/common/tuklib_open_stdxxx.c \
        $(top_srcdir)/src/common/tuklib_progname.c \
        $(top_srcdir)/src/common/tuklib_exit.c \
-       $(top_srcdir)/src/common/tuklib_physmem.c \
        $(top_srcdir)/src/common/tuklib_cpucores.c
 
 if COND_W32
index d5f4b9b49419a04696d24201cf4c72425cb66b74..d91b4cee1500458d6eb1ff2e675014ab5bca92c0 100644 (file)
@@ -11,7 +11,6 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "private.h"
-#include "tuklib_physmem.h"
 #include "tuklib_cpucores.h"
 
 
@@ -66,7 +65,7 @@ hardware_memlimit_set_percentage(uint32_t percentage)
        assert(percentage > 0);
        assert(percentage <= 100);
 
-       uint64_t mem = tuklib_physmem();
+       uint64_t mem = lzma_physmem();
 
        // If we cannot determine the amount of RAM, use the assumption
        // defined by the configure script.
index 9a1b43428b403255ac6d0ff4ff28d7d45f68e1a7..ad487721338ced586d1e2fc8783a007d540ae08c 100644 (file)
@@ -17,8 +17,7 @@ bin_PROGRAMS = xzdec lzmadec
 xzdec_SOURCES = \
        xzdec.c \
        $(top_srcdir)/src/common/tuklib_progname.c \
-       $(top_srcdir)/src/common/tuklib_exit.c \
-       $(top_srcdir)/src/common/tuklib_physmem.c
+       $(top_srcdir)/src/common/tuklib_exit.c
 
 if COND_W32
 xzdec_SOURCES += xzdec_w32res.rc
@@ -43,8 +42,7 @@ xzdec_LDADD += $(LTLIBINTL)
 lzmadec_SOURCES = \
        xzdec.c \
        $(top_srcdir)/src/common/tuklib_progname.c \
-       $(top_srcdir)/src/common/tuklib_exit.c \
-       $(top_srcdir)/src/common/tuklib_physmem.c
+       $(top_srcdir)/src/common/tuklib_exit.c
 
 if COND_W32
 lzmadec_SOURCES += lzmadec_w32res.rc
index 4f40f1d61d4dec5a9d643f0e0247351c1c9ef540..0abccebbc3b7ac621d957c927a2e778eecbf82da 100644 (file)
@@ -21,7 +21,6 @@
 #include "getopt.h"
 #include "tuklib_progname.h"
 #include "tuklib_exit.h"
-#include "tuklib_physmem.h"
 
 #ifdef TUKLIB_DOSLIKE
 #      include <fcntl.h>
@@ -104,7 +103,7 @@ version(void)
 static void
 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
        // set by the configure script.