X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/59ecf21e36b2332f6adf2a568ef555283d8c119a..b60166b327a9108b07e3069fa6568a451529ffd9:/lunaix-os/hal/term/term_io.c diff --git a/lunaix-os/hal/term/term_io.c b/lunaix-os/hal/term/term_io.c index 94e61d6..b1115c8 100644 --- a/lunaix-os/hal/term/term_io.c +++ b/lunaix-os/hal/term/term_io.c @@ -20,21 +20,20 @@ do_read_raw(struct term* tdev) char* inbuffer = line_in->current->buffer; size_t min = tdev->cc[_VMIN] - 1; - size_t sz = chdev->ops.read(chdev, inbuffer, 0, max_lb_sz); + size_t sz = chdev->ops.read_async(chdev, inbuffer, 0, max_lb_sz); time_t t = clock_systime(), dt = 0; time_t expr = (tdev->cc[_VTIME] * 100) - 1; while (sz <= min && dt <= expr) { // XXX should we held the device lock while we are waiting? - sched_yieldk(); + sched_pass(); dt = clock_systime() - t; t += dt; max_lb_sz -= sz; // TODO pass a flags to read to indicate it is non blocking ops - sz += - chdev->ops.read(chdev, inbuffer, sz, max_lb_sz); + sz += chdev->ops.read_async(chdev, &inbuffer[sz], 0, max_lb_sz); } rbuffer_puts(line_in->next, inbuffer, sz); @@ -44,7 +43,8 @@ do_read_raw(struct term* tdev) } static int -do_read_raw_canno(struct term* tdev) { +do_read_raw_canno(struct term* tdev) +{ struct device* chdev = tdev->chdev; struct linebuffer* line_in = &tdev->line_in; struct rbuffer* current_buf = line_in->current; @@ -60,7 +60,7 @@ static int term_read_noncano(struct term* tdev) { struct device* chdev = tdev->chdev; - return do_read_raw(tdev);; + return do_read_raw(tdev); } static int @@ -93,26 +93,35 @@ term_read(struct term* tdev) int term_flush(struct term* tdev) { - if ((tdev->oflags & _OPOST)) { - lcntl_transform_inseq(tdev); - } - struct linebuffer* line_out = &tdev->line_out; - size_t xmit_len = line_out->current->len; - void* xmit_buf = line_out->next->buffer; + char* xmit_buf = tdev->scratch_pad; + lbuf_ref_t current_ref = ref_current(line_out); - rbuffer_gets(line_out->current, xmit_buf, xmit_len); + int count = 0; - off_t off = 0; - int ret = 0; - while (xmit_len && ret >= 0) { - ret = tdev->chdev->ops.write(tdev->chdev, xmit_buf, off, xmit_len); - xmit_len -= ret; - off += ret; - } + while (!rbuffer_empty(deref(current_ref))) { + if ((tdev->oflags & _OPOST)) { + lcntl_transform_outseq(tdev); + } - // put back the left over if transmittion went south - rbuffer_puts(line_out->current, xmit_buf, xmit_len); + size_t xmit_len = line_out->current->len; + + rbuffer_gets(line_out->current, xmit_buf, xmit_len); + + off_t off = 0; + int ret = 0; + while (xmit_len && ret >= 0) { + ret = tdev->chdev->ops.write(tdev->chdev, &xmit_buf[off], 0, xmit_len); + xmit_len -= ret; + off += ret; + count += ret; + } + + // put back the left over if transmittion went south + rbuffer_puts(line_out->current, xmit_buf, xmit_len); + + line_flip(line_out); + } - return off; + return count; } \ No newline at end of file