diff options
author | sotech117 <michael_foiani@brown.edu> | 2024-03-07 20:03:42 +0000 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2024-03-07 20:03:42 +0000 |
commit | d970aa2698d831645986effded059eb344a77486 (patch) | |
tree | 43ac7872d9dbcf51d621141bd33a6088e566f8a0 | |
parent | 43c2a4fc158992d03355e54ae3550796ddaa8d36 (diff) |
fix end of buffer bug
-rw-r--r-- | kernel/drivers/tty/ldisc.c | 42 |
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); } |