[phobos] Fwd: [Issue 4025] New: Making network with the std.stdio.File interface

Steve Schveighoffer schveiguy at yahoo.com
Thu Apr 8 05:16:14 PDT 2010


Sorry, I meant to reply to the group, but my email client just sent it to Andrei.

-Steve



----- Original Message ----
> From: Steve Schveighoffer <schveiguy at yahoo.com>
> To: Andrei Alexandrescu <andrei at erdani.com>
> Sent: Thu, April 8, 2010 8:14:50 AM
> Subject: Re: [phobos] Fwd: [Issue 4025] New: Making network with the std.stdio.File interface
> 
> ----- Original Message ----

> From: Andrei Alexandrescu <
> ymailto="mailto:andrei at erdani.com" 
> href="mailto:andrei at erdani.com">andrei at erdani.com>
> Subject: Re: 
> [phobos] Fwd: [Issue 4025] New: Making network with the std.stdio.File 
> interface
> 
> On 03/30/2010 06:03 AM, Steve Schveighoffer 
> wrote:
> > While I believe ranges can 
> > be useful for 
> streams, they are not the
> > best interface for all 
> > 
> applications.  For example, if I have a
> > protocol that reads 2 
> bytes 
> > to get a length, and then reads length
> > bytes 
> from the stream, a range of 
> > those units is probably a good
> 
> > abstraction.  But I don't want to 
> > resort to C calls to 
> create that
> > abstraction -- there should be a nice D 
> > 
> layer in between.  I should
> > not have to create my own 
> buffering 
> > solution.  I/O performance is
> > more 
> important IMO than interface 
> > when it comes to streams.  
> This
> > does not mean big-O complexity, I'm 
> > talking 
> about raw performance.
>
> I think the interface you described can 
> be 
> easily modeled as a range of ubyte[]. Again, a range of ubyte[] 
> doesn't have to 
> return the same number of elements each step.

I 
> agree that a range of such packets is possible, but the problem is, how does one 
> build such a range?  If
all you have as an interface to a network socket 
> is a range, how do you
make *that* range spit out what you need?  In 
> other words, you want a D
abstraction to the syscalls, I think we all agree 
> on that.  I don't
think a range abstraction is good enough for all 
> purposes.

In my example, I'd want at least a "read this many bytes" 
> interface, so
I could read the initial length, then read the remaining bytes 
> in the
packet using that length.

If you follow through the logic of 
> how such a system would be built, I think the best abstraction is a layer that 
> abstracts out the read/write functionality (unbuffered), and then build 
> ranges/buffered i/o on top of that.  The abstraction can be compile-time, 
> we don't need to do interfaces here.

> > I hope we can see a 
> 
> > design before you commit to doing it this way.
> > For 
> example, a zip 
> > library uses a range as a source, what does 
> the
> > file range look like 
> > that satisfies the range 
> properties and also is
> > efficient?  Just 
> > seeing 
> the API should be enough to judge.
>
>Feel free to suggest one. I 
> 
> won't be able until I study the zip file format.

I don't plan 
> to.  Zip files are not my forte.  My question was about the statement 
> "We concluded that the zip file library should know nothing about files or file 
> streams. It should work with ranges."  Does someone here know what 
> functional requirements the zip format needs for input?

A simple answer 
> here would be: "A x range of type T"  where you substitute x for input, 
> forward, etc. and T for the type returned by front.  And I'm not talking 
> about the zip library, I'm talking about the generic file/network stream.  
> It can't know that it's being used by a zip 
> function.

-Steve


      


More information about the phobos mailing list