> > there are plenty of front-ends for which non-blocking mode is not required > (think command line, or cgi script, etc). all of my front-ends work this way.
You might need non-blocking with command line or cgi scripts as well. Nowadays, users expects "AJAX-typ" pages, that can load incrementally. The old style "read everything, write everything" is not fun, not even with CGI scripts. > if each backend (there are 68+ of them) has both a blocking and a non-blocking > mode, that is quite a bit of code. Is it, really? I haven't written a backend myself, but from the source, it's not obvious that "quite a bit of code" code be removed by removing the non-blocking support. > it is also significantly more difficult to debug the backend when it is > multi-threaded. given that many of our backends are rarely touched or > are maintained by someone other than the original author, it makes sense > to keep them simple. I agree, I want to make it simple, both for the backend and application developers. The problem with the current situation is: 1) Backend writers "needs" to support non-blocking and get_select_fd, since the documentation says they should, and some applications might require it. 2) Application developers needs to support backends which cannot do non-blocking or get_select_fd, and must therefore use threading/forking themself. This seems like a lose-lose situation: Both the backend and frontend developers needs to handle all three cases. Well, the frontend developers could skip to try non-blocking and get_select_fd and *always* thread/fork themselves. But that would mean that the non-blocking/get_select_fd code in the backends are useless. So one idea is to simply make non-blocking sane_read and get_select_fd deprecated, and eventually remove them... > besides, its easier for app developer (who likely has multi-threading in his > app already for other purposes) to decide that he needs it, and deal with the > threading himself. Personally, I think the select loop model is superior, but since not all backends supports get_select_fd, an otherwise select based application might be forced to start to fork/thread. Not pretty. > the fujitsu backend no longer has threading for this reason. That means that you are not following the recommendations at http://www.sane-project.org/html/doc000.html: "support for this operation is strongly encouraged" I'm not really sure of what needs to be done, but again, I believe the current situation is non-optimal. Right know, I tend to favourize this solution: 1) Deprecate sane_set_io_mode() (and thus non-blocking sane_read()). It doesn't give the frontend developer anything that sane_get_select_fd() + select() doesn't give. 2) Make sane_get_select_fd() mandatory on UNIX. The only "problem" with this solution is that the select based model cannot be used on Windows, but few people wants this anyway, they are using threads instead. Regards, -- Peter ?strand ThinLinc Chief Developer Cendio AB http://www.cendio.se Teknikringen 3 583 30 Link?ping Phone: +46-13-21 46 00 From an...@pfeiffer.edu Mon Oct 30 17:16:49 2006 From: an...@pfeiffer.edu (m. allan noah) Date: Mon Oct 30 17:17:43 2006 Subject: [sane-devel] Neither get_select_fd() nor non-blocking In-Reply-To: <pine.lnx.4.64.0610301622460....@maggie.lkpg.cendio.se> References: <pine.lnx.4.64.0610301622460....@maggie.lkpg.cendio.se> Message-ID: <pine.lnx.4.61.0610301041010.16...@limos.pfeiffer.edu> hopefully this comes thru- my sane devel mails seem to disappear... On Mon, 30 Oct 2006 astr...@cendio.se wrote: >> there are plenty of front-ends for which non-blocking mode is not required >> (think command line, or cgi script, etc). all of my front-ends work this way. > > You might need non-blocking with command line or cgi scripts as well. > Nowadays, users expects "AJAX-typ" pages, that can load incrementally. The > old style "read everything, write everything" is not fun, not even with > CGI scripts. ajax is beside the point. lets just say that there are apps where non-blocking is not required, and apps where it is. and in every case i can think of, it is the FRONTEND that has the reason for it to be non-blocking. >> if each backend (there are 68+ of them) has both a blocking and a >> non-blocking >> mode, that is quite a bit of code. > > Is it, really? I haven't written a backend myself, but from the source, > it's not obvious that "quite a bit of code" code be removed by removing > the non-blocking support. perhaps we have different values for 'quite a bit'. you obviously are a more accomplished programmer than me, so maybe not scared by a few lines of C :) >> it is also significantly more difficult to debug the backend when it is >> multi-threaded. given that many of our backends are rarely touched or >> are maintained by someone other than the original author, it makes sense >> to keep them simple. > > I agree, I want to make it simple, both for the backend and application > developers. The problem with the current situation is: > > 1) Backend writers "needs" to support non-blocking and get_select_fd, > since the documentation says they should, and some applications might > require it. no. 'A backend may elect not to support non-blocking I/O mode' and 'A backend may elect not to support this operation'. they are _optional_, and any application that 'requires' these in a backend is broken. > > 2) Application developers needs to support backends which cannot do > non-blocking or get_select_fd, and must therefore use threading/forking > themself. correct, but _only_ if he needs it for his frontend. no-one needs to thread/fork if the frontend does not care to. > > This seems like a lose-lose situation: Both the backend and frontend > developers needs to handle all three cases. Well, the frontend developers > could skip to try non-blocking and get_select_fd and *always* thread/fork > themselves. But that would mean that the non-blocking/get_select_fd code > in the backends are useless. So one idea is to simply make non-blocking > sane_read and get_select_fd deprecated, and eventually remove them... > my preferred solution, but i do not speak for the other devels. > >> besides, its easier for app developer (who likely has multi-threading in his >> app already for other purposes) to decide that he needs it, and deal with the >> threading himself. > > Personally, I think the select loop model is superior, but since not all > backends supports get_select_fd, an otherwise select based application > might be forced to start to fork/thread. Not pretty. > in general, the backend is going to have to fork/thread to give you your select_fd. i feel that the management of such OS-specific libs, creation of children, dealing with signals, etc. is in the frontend. >> the fujitsu backend no longer has threading for this reason. > > That means that you are not following the recommendations at > http://www.sane-project.org/html/doc000.html: > > "support for this operation is strongly encouraged" correct. i have chosen not to complicate the backend for what i perceive as a limited, optional benefit. > > I'm not really sure of what needs to be done, but again, I believe the > current situation is non-optimal. Right know, I tend to favourize this > solution: > > 1) Deprecate sane_set_io_mode() (and thus non-blocking sane_read()). It > doesn't give the frontend developer anything that sane_get_select_fd() > + select() doesn't give. > > 2) Make sane_get_select_fd() mandatory on UNIX. > > The only "problem" with this solution is that the select based model > cannot be used on Windows, but few people wants this anyway, they are > using threads instead. > i would say at this point, that the only way you would ever see that kind of change would be as a part of the SANE2 standard. there are just too many existing backends that would have to be changed. the better solution, imho, is the one taken by e.g. XSANE. if your frontend cares about non-blocking mode because its a gui or whatever, then let it deal with the issue. this is pretty much standard fare for other libs for dns resolves, http/ftp transfers, etc. existing SANE-1 backends can drop the code which provides these options, and the ABI/API does not change. SANE2 can remove the function calls, or leave them such that old frontends can be easily ported. allan -- "so don't tell us it can't be done, putting down what you don't know. money isn't our god, integrity will free our souls" - Max Cavalera