# Running out of processes, going in SANE...

Michael Sweet (mike@easysw.com)
Thu, 04 Dec 1997 17:17:46 -0500

- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
- Next message: Benedikt Eric Heinen: "Re: second SCSI controller.."
- Previous message: Helmut Koeberle: "Backend for Canon CanoScan 600"

OK,

Today I started some mass scanning of pictures (of my wedding) using
SANE. After about 2 dozen I started having scanning problems, and I
couldn't run simple commands like "man"...

After a little investigation it turns out that the mustek, qcam, and
umax backends don't have a SIGCHLD handler and don't do a wait() on
the reader process all the time, so the child processes created by the
backend each time a scan or preview is done stick around until
(x)scanimage exits... The only time a wait() is done by the backends
is if you cancel a scan...

So.... here's a quick patch that fixes the problems in 0.67 (I haven't
grabbed 0.68 quite yet...):

--- mustek.c.orig Thu Dec 4 17:09:52 1997
+++ mustek.c Thu Dec 4 17:15:22 1997
@@ -2614,7 +2614,14 @@
Mustek_Scanner *s = handle;
if (s->reader_pid > 0)
+ {
+ int exit_status;
+
kill (s->reader_pid, SIGTERM);
+ while (wait (&exit_status) != s->reader_pid);
+ s->reader_pid = 0;
+ };
+
s->scanning = SANE_FALSE;
}
--- qcam.c.orig Thu Dec 4 17:09:59 1997
+++ qcam.c Thu Dec 4 17:14:26 1997
@@ -1505,7 +1505,14 @@
sane_cancel (handle);
if (s->reader_pid >= 0)
+ {
+ int exit_status;
+
kill (s->reader_pid, SIGTERM);
+ while (wait (&exit_status) != s->reader_pid);
+ s->reader_pid = 0;
+ };
+
if (s->to_child >= 0)
close (s->to_child);
if (s->from_child >= 0)
@@ -2001,6 +2008,7 @@
char buf[1024];
ssize_t nread;
int flags;
+ int exit_status;
DBG(1, "cancel: cancelling read request\n");
@@ -2026,6 +2034,9 @@
/* now restore non-blocking i/o flag: */
fcntl (s->from_child, F_SETFL, flags & O_NONBLOCK);
+
+ while (wait (&exit_status) != s->reader_pid);
+ s->reader_pid = 0;
DBG(1, "cancel: cancellation completed\n");
}
--- umax.c.orig Thu Dec 4 17:10:07 1997
+++ umax.c Thu Dec 4 17:11:44 1997
@@ -2211,7 +2211,15 @@
DBG(10,"sane_cancel\n");
- if (scanner->reader_pid > 0) { kill(scanner->reader_pid, SIGTERM); }
+ if (scanner->reader_pid > 0)
+ {
+ int exit_status;
+
+ /* ensure child knows it's time to stop: */
+ kill (scanner->reader_pid, SIGTERM);
+ while (wait (&exit_status) != scanner->reader_pid);
+ scanner->reader_pid = 0;
+ }
scanner->scanning = SANE_FALSE;
}

    --
    ________________________________________________________________________
     Mike Sweet        Software for SGI and Sun      Easy Software Products
     (301) 373-9603          Workstations          44145 Airport View Drive
     mike@easysw.com    http://www.easysw.com    Hollywood, Maryland  20636

            SUPPORT THE ANTI-SPAM AMENDMENT! - http://www.cauce.org

    --
    Source code, list archive, and docs: http://www.mostang.com/sane/
    To unsubscribe: echo unsubscribe sane-devel | mail majordomo@mostang.com

     Next message: Benedikt Eric Heinen: "Re: second SCSI controller.."
     Previous message: Helmut Koeberle: "Backend for Canon CanoScan 600"