Do not mmap all slides at the beginning to scale better.

Without mmaping all slides at the beginning, catpoint scales better
and the whole internal algorithms are simplified.
master
Christoph Lohmann 2020-12-20 15:25:52 +01:00
parent 5672cc0e59
commit b0efd23c24
1 changed files with 27 additions and 28 deletions

View File

@ -13,52 +13,57 @@
#include <locale.h> #include <locale.h>
#include <signal.h> #include <signal.h>
char **slides, **slidefiles; /* the slides */ char *currentslidep, **slidefiles; /* the slides */
int nslides, currentslide; int nslides, currentslide, currentslidelen;
void
unloadcurrentslide(void)
{
if (currentslidep == NULL)
return;
if (munmap(currentslidep, currentslidelen) < 0)
err(1, "munmap: %s", slidefiles[currentslide]);
}
void void
cleanup(int sig) cleanup(int sig)
{ {
int i; unloadcurrentslide();
for (i = 0; i < nslides; i++)
munmap(slides[i], 0x1000);
endwin(); /* restore terminal */ endwin(); /* restore terminal */
exit(1); exit(1);
} }
void void
reload(char **argv, int i) loadcurrentslide(char **argv, int slide)
{ {
struct stat statbuf; struct stat statbuf;
int fd; int fd;
if (slides[i] != NULL) { unloadcurrentslide();
if (munmap(slides[i], 0x1000) < 0)
err(1, "munmap: %s", slidefiles[i]);
}
fd = open(slidefiles[i], O_RDONLY, 0); fd = open(slidefiles[slide], O_RDONLY, 0);
if (fd < 0) if (fd < 0)
err(1, "open: %s", slidefiles[i]); err(1, "open: %s", slidefiles[slide]);
if (fstat(fd, &statbuf) < 0) if (fstat(fd, &statbuf) < 0)
err(1, "fstat: %s", slidefiles[i]); err(1, "fstat: %s", slidefiles[slide]);
slides[i] = mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0); currentslidep = mmap(NULL, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (slides[i] == MAP_FAILED) if (currentslidep == MAP_FAILED)
err(1, "mmap"); err(1, "mmap");
currentslidelen = statbuf.st_size;
close(fd); close(fd);
} }
void void
reloadcurrentslide(int sig) reloadcurrentslide(int sig)
{ {
reload(slidefiles, currentslide); loadcurrentslide(slidefiles, currentslide);
if (sig == SIGHUP) { if (sig == SIGHUP) {
clear(); clear();
refresh(); refresh();
printw("%s", slides[currentslide]); printw("%s", currentslidep);
} }
} }
@ -69,8 +74,6 @@ setsignal()
signal(SIGINT, cleanup); signal(SIGINT, cleanup);
signal(SIGQUIT, cleanup); signal(SIGQUIT, cleanup);
signal(SIGABRT, cleanup);
signal(SIGKILL, cleanup);
signal(SIGTERM, cleanup); signal(SIGTERM, cleanup);
} }
@ -87,15 +90,10 @@ main(int argc, char *argv[])
setsignal(); setsignal();
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
slides = calloc(nslides, sizeof(char *));
/* map files to mem */
for (currentslide = 0; slidefiles[currentslide] != NULL;
currentslide++) {
reload(slidefiles, currentslide);
}
/* start */ /* start */
currentslide = 0; currentslide = 0;
currentslidep = NULL;
currentslidelen = 0;
/* init curses */ /* init curses */
initscr(); initscr();
@ -108,9 +106,10 @@ main(int argc, char *argv[])
show: show:
/* display slide */ /* display slide */
loadcurrentslide(slidefiles, currentslide);
clear(); clear();
refresh(); refresh();
printw("%s", slides[currentslide]); printw("%s", currentslidep);
again: again:
c = getch(); c = getch();