aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pool.c16
-rw-r--r--src/pool.h4
-rw-r--r--src/screen.c5
3 files changed, 21 insertions, 4 deletions
diff --git a/src/pool.c b/src/pool.c
index bd1111d..de79997 100644
--- a/src/pool.c
+++ b/src/pool.c
@@ -122,3 +122,19 @@ void add_line(char s) {
screens[s].line_list = p;
screens[s].line_count++;
}
+
+void pool_reclaim_lines(char s) {
+ line_t *p, *q;
+
+ p = screens[s].line_list;
+ while(p != (line_t *)END_MARKER) {
+ q = p;
+ p = p->next;
+ }
+
+ q->next = pools[screens[s].pool].free_list;
+ pools[screens[s].pool].free_list = screens[s].line_list;
+
+ /* theoretically this could be 0, but as a safety net... */
+ screens[s].line_list = (line_t *)END_MARKER;
+}
diff --git a/src/pool.h b/src/pool.h
index ba7e60f..d78e611 100644
--- a/src/pool.h
+++ b/src/pool.h
@@ -74,3 +74,7 @@ char get_smallest_pool(void);
/* add a line to a screen */
void add_line(char s);
+
+/* called by scr_destroy(). returns a now-destroyed screen's
+ lines to the pool's free list. */
+void pool_reclaim_lines(char s);
diff --git a/src/screen.c b/src/screen.c
index d090e51..1bd239a 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -82,16 +82,13 @@ void scr_destroy(char s) {
if(screens[s].status == SCR_UNUSED)
return;
- // pool_reclaim_lines(screens[s].pool, screens[s].line_list);
+ pool_reclaim_lines(s);
pools[screens[s].pool].screen_count--;
screens[s].title[0] = 0;
screens[s].status = SCR_UNUSED;
screens[s].pool = POOL_UNUSED;
screens[s].line_count = screens[s].scrollback_pos = 0;
-
- /* theoretically this could be 0, but as a safety net... */
- screens[s].line_list = (line_t *)END_MARKER;
}
void render_vis_buf(void) {