[ 
https://issues.apache.org/jira/browse/DAFFODIL-2502?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17330439#comment-17330439
 ] 

Steve Lawrence commented on DAFFODIL-2502:
------------------------------------------

The Javadoc for the read function in both DataInputStream and InputStream says:
{quote}This method blocks until input data is available, end of file is 
detected, or an exception is thrown.

{color:#172b4d}If {color}{{len}}{color:#172b4d} is zero, then no bytes are read 
and {color}{{0}}{color:#172b4d} is returned; otherwise, there is an attempt to 
read at least one byte. If no byte is available because the stream is at end of 
file, the value {color}{{-1}}{color:#172b4d} is returned; otherwise, at least 
one byte is read and stored into {color}{{b}}{color:#172b4d}.{color}
{quote}
Daffodil never passes in 0 as the len parameter, so read should always block 
until at least one byte is available and return, or return -1 for end of file.

Seems to me the case of getting zero bytes should never happen with the 
arguments Daffodil passes to read, and either there's a bug in Daffodil where 
we are passing in zero as the length field, or something isn't following the 
InputStream API.

> Parse must behave properly for reading data from TCP sockets
> ------------------------------------------------------------
>
>                 Key: DAFFODIL-2502
>                 URL: https://issues.apache.org/jira/browse/DAFFODIL-2502
>             Project: Daffodil
>          Issue Type: Bug
>          Components: API, Back End
>    Affects Versions: 3.0.0
>            Reporter: Mike Beckerle
>            Assignee: Mike Beckerle
>            Priority: Major
>
> Daffodil assumes the input streams are like files - reads are always blocking 
> for either 1 or more bytes of data, or End-of-data.
> People want to use Daffodil to read data from TCP/IP sockets. These can 
> return 0 bytes from a read because there is no data available, but that does 
> NOT mean the end of data. It's just a temporary condition. More data may come 
> along.
> Daffodil's InputSourceDataInputStream is wrapped around a regular Java input 
> stream, and enables us to support incoming messages which do not conform to 
> byte-boundaries.
> The problem is that there's no way for users to wrap an 
> InputSourceDataInputStream around a TCP/IP socket, and have it behave 
> properly when a read() call temporarily says 0 bytes available.
> Obviously we don't want to sit in a tight loop just retrying the read until 
> we get either some bytes or end-of-data.
> The right API here is that if the read() of the underlying java stream 
> returns 0 bytes, that a hook function supplied by the API user is called.
> One obvious thing a user can do is put a call to Thread.yield() in the hook. 
> (That might even want to be the default behavior if they supply no hook.) 
> Then if they have a separate thread parsing the data with daffodil, that 
> thread will at least yield the CPU, i.e., behave politely in a multi-threaded 
> world.
> More advanced usage could start a Daffodil parse using co-routines, returning 
> control to the caller when the parse must pause due to read() of the Java 
> input stream returning 0 bytes.
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to