On 7 Sep 2003 at 12:32, Daniel Eischen wrote: > On Sun, 7 Sep 2003, Dan Langille wrote: > > > A problem with pthreads and EOT has been identified. See PR 56274. It > > was suggested the solution was probably just a matter of changing one of > > the >0 tests to >=0 in uthread_write.c > > > > Any comments on that? > > I don't know that a return of 0 isn't valid for other devices. > If this is the case, a return of 0 for blocking writes may break > other applications. > > The patch isn't quite correct (at least looking at -current srcs). > Lines 98-99 are: > > if (blocking && ((n < 0 && (errno == EWOULDBLOCK || > errno == EAGAIN)) || (n >= 0 && num < nbytes))) { > > This will get entered first if n == 0, and I don't think your > proposed patch would have any effect. I think you would have > to change the "n >= 0" above to be "n > 0" in conjunction with > your patch.
Ahh thank you. That explains why the test results with the original patch did not differ from -STABLE or 5.1-RELEASE. After adding your suggestions, we have had success. The points to note: 1. The status that stopped the writing was 0 2. It wrote 17,256 blocks, and read 17,256 blocks. Point 1 is key to determining EOT. Point 2 is what you always want to have... [EMAIL PROTECTED]:~/tape-test] $ sudo ./tapetest /dev/nsa0 *rewind Rewound /dev/nsa0 *rawfill Begin writing blocks of 64512 bytes. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++ weof_dev Wrote EOF to /dev/nsa0 Write failed. Last block written=17256. stat=0 ERR=Unknown error: 0 *rewind Rewound /dev/nsa0 *scan Starting scan at file 0 17256 blocks of 64512 bytes in file 0 End of File mark. End of File mark. End of tape Total files=1, blocks=17256, bytes = 1113219072 * > This could be solved at the application level by selecting on > the tape device and performing non-blocking writes to it. Since > the application knows that a return of 0 is end-of-tape, it > must also know the difference between talking to a tape device > and talking to a regular file, socket, etc. True. But *if* the code is wrong, it should be fixed. FWIW, the patch follows. As always, opinions and suggestions are welcome. --- uthread_write.c.org Sun Sep 7 10:58:31 2003 +++ uthread_write.c Sun Sep 7 15:41:34 2003 @@ -93,7 +93,7 @@ * write: */ if (blocking && ((n < 0 && (errno == EWOULDBLOCK || - errno == EAGAIN)) || (n >= 0 && num < nbytes))) { + errno == EAGAIN)) || (n > 0 && num < nbytes))) { curthread->data.fd.fd = fd; _thread_kern_set_timeout(NULL); @@ -131,7 +131,7 @@ * If there was an error, return partial success * (if any bytes were written) or else the error: */ - } else if (n < 0) { + } else if (n <= 0) { if (num > 0) ret = num; else -- Dan Langille : http://www.langille.org/ _______________________________________________ [EMAIL PROTECTED] mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-hackers To unsubscribe, send any mail to "[EMAIL PROTECTED]"