On 09/06/2010 11:29 AM, Mathieu Desnoyers wrote:
* Mathieu Desnoyers ([email protected]) wrote:
* Pierre-Marc Fournier ([email protected]) wrote:
I disagree with you Mathieu. These retvals are the same as i/o
syscalls (read/write/send/recv/...)and therefore should in my opinion
remain as is.

Well, this function is not technically the same as i/o syscalls at all.
It uses I/O syscalls, but it is not an I/O syscall per se, so the return
value transformation to a more standard pattern (neg err val, 0 ok)
should happen right in this function rather than to let all callers
handle this. I/O syscalls use positive return values to indicate the
number of bytes read/written/etc. Here, this function arbitrarily choose
1 to indicate that "something has been sent" without caring about the
amount of data moved at all.

So as it doesn't need the whole positive range to spell out the amount
of data moved, it doesn't need to do the same special-cases that the I/O
syscalls are doing. It adds a lot of error values management oddness
without adding anything.

So even though I agree with you that this function is close to the I/O
system calls because it calls it, it is very far from the I/O syscalls
semantically (we don't care about the number of bytes written), and even
though we might be tempted to use the same error values as system calls
for them, the fact that we just don't care about the number of bytes
written combined with the fact that standardizing error value across the
code makes it much easier to follow and to write just call for this
change.

By the way, looking at include/share.h:patient_write(), in the case
where write returns 0, I think we should consider this as a success and
loop again to retry write rather than consider that an error occurred.
The same apply to patient_send(). See the manpages for details:

write(2):

RETURN VALUE
        On  success,  the  number  of bytes written is returned (zero indicates
        nothing was written).  On error, -1  is  returned,  and  errno  is  set
        appropriately.

        If  count  is  zero  and  fd refers to a regular file, then write() may
        return a failure status if one of the errors below is detected.  If  no
        errors  are  detected,  0  will  be  returned without causing any other
        effect.  If count is zero and fd refers to a file other than a  regular
        file, the results are not specified.

send(2):
RETURN VALUE
        On success, these calls return  the  number  of  characters sent.   On
        error, -1 is returned, and errno is set appropriately.


No. 0 indicates end of stream and looping on it will result in an infinite loop. You need to refer to the specific backend driver to understand these specific semantics. The read/write manpages are notorious for their non-clarity about this.

pmf

_______________________________________________
ltt-dev mailing list
[email protected]
http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev

Reply via email to