On Thu, Dec 11, 2008 at 4:24 PM, ABC <abc at telekom.ru> wrote: > On Thu, Dec 11, 2008 at 04:06:24PM -0500, m. allan noah wrote: >> On Mon, Dec 1, 2008 at 10:23 PM, ABC <abc at telekom.ru> wrote: >> > First of all sanei_usb_init() is not designed to be used for rescanning >> > after any other sanei_usb functions is called. It is just initialization >> > and rescanning ability is not documented side effect. As stated in >> > documentation: "Call this before any other sanei_usb function". So don't >> > call it after. (This doesn't state it should be called just once, so we >> > could rescan before first device is opened.) >> >> sanei_usb_init() will blast the existing info, and assign all new >> device indexes to whatever it finds. > > Exactly how it works now. > >> However, sanei_usb_init() is only >> called by backends in sane_init() and sane_get_devices(). A frontend >> will only call sane_init() once, so that is not a problem, and the >> sane standard says this about sane_get_devices(): >> >> The returned list is guaranteed to remain unchanged and valid until >> (a) another call to this function is performed or (b) a call to >> sane_exit() is performed. > > This don't says calling sane_get_devices will or should break any > already opened device.
That is strongly implied. Why else would it bother to guarantee only half of the cycle? >> So, if you call sane_get_devices() twice, you cannot complain that any >> devices you have open don't work anymore. > > I can complain about that, since list of name/vendor/model/type of all > available devices is logically not related to any already opened > device. Good point, but not what the standard implies above. > >> However, you have a valid point that most backends only call >> sanei_usb_init() in sane_init(), and I think that should change. > > In backend I'm writing I call sanei_usb_init multiple times (in each > sane_get_devices) only if I don't have opened devices. I think that's ok. Unfortunately, that is not enough. if a person has another brand of scanner on their machine, alongside yours, and they open the other scanner and then call sane_get_devices(), your backend won't know. Then you will blast the list with the other backend's open device in it. allan -- "The truth is an offense, but not a sin"