Skip to content

Commit e7e8907

Browse files
committed
ChafaTerm: Limit output buffer size
1 parent 42991ba commit e7e8907

File tree

2 files changed

+43
-10
lines changed

2 files changed

+43
-10
lines changed

tools/chafa/chafa-term.c

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,15 +1190,48 @@ chafa_term_read_event (ChafaTerm *term, guint timeout_ms)
11901190
}
11911191

11921192
void
1193-
chafa_term_write (ChafaTerm *term, gconstpointer data, gsize len)
1193+
chafa_term_write (ChafaTerm *term, gconstpointer data, gint len)
11941194
{
1195-
/* FIXME: Apply emergency brakes if buffer limit reached */
1195+
while (len > 0)
1196+
{
1197+
gint n_written;
11961198

1197-
g_mutex_lock (&term->mutex);
1198-
term->out_drained = FALSE;
1199-
chafa_byte_fifo_push (term->out_fifo, data, len);
1200-
g_cond_broadcast (&term->cond);
1201-
g_mutex_unlock (&term->mutex);
1199+
g_mutex_lock (&term->mutex);
1200+
1201+
/* Wait for partial drain if necessary */
1202+
1203+
for (;;)
1204+
{
1205+
gint queued = chafa_byte_fifo_get_len (term->out_fifo);
1206+
1207+
if (queued == 0 || queued + len <= term->out_buf_max)
1208+
break;
1209+
1210+
if (term->out_shutdown_done)
1211+
{
1212+
g_mutex_unlock (&term->mutex);
1213+
goto out;
1214+
}
1215+
1216+
g_cond_wait (&term->cond, &term->mutex);
1217+
}
1218+
1219+
/* Push and signal */
1220+
1221+
term->out_drained = FALSE;
1222+
n_written = MIN (len, term->out_buf_max);
1223+
1224+
chafa_byte_fifo_push (term->out_fifo, data, n_written);
1225+
1226+
len -= n_written;
1227+
data = ((const gchar *) data) + n_written;
1228+
1229+
g_cond_broadcast (&term->cond);
1230+
g_mutex_unlock (&term->mutex);
1231+
}
1232+
1233+
out:
1234+
return;
12021235
}
12031236

12041237
gint
@@ -1247,7 +1280,7 @@ chafa_term_flush (ChafaTerm *term)
12471280
}
12481281

12491282
void
1250-
chafa_term_write_err (ChafaTerm *term, gconstpointer data, gsize len)
1283+
chafa_term_write_err (ChafaTerm *term, gconstpointer data, gint len)
12511284
{
12521285
g_mutex_lock (&term->mutex);
12531286
term->out_drained = FALSE;

tools/chafa/chafa-term.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ ChafaTermInfo *chafa_term_get_term_info (ChafaTerm *term);
3737

3838
ChafaEvent *chafa_term_read_event (ChafaTerm *term, guint timeout_ms);
3939

40-
void chafa_term_write (ChafaTerm *term, gconstpointer data, gsize len);
40+
void chafa_term_write (ChafaTerm *term, gconstpointer data, gint len);
4141
gint chafa_term_print (ChafaTerm *term, const gchar *format, ...) G_GNUC_PRINTF (2, 3);
4242
void chafa_term_print_seq (ChafaTerm *term, ChafaTermSeq seq, ...);
4343
gboolean chafa_term_flush (ChafaTerm *term);
4444

45-
void chafa_term_write_err (ChafaTerm *term, gconstpointer data, gsize len);
45+
void chafa_term_write_err (ChafaTerm *term, gconstpointer data, gint len);
4646
gint chafa_term_print_err (ChafaTerm *term, const gchar *format, ...) G_GNUC_PRINTF (2, 3);
4747

4848
void chafa_term_get_size_px (ChafaTerm *term, gint *width_px_out, gint *height_px_out);

0 commit comments

Comments
 (0)