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.
This commit is contained in:
Christoph Lohmann 2020-12-20 15:25:52 +01:00
parent 5672cc0e59
commit b0efd23c24

View File

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