ugen partial write() amount
Hans Petter Selasky
hselasky at c2i.net
Sat Jun 17 17:15:58 UTC 2006
On Saturday 17 June 2006 17:54, Anish Mistry wrote:
> On Saturday 17 June 2006 03:50, Hans Petter Selasky wrote:
> > On Friday 16 June 2006 23:24, Anish Mistry wrote:
> > > I'm trying to reliably recover from a write() timeout using
> > > ugen. The problem that I'm having is that when using write() to
> > > write data to an endpoint and the write times out there seems no
> > > way to figure out the amount of that data that was actually
> > > written. This is a problem when trying to write data to a
> > > printer and the paper runs out. write() will timeout and you are
> > > left with no way to figure out where to start sending data since
> > > you don't know how much was received by the device before the
> > > paper ran out.
> > > It seems this could be possible by modifying the driver by
> > > adding and ioctl that would allow you to call bulk transfer and
> > > then return the number of bytes written. Is there a better way
> > > of doing?
> >
> > What about disabling the timeout ?
>
> That works, the problem is that the write() will block causing the
> controller application to be non-responsive and not report the
> condition that caused the failure since it has blocked.
I have some plans to make "ugen" asynchronous. Then you can use FIONBIO to set
non-blocking mode, and poll the file descriptor. That is the solution I see.
> My conclusion so far is that I would need to thread the writing logic
> in the application, and then write my own timeout logic when I notice
> that the write is blocking for longer than our time interval. At
> least that is the option I can think of without modifying the driver.
Yes.
--HPS
More information about the freebsd-usb
mailing list