Fixed cancelling when threads are used. Only SIGPIPE is blocked now. Sleep

indefinetly after the reader_process has finished. Minor fixes of debug
messages.
merge-requests/1/head
Henning Geinitz 2003-10-13 18:03:40 +00:00
rodzic f206deb849
commit cc8a3875ca
2 zmienionych plików z 25 dodań i 22 usunięć

Wyświetl plik

@ -43,7 +43,7 @@
This backend is for testing frontends. This backend is for testing frontends.
*/ */
#define BUILD 24 #define BUILD 25
#include "../include/sane/config.h" #include "../include/sane/config.h"
@ -1262,7 +1262,9 @@ reader_process (Test_Device * test_device, SANE_Int fd)
free (buffer); free (buffer);
DBG (4, "(child) reader_process: finished, wrote %d bytes, expected %d " DBG (4, "(child) reader_process: finished, wrote %d bytes, expected %d "
"bytes, now waiting\n", byte_count, bytes_total); "bytes, now waiting\n", byte_count, bytes_total);
while (SANE_TRUE)
sleep (10); sleep (10);
DBG (4, "(child) reader_process: this should have never happened...");
close (fd); close (fd);
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
} }
@ -1277,25 +1279,26 @@ static int reader_task(void *data)
struct SIGACTION act; struct SIGACTION act;
struct Test_Device *test_device = (struct Test_Device *) data; struct Test_Device *test_device = (struct Test_Device *) data;
DBG (1, "reader_task started\n"); DBG (2, "reader_task started\n");
if( sanei_thread_is_forked()) { if( sanei_thread_is_forked()) {
DBG( 1, "reader_task started (forked)\n" ); DBG( 3, "reader_task started (forked)\n" );
close( test_device->pipe ); close( test_device->pipe );
test_device->pipe = -1; test_device->pipe = -1;
} else { } else {
DBG( 1, "reader_task started (as thread)\n" ); DBG( 3, "reader_task started (as thread)\n" );
} }
/* block all signals but SIGTERM */ /* block SIGPIPE */
sigfillset (&ignore_set); sigemptyset (&ignore_set);
sigdelset (&ignore_set, SIGTERM); sigaddset (&ignore_set, SIGPIPE);
sigprocmask (SIG_SETMASK, &ignore_set, 0); sigprocmask (SIG_SETMASK, &ignore_set, 0);
memset (&act, 0, sizeof (act)); memset (&act, 0, sizeof (act));
sigaction (SIGTERM, &act, 0); sigaction (SIGTERM, &act, 0);
status = reader_process (test_device, test_device->reader_fds ); status = reader_process (test_device, test_device->reader_fds );
DBG (2, "(child) sane_start: reader_process timed out\n"); DBG (2, "(child) reader_task: reader_process finished (%s)\n",
sane_strstatus (status));
return (int)status; return (int)status;
} }
@ -1324,10 +1327,10 @@ finish_pass (Test_Device * test_device)
pid = sanei_thread_waitpid (test_device->reader_pid, &status ); pid = sanei_thread_waitpid (test_device->reader_pid, &status );
if (pid < 0) if (pid < 0)
{ {
DBG (1, "finish_pass: waitpid failed, already terminated? (%s)\n", DBG (1, "finish_pass: sanei_thread_waitpid failed, already terminated? (%s)\n",
strerror (errno)); strerror (errno));
} else { } else {
DBG (2, "finish_pass: reader process terminated with status %s\n", DBG (2, "finish_pass: reader process terminated with status: %s\n",
sane_strstatus (status)); sane_strstatus (status));
} }
test_device->reader_pid = 0; test_device->reader_pid = 0;
@ -2390,13 +2393,13 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
break; break;
} }
DBG (2, "sane_get_parameters: format=%s\n", text_format); DBG (3, "sane_get_parameters: format=%s\n", text_format);
DBG (2, "sane_get_parameters: last_frame=%s\n", DBG (3, "sane_get_parameters: last_frame=%s\n",
p->last_frame ? "true" : "false"); p->last_frame ? "true" : "false");
DBG (2, "sane_get_parameters: lines=%d\n", p->lines); DBG (3, "sane_get_parameters: lines=%d\n", p->lines);
DBG (2, "sane_get_parameters: depth=%d\n", p->depth); DBG (3, "sane_get_parameters: depth=%d\n", p->depth);
DBG (2, "sane_get_parameters: pixels_per_line=%d\n", p->pixels_per_line); DBG (3, "sane_get_parameters: pixels_per_line=%d\n", p->pixels_per_line);
DBG (2, "sane_get_parameters: bytes_per_line=%d\n", p->bytes_per_line); DBG (3, "sane_get_parameters: bytes_per_line=%d\n", p->bytes_per_line);
if (params) if (params)
*params = *p; *params = *p;
@ -2630,7 +2633,7 @@ sane_read (SANE_Handle handle, SANE_Byte * data,
test_device->bytes_total += bytes_read; test_device->bytes_total += bytes_read;
DBG (2, "sane_read: read %d bytes of %d, total %d\n", bytes_read, DBG (2, "sane_read: read %d bytes of %d, total %d\n", bytes_read,
max_length, test_device->bytes_total); max_scan_length, test_device->bytes_total);
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
} }
@ -2657,12 +2660,12 @@ sane_cancel (SANE_Handle handle)
} }
if (test_device->cancelled) if (test_device->cancelled)
{ {
DBG (1, "sane_read: scan already cancelled\n"); DBG (1, "sane_cancel: scan already cancelled\n");
return; return;
} }
if (!test_device->scanning) if (!test_device->scanning)
{ {
DBG (1, "sane_read: not scanning\n"); DBG (2, "sane_cancel: scan is already finished\n");
return; return;
} }
finish_pass (test_device); finish_pass (test_device);

Wyświetl plik

@ -10,7 +10,7 @@
; ;
:backend "test" ; name of backend :backend "test" ; name of backend
:version "1.0-23" ; version of backend :version "1.0-25" ; version of backend
:manpage "sane-test" ; name of manpage (if it exists) :manpage "sane-test" ; name of manpage (if it exists)
:url "http://www.meier-geinitz.de/sane/test-backend/" ; backend's web page :url "http://www.meier-geinitz.de/sane/test-backend/" ; backend's web page