Changeset 25408
- Timestamp:
- 05/09/08 21:07:12 (1 week ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
haiku/trunk/src/add-ons/kernel/drivers/tty/tty.cpp
r25405 r25408 136 136 ~ReaderLocker(); 137 137 138 status_t AcquireReader(bigtime_t timeout );138 status_t AcquireReader(bigtime_t timeout, size_t minBytes); 139 139 status_t AcquireReader(bool dontBlock); 140 140 … … 679 679 680 680 status_t 681 ReaderLocker::AcquireReader(bigtime_t timeout )681 ReaderLocker::AcquireReader(bigtime_t timeout, size_t minBytes) 682 682 { 683 683 if (fCookie->closed) … … 691 691 if (fRequestOwner.IsFirstInQueues()) { 692 692 fBytes = _CheckAvailableBytes(); 693 if (fBytes > 0)693 if (fBytes > minBytes) 694 694 return B_OK; 695 695 } … … 718 718 ReaderLocker::AcquireReader(bool dontBlock) 719 719 { 720 return AcquireReader(dontBlock ? 0 : B_INFINITE_TIMEOUT );720 return AcquireReader(dontBlock ? 0 : B_INFINITE_TIMEOUT, 0); 721 721 } 722 722 … … 1501 1501 size_t length = *_length; 1502 1502 ssize_t bytesRead = 0; 1503 bool canon = true; 1503 1504 bigtime_t timeout = dontBlock ? 0 : B_INFINITE_TIMEOUT; 1504 bigtime_t vtime = 0LL;1505 bigtime_t vtime = timeout; 1505 1506 size_t vmin = 0; 1507 size_t minRead = 0; 1506 1508 1507 1509 TRACE(("tty_input_read(tty = %p, length = %lu, mode = %lu)\n", tty, length, mode)); … … 1517 1519 ReaderLocker locker(cookie); 1518 1520 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 1519 1540 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 } 1521 1547 if (status != B_OK) { 1522 1548 *_length = 0; … … 1525 1551 1526 1552 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) 1528 1561 continue; 1529 1562 if (toRead > length) … … 1531 1564 1532 1565 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; 1534 1570 1535 1571 bytesRead = line_buffer_user_read(tty->input_buffer, (char *)buffer, … … 1924 1960 kprintf(" pgrp_id: %ld\n", settings.pgrp_id); 1925 1961 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 1927 1974 kprintf(" wsize: %u x %u c, %u x %u pxl\n", 1928 1975 settings.window_size.ws_row, settings.window_size.ws_col, … … 1933 1980 dump_tty_struct(struct tty& tty) 1934 1981 { 1982 kprintf(" tty @: %p\n", &tty); 1935 1983 kprintf(" index: %ld\n", tty.index); 1936 1984 kprintf(" is_master: %s\n", tty.is_master ? "true" : "false"); haiku/trunk/src/add-ons/kernel/drivers/tty/tty_private.h
r25405 r25408 92 92 size_t BytesNeeded() const { return fBytesNeeded; } 93 93 94 status_t Wait(bool interruptable, bigtime_t timeout =B_INFINITE_TIMEOUT);94 status_t Wait(bool interruptable, bigtime_t timeout = B_INFINITE_TIMEOUT); 95 95 96 96 bool IsFirstInQueues();
