aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2024-03-07 20:03:42 +0000
committersotech117 <michael_foiani@brown.edu>2024-03-07 20:03:42 +0000
commitd970aa2698d831645986effded059eb344a77486 (patch)
tree43ac7872d9dbcf51d621141bd33a6088e566f8a0
parent43c2a4fc158992d03355e54ae3550796ddaa8d36 (diff)
fix end of buffer bug
-rw-r--r--kernel/drivers/tty/ldisc.c42
1 files changed, 32 insertions, 10 deletions
diff --git a/kernel/drivers/tty/ldisc.c b/kernel/drivers/tty/ldisc.c
index 67a6615..9b77433 100644
--- a/kernel/drivers/tty/ldisc.c
+++ b/kernel/drivers/tty/ldisc.c
@@ -190,13 +190,14 @@ void ldisc_key_pressed(ldisc_t *ldisc, char c)
// remove the last char
ldisc->ldisc_head = (ldisc->ldisc_head - 1 + LDISC_BUFFER_SIZE) % LDISC_BUFFER_SIZE;
- // if (ldisc->ldisc_full)
- // {
- // ldisc->ldisc_full = 0;
- // }
-
// emit a `\b` to the vterminal
vterminal_write(&ldisc_to_tty(ldisc)->tty_vterminal, "\b", 1);
+
+
+ if (ldisc->ldisc_full)
+ {
+ ldisc->ldisc_full = 0;
+ }
}
break;
@@ -204,7 +205,11 @@ void ldisc_key_pressed(ldisc_t *ldisc, char c)
// add the new char to the buffer
ldisc->ldisc_buffer[ldisc->ldisc_head] = c;
- ldisc->ldisc_head = (ldisc->ldisc_head + 1) % LDISC_BUFFER_SIZE;
+
+ if (!ldisc->ldisc_full)
+ {
+ ldisc->ldisc_head = (ldisc->ldisc_head + 1) % LDISC_BUFFER_SIZE;
+ }
// cook the buffer
ldisc->ldisc_cooked = ldisc->ldisc_head;
@@ -213,13 +218,21 @@ void ldisc_key_pressed(ldisc_t *ldisc, char c)
// emit a `\n` to the vterminal
vterminal_write(&ldisc_to_tty(ldisc)->tty_vterminal, "\n", 1);
+
+ if (ldisc->ldisc_full)
+ {
+ ldisc->ldisc_full = 0;
+ }
break;
case EOT:
// add the new char to the buffer
dbg(DBG_DISK, "EOT\n");
ldisc->ldisc_buffer[ldisc->ldisc_head] = c;
- ldisc->ldisc_head = (ldisc->ldisc_head + 1) % LDISC_BUFFER_SIZE;
+ if (!ldisc->ldisc_full)
+ {
+ ldisc->ldisc_head = (ldisc->ldisc_head + 1) % LDISC_BUFFER_SIZE;
+ }
// cook the buffer
ldisc->ldisc_cooked = ldisc->ldisc_head;
@@ -228,6 +241,11 @@ void ldisc_key_pressed(ldisc_t *ldisc, char c)
sched_wakeup_on(&ldisc->ldisc_read_queue, 0);
vterminal_write(&ldisc_to_tty(ldisc)->tty_vterminal, "\n", 1);
+
+ if (ldisc->ldisc_full)
+ {
+ ldisc->ldisc_full = 0;
+ }
break;
case ETX:
@@ -235,7 +253,7 @@ void ldisc_key_pressed(ldisc_t *ldisc, char c)
dbg(DBG_DISK, "ETX\n");
ldisc->ldisc_head = (ldisc->ldisc_cooked + 1) % LDISC_BUFFER_SIZE;
ldisc->ldisc_cooked = ldisc->ldisc_head;
-
+
// wake up the thread that is sleeping on the wait queue of the line discipline
sched_wakeup_on(&ldisc->ldisc_read_queue, 0);
@@ -252,12 +270,16 @@ void ldisc_key_pressed(ldisc_t *ldisc, char c)
// if none applies, fallback to vterminal_key_pressed
// vterminal_write(ldisc_to_tty(ldisc), &c, 1);
- ldisc->ldisc_buffer[ldisc->ldisc_head] = c;
// update the buffer if it's not full
- if ((ldisc->ldisc_head + 1) % LDISC_BUFFER_SIZE != ldisc->ldisc_tail)
+ if (!ldisc->ldisc_full)
{
+ ldisc->ldisc_buffer[ldisc->ldisc_head] = c;
ldisc->ldisc_head = (ldisc->ldisc_head + 1) % LDISC_BUFFER_SIZE;
+ if (ldisc->ldisc_head + 1 == ldisc->ldisc_tail)
+ {
+ ldisc->ldisc_full = 1;
+ }
vterminal_key_pressed(&ldisc_to_tty(ldisc)->tty_vterminal);
}