Changeset 25408

Show
Ignore:
Timestamp:
05/09/08 21:07:12 (1 week ago)
Author:
mmu_man
Message:
- dump termios struct for ttys
- implement VMIN & VTIME, at least it seems to work but it's 4am and it's overly weird, so please review.
See http://man.cx/termios and http://www.unixwiz.net/techtips/termios-vmin-vtime.html .
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • haiku/trunk/src/add-ons/kernel/drivers/tty/tty.cpp

    r25405 r25408  
    136136                ~ReaderLocker(); 
    137137 
    138                 status_t AcquireReader(bigtime_t timeout); 
     138                status_t AcquireReader(bigtime_t timeout, size_t minBytes); 
    139139                status_t AcquireReader(bool dontBlock); 
    140140 
     
    679679 
    680680status_t  
    681 ReaderLocker::AcquireReader(bigtime_t timeout
     681ReaderLocker::AcquireReader(bigtime_t timeout, size_t minBytes
    682682{ 
    683683        if (fCookie->closed) 
     
    691691        if (fRequestOwner.IsFirstInQueues()) { 
    692692                fBytes = _CheckAvailableBytes(); 
    693                 if (fBytes > 0
     693                if (fBytes > minBytes
    694694                        return B_OK; 
    695695        } 
     
    718718ReaderLocker::AcquireReader(bool dontBlock) 
    719719{ 
    720         return AcquireReader(dontBlock ? 0 : B_INFINITE_TIMEOUT); 
     720        return AcquireReader(dontBlock ? 0 : B_INFINITE_TIMEOUT, 0); 
    721721} 
    722722 
     
    15011501        size_t length = *_length; 
    15021502        ssize_t bytesRead = 0; 
     1503        bool canon = true; 
    15031504        bigtime_t timeout = dontBlock ? 0 : B_INFINITE_TIMEOUT; 
    1504         bigtime_t vtime = 0LL
     1505        bigtime_t vtime = timeout
    15051506        size_t vmin = 0; 
     1507        size_t minRead = 0; 
    15061508 
    15071509        TRACE(("tty_input_read(tty = %p, length = %lu, mode = %lu)\n", tty, length, mode)); 
     
    15171519        ReaderLocker locker(cookie); 
    15181520 
     1521        // handle raw mode 
     1522        if ((!tty->is_master) && ((tty->settings->termios.c_lflag & ICANON) == 0)) { 
     1523                canon = false; 
     1524                vmin = tty->settings->termios.c_cc[VMIN]; 
     1525                // for now behaviour is undefined when nonblocking is enabled 
     1526                //if (!dontBlock) // XXX does it take precedence or not ? 
     1527                vtime = tty->settings->termios.c_cc[VTIME] * 100000LL; 
     1528                TRACE(("tty_input_read: -icanon vmin %lu, vtime %Ldus\n", vmin, vtime)); 
     1529 
     1530                // yes it's weird but termios is! 
     1531                if (vmin && vtime == 0LL) 
     1532                        vtime = B_INFINITE_TIMEOUT; 
     1533                if (!vmin) 
     1534                        timeout = vtime; 
     1535                // timeout starts at 1st char when vmin > 0 
     1536                // so we first wait for 1 char only 
     1537                minRead = 0; 
     1538        } 
     1539 
    15191540        while (bytesRead == 0) { 
    1520                 status_t status = locker.AcquireReader(timeout); 
     1541                TRACE(("tty_input_read: AcquireReader(%Ldus, %ld)\n", timeout, minRead)); 
     1542                status_t status = locker.AcquireReader(timeout, minRead); 
     1543                if (status == B_WOULD_BLOCK) { 
     1544                        *_length = 0; 
     1545                        return 0; 
     1546                } 
    15211547                if (status != B_OK) { 
    15221548                        *_length = 0; 
     
    15251551 
    15261552                size_t toRead = locker.AvailableBytes(); 
    1527                 if (toRead == 0) 
     1553 
     1554                if (toRead) { 
     1555                        // raw mode: we have something, now retry with vmin and vtime 
     1556                        minRead = MAX(vmin-1, 0); 
     1557                        timeout = vtime; 
     1558                } 
     1559 
     1560                if (toRead < vmin && timeout == B_INFINITE_TIMEOUT) 
    15281561                        continue; 
    15291562                if (toRead > length) 
     
    15311564 
    15321565                bool _hitEOF = false; 
    1533                 bool* hitEOF = (tty->pending_eof > 0 ? &_hitEOF : NULL); 
     1566                bool* hitEOF = NULL; 
     1567 
     1568                if (canon && tty->pending_eof > 0) 
     1569                        hitEOF = &_hitEOF; 
    15341570 
    15351571                bytesRead = line_buffer_user_read(tty->input_buffer, (char *)buffer, 
     
    19241960        kprintf("  pgrp_id:      %ld\n", settings.pgrp_id); 
    19251961        kprintf("  session_id:   %ld\n", settings.session_id); 
    1926         // struct termios               termios; 
     1962 
     1963        kprintf("  termios:\n"); 
     1964        kprintf("    c_iflag:    0x%08lx\n", settings.termios.c_iflag); 
     1965        kprintf("    c_oflag:    0x%08lx\n", settings.termios.c_oflag); 
     1966        kprintf("    c_cflag:    0x%08lx\n", settings.termios.c_cflag); 
     1967        kprintf("    c_lflag:    0x%08lx\n", settings.termios.c_lflag); 
     1968        kprintf("    c_line:     %d\n", settings.termios.c_line); 
     1969        kprintf("    c_ispeed:   %u\n", settings.termios.c_ispeed); 
     1970        kprintf("    c_ospeed:   %u\n", settings.termios.c_ospeed); 
     1971        for (int i = 0; i < NCCS; i++) 
     1972                kprintf("    c_cc[%02d]:   %d\n", i, settings.termios.c_cc[i]); 
     1973 
    19271974        kprintf("  wsize:        %u x %u c, %u x %u pxl\n",  
    19281975                settings.window_size.ws_row, settings.window_size.ws_col,  
     
    19331980dump_tty_struct(struct tty& tty) 
    19341981{ 
     1982        kprintf("  tty @:        %p\n", &tty); 
    19351983        kprintf("  index:        %ld\n", tty.index); 
    19361984        kprintf("  is_master:    %s\n", tty.is_master ? "true" : "false"); 
  • haiku/trunk/src/add-ons/kernel/drivers/tty/tty_private.h

    r25405 r25408  
    9292                size_t BytesNeeded() const      { return fBytesNeeded; } 
    9393 
    94                 status_t Wait(bool interruptable, bigtime_t timeout=B_INFINITE_TIMEOUT); 
     94                status_t Wait(bool interruptable, bigtime_t timeout = B_INFINITE_TIMEOUT); 
    9595 
    9696                bool IsFirstInQueues();