From 614d14c999777898a8d560235767eca03faa9424 Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Sun, 21 Dec 2014 16:40:06 +0330 Subject: [PATCH] scrsnap: allocate memory for snapshots only when needed --- fbpad.c | 7 +++-- fbpad.h | 7 +++-- scrsnap.c | 104 +++++++++++++++++++++++++++++--------------------------------- 3 files changed, 56 insertions(+), 62 deletions(-) rewrite scrsnap.c (81%) diff --git a/fbpad.c b/fbpad.c index c5e391f..80225fe 100644 --- a/fbpad.c +++ b/fbpad.c @@ -77,12 +77,12 @@ static struct term *mainterm(void) static void switchterm(int oidx, int nidx, int show, int save, int load) { if (save && TERMOPEN(oidx) && TERMSNAP(oidx)) - scr_snap(&terms[oidx]); + scr_snap(oidx); term_save(&terms[oidx]); term_load(&terms[nidx], show); if (show) term_redraw(load && (!TERMOPEN(nidx) || !TERMSNAP(nidx) || - scr_load(&terms[nidx]))); + scr_load(nidx))); } static void showterm(int n) @@ -255,7 +255,7 @@ static int pollterms(void) if (ufds[i].revents & POLLIN) { term_read(); } else { - scr_free(&terms[term_idx[i]]); + scr_free(term_idx[i]); term_end(); if (cmdmode) exitit = 1; @@ -344,6 +344,7 @@ int main(int argc, char **argv) args++; mainloop(args[0] ? args : NULL); pad_free(); + scr_done(); failed: write(1, show, strlen(show)); return 0; diff --git a/fbpad.h b/fbpad.h index 136158e..26c475b 100644 --- a/fbpad.h +++ b/fbpad.h @@ -70,6 +70,7 @@ int font_cols(struct font *font); int font_bitmap(struct font *font, void *dst, int c); /* scrsnap.c */ -void scr_snap(void *owner); -int scr_load(void *owner); -void scr_free(void *owner); +void scr_snap(int idx); +int scr_load(int idx); +void scr_free(int idx); +void scr_done(void); diff --git a/scrsnap.c b/scrsnap.c dissimilarity index 81% index b977b84..1f0d93a 100644 --- a/scrsnap.c +++ b/scrsnap.c @@ -1,56 +1,48 @@ -#include -#include -#include "config.h" -#include "draw.h" - -#define NSCRS ((sizeof(saved) - 1) * 2) -#define SNAPSZ (1 << 23) - -static char saved[] = TAGS_SAVED; -static char scrs[NSCRS][SNAPSZ]; -static void *owners[NSCRS]; - -static int scr_find(void *owner) -{ - int i; - for (i = 0; i < NSCRS; i++) - if (owners[i] == owner) - return i; - return -1; -} - -static int scr_slot(void) -{ - int index = scr_find(NULL); - return index > -1 ? index : 0; -} - -void scr_snap(void *owner) -{ - int rowsz = sizeof(fbval_t) * fb_cols(); - int scr = scr_slot(); - int i; - for (i = 0; i < fb_rows(); i++) - memcpy(scrs[scr] + i * rowsz, fb_mem(i), rowsz); - owners[scr] = owner; -} - -void scr_free(void *owner) -{ - int scr = scr_find(owner); - if (scr != -1) - owners[scr] = NULL; -} - -int scr_load(void *owner) -{ - int rowsz = sizeof(fbval_t) * fb_cols(); - int scr = scr_find(owner); - int i; - if (scr == -1) - return -1; - for (i = 0; i < fb_rows(); i++) - memcpy(fb_mem(i), scrs[scr] + i * rowsz, rowsz); - owners[scr] = NULL; - return 0; -} +#include +#include +#include "draw.h" +#include "fbpad.h" + +#define NSCRS 128 + +static void *scrs[NSCRS]; + +void scr_snap(int idx) +{ + int rowsz = FBM_BPP(fb_mode()) * fb_cols(); + int i; + if (idx >= NSCRS) + return; + if (!scrs[idx]) + scrs[idx] = malloc(fb_rows() * rowsz); + if (!scrs[idx]) + return; + for (i = 0; i < fb_rows(); i++) + memcpy(scrs[idx] + i * rowsz, fb_mem(i), rowsz); +} + +void scr_free(int idx) +{ + if (idx < NSCRS) { + free(scrs[idx]); + scrs[idx] = NULL; + } +} + +int scr_load(int idx) +{ + int rowsz = FBM_BPP(fb_mode()) * fb_cols(); + int i; + if (idx >= NSCRS || !scrs[idx]) + return -1; + for (i = 0; i < fb_rows(); i++) + memcpy(fb_mem(i), scrs[idx] + i * rowsz, rowsz); + return 0; +} + +void scr_done(void) +{ + int i; + for (i = 0; i < LEN(scrs); i++) + free(scrs[i]); +} -- 2.11.4.GIT