On Wed, Mar 25, 2020 at 10:23:09AM +0000, Richard W.M. Jones wrote:
On Wed, Mar 25, 2020 at 10:14:30AM +0000, Daniel P. Berrangé wrote:
> On Wed, Mar 25, 2020 at 10:01:02AM +0000, Richard W.M. Jones wrote:
> > On Wed, Mar 25, 2020 at 09:48:02AM +0000, Daniel P. Berrangé wrote:
> > > On Wed, Mar 25, 2020 at 09:42:19AM +0000, Richard W.M. Jones wrote:
> > > > Now runs a complete set of tests, notably including the AIO test.
> > > >
> > > > File descriptors are passed in and out as plain ints (instead of
> > > > *os.File) for a couple of reasons: (1) We have to pass the plain int
> > > > to syscall.Select. (2) Turning an fd into an os.File causes golang
to
> > > > set the blocking flag which is deeply unhelpful.
> > >
> > > FWIW, using non-blocking FDs and syscall.Select is not normal best
> > > practice for Go, where the expected model would be to use goroutines
> > > with the file in blocking mode.
> >
> > Right, however I couldn't find any documentation about how to
> > integrate a C library with that mechanism. Does libvirt-go do
> > anything like this?
>
> What's the intended usage of the FD ? I was thinking it was just for
> doing plain read/write I/O from Go, but now I'm thinking this was wrong
> interpretation
http://libguestfs.org/libnbd.3.html#Socket-and-direction
For example here's how it's integrated with glib:
https://github.com/libguestfs/libnbd/blob/master/examples/glib-main-loop.c
Integration with poll(2):
https://github.com/libguestfs/libnbd/blob/a5fe64ab5323d649d348e61c9126ef7...
It currently works from golang too, but it seems likely that
synchronous calls like nbd_pread are blocking the golang main loop
(because we make our own call to poll(2)). The asynch stuff also
works (see libnbd_590_aio_copy_test.go in the attached patch) but it's
rather awkward.
Ah so the only real use case for the FD is for using it will poll(),
so you're right that we don't really want to wrap it in an os.File in
that case.
Regards,
Daniel
--
|: