From 4b48c06f261b637e3374693974b0565a73e0b225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Fri, 9 May 2008 21:48:59 +0000 Subject: [PATCH] - dump winsize info too. - prepare for VTIME and VMIN handling: allow waiting with timeout. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25405 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/drivers/tty/tty.cpp | 34 ++++++++++++++------ src/add-ons/kernel/drivers/tty/tty_private.h | 2 +- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/add-ons/kernel/drivers/tty/tty.cpp b/src/add-ons/kernel/drivers/tty/tty.cpp index a28ae911f5..6b636a29e4 100644 --- a/src/add-ons/kernel/drivers/tty/tty.cpp +++ b/src/add-ons/kernel/drivers/tty/tty.cpp @@ -135,6 +135,7 @@ class ReaderLocker : public AbstractLocker { ReaderLocker(tty_cookie *cookie); ~ReaderLocker(); + status_t AcquireReader(bigtime_t timeout); status_t AcquireReader(bool dontBlock); private: @@ -393,7 +394,7 @@ RequestOwner::SetBytesNeeded(size_t bytesNeeded) * The request lock MUST NOT be held! */ status_t -RequestOwner::Wait(bool interruptable) +RequestOwner::Wait(bool interruptable, bigtime_t timeout) { TRACE(("%p->RequestOwner::Wait(%d)\n", this, interruptable)); @@ -420,7 +421,7 @@ RequestOwner::Wait(bool interruptable) // wait TRACE(("%p->RequestOwner::Wait(): waiting for condition...\n", this)); - error = entry.Wait(); + error = entry.Wait(B_RELATIVE_TIMEOUT, timeout); TRACE(("%p->RequestOwner::Wait(): condition occurred: %lx\n", this, error)); @@ -677,7 +678,7 @@ ReaderLocker::~ReaderLocker() status_t -ReaderLocker::AcquireReader(bool dontBlock) +ReaderLocker::AcquireReader(bigtime_t timeout) { if (fCookie->closed) return B_FILE_ERROR; @@ -695,12 +696,12 @@ ReaderLocker::AcquireReader(bool dontBlock) // We are not the first in queue or currently there's nothing to read: // bail out, if we shall not block. - if (dontBlock) + if (timeout <= 0) return B_WOULD_BLOCK; // block until something happens Unlock(); - status = fRequestOwner.Wait(true); + status = fRequestOwner.Wait(true, timeout); Lock(); if (status == B_OK) @@ -713,6 +714,13 @@ ReaderLocker::AcquireReader(bool dontBlock) } +status_t +ReaderLocker::AcquireReader(bool dontBlock) +{ + return AcquireReader(dontBlock ? 0 : B_INFINITE_TIMEOUT); +} + + size_t ReaderLocker::_CheckAvailableBytes() const { @@ -1456,8 +1464,9 @@ tty_ioctl(tty_cookie *cookie, uint32 op, void *buffer, size_t length) case TCWAITEVENT: // BeOS (uint *) // wait for event (timeout if !NULL) case TCVTIME: // BeOS (bigtime_t *) set highrez VTIME + case 'ochr': // BeOS (int *) same as ichr for write dprintf("tty: unsupported legacy opcode %lu\n", op); - // TODO; + // TODO ? break; case TCXONC: // Unix, but even Linux doesn't handle it @@ -1465,7 +1474,6 @@ tty_ioctl(tty_cookie *cookie, uint32 op, void *buffer, size_t length) break; case TCQUERYCONNECTED: // BeOS - case 'ochr': // BeOS (int *) same as ichr for write dprintf("tty: unsupported legacy opcode %lu\n", op); // BeOS didn't implement them anyway break; @@ -1492,6 +1500,9 @@ tty_input_read(tty_cookie *cookie, void *buffer, size_t *_length) bool dontBlock = (mode & O_NONBLOCK) != 0; size_t length = *_length; ssize_t bytesRead = 0; + bigtime_t timeout = dontBlock ? 0 : B_INFINITE_TIMEOUT; + bigtime_t vtime = 0LL; + size_t vmin = 0; TRACE(("tty_input_read(tty = %p, length = %lu, mode = %lu)\n", tty, length, mode)); @@ -1506,7 +1517,7 @@ tty_input_read(tty_cookie *cookie, void *buffer, size_t *_length) ReaderLocker locker(cookie); while (bytesRead == 0) { - status_t status = locker.AcquireReader(dontBlock); + status_t status = locker.AcquireReader(timeout); if (status != B_OK) { *_length = 0; return status; @@ -1620,6 +1631,8 @@ tty_write_to_tty_master_unsafe(tty_cookie *sourceCookie, const char *data, writable = locker.AvailableBytes(); + // XXX: do we need to support VMIN & VTIME for write() ? + // We need to restart the loop, since the termios flags might have // changed in the meantime (while we've unlocked the tty). Note, // that we don't re-get "echo" -- maybe we should. @@ -1911,8 +1924,9 @@ dump_tty_settings(struct tty_settings& settings) kprintf(" pgrp_id: %ld\n", settings.pgrp_id); kprintf(" session_id: %ld\n", settings.session_id); // struct termios termios; - // struct winsize window_size; - + kprintf(" wsize: %u x %u c, %u x %u pxl\n", + settings.window_size.ws_row, settings.window_size.ws_col, + settings.window_size.ws_xpixel, settings.window_size.ws_ypixel); } static void diff --git a/src/add-ons/kernel/drivers/tty/tty_private.h b/src/add-ons/kernel/drivers/tty/tty_private.h index bfeef05883..571fc7c1df 100644 --- a/src/add-ons/kernel/drivers/tty/tty_private.h +++ b/src/add-ons/kernel/drivers/tty/tty_private.h @@ -91,7 +91,7 @@ class RequestOwner { void SetBytesNeeded(size_t bytesNeeded); size_t BytesNeeded() const { return fBytesNeeded; } - status_t Wait(bool interruptable); + status_t Wait(bool interruptable, bigtime_t timeout=B_INFINITE_TIMEOUT); bool IsFirstInQueues();