- Timestamp:
- Oct 30, 2017 5:49:42 PM (8 years ago)
- Location:
- trunk/src/kmk/kmkbuiltin
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/cat.c
r2900 r3117 81 81 82 82 83 #ifdef KBUILD_OS_WINDOWS84 /* This is a trick to seriuosly speed up console output windows. */85 # undef write86 # define write maybe_con_write87 extern ssize_t maybe_con_write(int, void const *, size_t);88 #endif89 90 91 83 int bflag, eflag, nflag, sflag, tflag, vflag; 92 84 /*int rval;*/ -
trunk/src/kmk/kmkbuiltin/mscfakes.c
r3094 r3117 48 48 #include <Windows.h> 49 49 #undef timeval 50 51 extern ssize_t maybe_con_write(int, void const *, size_t); 50 52 51 53 … … 474 476 ssize_t msc_write(int fd, const void *pvSrc, size_t cbSrc) 475 477 { 478 #define MSC_WRITE_MAX_CHUNK (UINT_MAX / 32) 476 479 ssize_t cbRet; 477 if (cbSrc < UINT_MAX / 4) 478 { 480 if (cbSrc <= MSC_WRITE_MAX_CHUNK) 481 { 482 /* Console output optimization: */ 483 if (cbSrc > 0 && isatty(fd)) 484 return maybe_con_write(fd, pvSrc, cbSrc); 485 479 486 #ifndef MSC_WRITE_TEST 480 487 cbRet = _write(fd, pvSrc, (unsigned int)cbSrc); … … 485 492 { 486 493 /* ENOSPC on pipe kludge. */ 487 int cbLimit;494 unsigned int cbLimit; 488 495 int cSinceLastSuccess; 489 496 … … 502 509 /* Likely a full pipe buffer, try write smaller amounts and do some 503 510 sleeping inbetween each unsuccessful one. */ 504 cbLimit = cbSrc / 4;511 cbLimit = (unsigned)(cbSrc / 4); 505 512 if (cbLimit < 4) 506 513 cbLimit = 4; … … 513 520 #endif 514 521 515 while ( cbSrc > 0)522 while ((ssize_t)cbSrc > 0) 516 523 { 517 unsigned int cbAttempt = cbSrc > cbLimit ? (int)cbLimit : (int)cbSrc;524 unsigned int cbAttempt = cbSrc > cbLimit ? cbLimit : (unsigned int)cbSrc; 518 525 ssize_t cbActual = _write(fd, pvSrc, cbAttempt); 519 526 if (cbActual > 0) 520 527 { 521 assert(cbActual <= (ssize_t)cbAttempt); 528 /* For some reason, it seems like we cannot trust _write to return 529 a number that's less or equal to the number of bytes we passed 530 in to the call. (Also reason for signed check in loop.) */ 531 if (cbActual > cbAttempt) 532 cbActual = cbAttempt; 533 522 534 pvSrc = (char *)pvSrc + cbActual; 523 535 cbSrc -= cbActual; … … 559 571 while (cbSrc > 0) 560 572 { 561 size_t cbToWrite = cbSrc > UINT_MAX / 4 ? UINT_MAX / 4: cbSrc;573 size_t cbToWrite = cbSrc > MSC_WRITE_MAX_CHUNK ? MSC_WRITE_MAX_CHUNK : cbSrc; 562 574 ssize_t cbWritten = msc_write(fd, pvSrc, cbToWrite); 563 575 if (cbWritten > 0)
Note:
See TracChangeset
for help on using the changeset viewer.