summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apropos.c2
-rw-r--r--mansearch.c48
-rw-r--r--mansearch.h1
3 files changed, 51 insertions, 0 deletions
diff --git a/apropos.c b/apropos.c
index 086a842e..ac7e6d87 100644
--- a/apropos.c
+++ b/apropos.c
@@ -95,6 +95,7 @@ main(int argc, char *argv[])
search.flags = whatis ? MANSEARCH_WHATIS : 0;
manpath_parse(&paths, conf_file, defpaths, auxpaths);
+ mansearch_setup(1);
ch = mansearch(&search, &paths, argc, argv, outkey, &res, &sz);
manpath_free(&paths);
@@ -110,6 +111,7 @@ main(int argc, char *argv[])
}
free(res);
+ mansearch_setup(0);
return(sz ? EXIT_SUCCESS : EXIT_FAILURE);
usage:
fprintf(stderr, "usage: %s [-C file] [-M path] [-m path] "
diff --git a/mansearch.c b/mansearch.c
index a4348d64..b6c00a9a 100644
--- a/mansearch.c
+++ b/mansearch.c
@@ -19,6 +19,7 @@
#include "config.h"
#endif
+#include <sys/mman.h>
#include <assert.h>
#include <fcntl.h>
#include <getopt.h>
@@ -101,6 +102,53 @@ static void sql_regexp(sqlite3_context *context,
static char *sql_statement(const struct expr *);
int
+mansearch_setup(int start)
+{
+ static void *pagecache;
+ int c;
+
+#define PC_PAGESIZE 1280
+#define PC_NUMPAGES 256
+
+ if (start) {
+ if (NULL != pagecache) {
+ fprintf(stderr, "pagecache already enabled\n");
+ return((int)MANDOCLEVEL_BADARG);
+ }
+
+ pagecache = mmap(NULL, PC_PAGESIZE * PC_NUMPAGES,
+ PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);
+
+ if (MAP_FAILED == pagecache) {
+ perror("mmap");
+ pagecache = NULL;
+ return((int)MANDOCLEVEL_SYSERR);
+ }
+
+ c = sqlite3_config(SQLITE_CONFIG_PAGECACHE,
+ pagecache, PC_PAGESIZE, PC_NUMPAGES);
+
+ if (SQLITE_OK == c)
+ return((int)MANDOCLEVEL_OK);
+
+ fprintf(stderr, "pagecache: %s\n", sqlite3_errstr(c));
+
+ } else if (NULL == pagecache) {
+ fprintf(stderr, "pagecache missing\n");
+ return((int)MANDOCLEVEL_BADARG);
+ }
+
+ if (-1 == munmap(pagecache, PC_PAGESIZE * PC_NUMPAGES)) {
+ perror("munmap");
+ pagecache = NULL;
+ return((int)MANDOCLEVEL_SYSERR);
+ }
+
+ pagecache = NULL;
+ return((int)MANDOCLEVEL_OK);
+}
+
+int
mansearch(const struct mansearch *search,
const struct manpaths *paths,
int argc, char *argv[],
diff --git a/mansearch.h b/mansearch.h
index d5a10ba3..894c8476 100644
--- a/mansearch.h
+++ b/mansearch.h
@@ -85,6 +85,7 @@ struct mansearch {
#define MANSEARCH_WHATIS 0x01 /* whatis mode: equality, no key */
};
+int mansearch_setup(int);
int mansearch(const struct mansearch *cfg, /* options */
const struct manpaths *paths, /* manpaths */
int argc, /* size of argv */