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
parent
5672cc0e59
commit
b0efd23c24
55
catpoint.c
55
catpoint.c
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue