summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac1
-rw-r--r--lib/sqfshelper/writer.c45
2 files changed, 45 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index 015c1e7..71c3f91 100644
--- a/configure.ac
+++ b/configure.ac
@@ -184,6 +184,7 @@ AX_COMPILE_CHECK_SIZEOF(long)
AX_COMPILE_CHECK_SIZEOF(long long)
AC_CHECK_HEADERS([sys/xattr.h], [], [])
+AC_CHECK_HEADERS([sys/sysinfo.h], [], [])
##### generate output #####
diff --git a/lib/sqfshelper/writer.c b/lib/sqfshelper/writer.c
index e57ad76..7626b1c 100644
--- a/lib/sqfshelper/writer.c
+++ b/lib/sqfshelper/writer.c
@@ -13,14 +13,57 @@
#include <string.h>
+#ifdef HAVE_SYS_SYSINFO_H
+#include <sys/sysinfo.h>
+
+static size_t os_get_num_jobs(void)
+{
+ int nprocs;
+
+ nprocs = get_nprocs_conf();
+ return nprocs < 1 ? 1 : nprocs;
+}
+
+static size_t os_get_max_ram(void)
+{
+ struct sysinfo info;
+
+ if (sysinfo(&info)) {
+ perror("sysinfo");
+ return 0;
+ }
+
+ return info.totalram;
+}
+#else
+static size_t os_get_num_jobs(void)
+{
+ return 1;
+}
+
+static size_t os_get_max_ram(void)
+{
+ (void)cfg;
+ return 0;
+}
+#endif
+
void sqfs_writer_cfg_init(sqfs_writer_cfg_t *cfg)
{
+ size_t max_ram;
+
memset(cfg, 0, sizeof(*cfg));
- cfg->num_jobs = 1;
+ cfg->num_jobs = os_get_num_jobs();
cfg->block_size = SQFS_DEFAULT_BLOCK_SIZE;
cfg->devblksize = SQFS_DEVBLK_SIZE;
cfg->comp_id = compressor_get_default();
+
+ max_ram = os_get_max_ram();
+ cfg->max_backlog = (max_ram / 2) / cfg->block_size;
+
+ if (cfg->max_backlog < 1)
+ cfg->max_backlog = 10 * cfg->num_jobs;
}
int sqfs_writer_init(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *wrcfg)