On 16 Jun 2013, at 03:18, Michalis Kamburelis wrote:

> Ewald wrote:
>> And what with non-blocking pipes pipes? Wait for a *some* period
>> until you get all data? It is up to the programmer to do this INHO.
> 
> If you want to get partial data (instead of waiting until all requested data 
> is available) you should just use TStream.Read instead of TStream.ReadBuffer. 
> Then it's indeed up to the programmer to handle this.
> 

Sorry, I misread your mail last night (it was getting late I believe), I 
thought you said `TStream.Read` instead of `TStream.ReadBuffer`. In this case 
you are probably right.

> 
>> Also, if you would enforce this behaviour on all kinds of streams,
>> you might (`will`, actually) get unexpected performance drops...
> 
> I don't see why you would get any performance drop. If you're lucky and a 
> single Read call is all you need, then the speed is the same as current 
> implementation, since the 1st check "if Read(Buffer,Count)<Count then" will 
> return false and we will not call Read again.

Never mind, my brain was still thinking on the wrong call here. Sorry for the 
noise there :-)


>> 
>> But if you work with a blocking fd (which, for example, a TFileStream
>> uses IIRC) you will always get your data. If there is more data to be
>> read(), but it would take time, it simply takes time. The only case
>> where zero is returned, is IIRC (like you quoted) when the end of the
>> `fd` (e.g. pipe, socket, file) is reached on *blocking
>> filedescriptors*.
> 
> Yes, zero is returned only if stream ends. But a result that is non-zero, but 
> still less than requested Count, doesn't tell you if the stream ends. The 
> whole point is whether ReadBuffer should take this into account.

If the `ReadBuffer` call uses `Read` to read the data (which would be rather 
obvious) than yes, it would need to take this into account as it cannot know 
which subsystem `Read` uses.


> 
>> FYI: I've never had the problem of a `partial read` (e.g.
>> SomeStream.Read(50) returning 36 or something) on linux, osx and
>> windows; so perhaps you have exposed some bug in an obscure TStream
>> descendant?
>> 
> 
> Reproducing this behavior proved to be difficult, but I definitely observed 
> it with TFileStream on Linux.

Did it got interrupted by a signal then? Or perhaps the `Count` argument of 
`ReadBuffer` was greater than SSIZE_MAX? Either way, as ReadBuffer gives no 
information about the number of bytes actually read, it should indeed `try 
harder`.

> 
> And, even if it would accidentally work for some streams, that's not a 
> solution. Like I mentioned, TStream.ReadBuffer is non-virtual and must be 
> suitable for every TStream.
> 

The question that arises here is whether all the `ReadByte`, `ReadWord`, 
`WriteByte`, `WriteWord`, `WriteBuffer`, ... should also `try harder`? Same 
issue there: no data is returned about the actual number of bytes read. Anyway, 
I leave that to someone who knows the internals of these classes.

--
Ewald

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to