diff src/gtk/transfer.c @ 42:cd169e4789df

2002-10-29 Brian Masney <masneyb@gftp.org> * src/gtk/chmod_dialog.c src/gtk/delete_dialog.c src/gtk/gftp-gtk.c src/gtk/gftp-gtk.h src/gtk/menu-items.c src/gtk/misc-gtk.c src/gtk/mkdir_dialog.c src/gtk/rename_dialog.c src/gtk/transfer.c - improved and simplified signal handling code
author masneyb
date Wed, 30 Oct 2002 03:34:37 +0000
parents 4bcfaf6307b5
children 36e2868ce8b7
line wrap: on
line diff
--- a/src/gtk/transfer.c	Wed Oct 30 02:53:21 2002 +0000
+++ b/src/gtk/transfer.c	Wed Oct 30 03:34:37 2002 +0000
@@ -59,9 +59,7 @@
 						  gint handler );
 static mode_t parse_attribs 			( char *attribs );
 static void remove_file 			( char *filename );
-static RETSIGTYPE sig_connquit			( int signo );
 
-static sigjmp_buf connenvir;
 static GtkWidget * dialog;
 
 int
@@ -136,9 +134,8 @@
   
   if (request->use_threads)
     {
-      sj = sigsetjmp (connenvir, 1);
-      signal (SIGINT, sig_connquit);
-      signal (SIGALRM, sig_connquit);
+      sj = sigsetjmp (jmp_environment, 1);
+      use_jmp_environment = 1;
     }
   else
     sj = 0;
@@ -149,10 +146,8 @@
       if (gftp_list_files (request) != 0 || !GFTP_IS_CONNECTED (request))
         {
           if (request->use_threads)
-            {
-              signal (SIGINT, SIG_DFL);
-              signal (SIGALRM, SIG_IGN);
-            }
+            use_jmp_environment = 0;
+
           request->user_data = NULL;
           request->stopable = 0;
           if (request->wakeup_main_thread[1] > 0)
@@ -182,10 +177,8 @@
       if (!GFTP_IS_CONNECTED (request))
         {
           if (request->use_threads)
-            {
-              signal (SIGINT, SIG_DFL);
-              signal (SIGALRM, SIG_IGN);
-            }
+            use_jmp_environment = 0;
+
           request->user_data = NULL;
           request->stopable = 0;
           if (request->wakeup_main_thread[1] > 0)
@@ -212,10 +205,8 @@
 
   request->user_data = NULL;
   if (request->use_threads)
-    {
-      signal (SIGINT, SIG_DFL);
-      signal (SIGALRM, SIG_IGN);
-    }
+    use_jmp_environment = 1;
+
   request->stopable = 0;
   if (request->wakeup_main_thread[1] > 0)
     write (request->wakeup_main_thread[1], " ", 1);
@@ -338,9 +329,8 @@
   conn_num = 0;
   if (request->use_threads)
     {
-      sj = sigsetjmp (connenvir, 1);
-      signal (SIGINT, sig_connquit);
-      signal (SIGALRM, sig_connquit);
+      sj = sigsetjmp (jmp_environment, 1);
+      use_jmp_environment = 1;
     }
   else
     sj = 0;
@@ -373,10 +363,7 @@
     }
 
   if (request->use_threads)
-    {
-      signal (SIGINT, SIG_DFL);
-      signal (SIGALRM, SIG_IGN);
-    }
+    use_jmp_environment = 0;
 
   request->user_data = NULL;
   request->stopable = 0;
@@ -526,9 +513,8 @@
   if (transfer->fromreq->use_threads || 
       (transfer->toreq && transfer->toreq->use_threads))
     {
-      sj = sigsetjmp (connenvir, 1);
-      signal (SIGINT, sig_connquit);
-      signal (SIGALRM, sig_connquit);
+      sj = sigsetjmp (jmp_environment, 1);
+      use_jmp_environment = 1;
     }
   else
     sj = 0;
@@ -548,10 +534,7 @@
 
   if (transfer->fromreq->use_threads || 
       (transfer->toreq && transfer->toreq->use_threads))
-    {
-      signal (SIGINT, SIG_DFL);
-      signal (SIGALRM, SIG_IGN);
-    }
+    use_jmp_environment = 0;
 
   transfer->fromreq->user_data = NULL;
   if (transfer->toreq)
@@ -797,6 +780,8 @@
       if (transfer->cancel && !transfer->skip_file)
         break;
       transfer->cancel = 0;
+      transfer->fromreq->cancel = 0;
+      transfer->toreq->cancel = 0;
     }
   transfer->done = 1; 
   transfer->fromreq->user_data = NULL;
@@ -1081,7 +1066,11 @@
 
   pthread_mutex_lock (tdata->structmutex);
   if (tdata->started)
-    tdata->cancel = 1;
+    {
+      tdata->cancel = 1;
+      tdata->fromreq->cancel = 1;
+      tdata->toreq->cancel = 1;
+    }
   else
     tdata->done = 1;
 
@@ -1383,6 +1372,8 @@
   if (transdata->transfer->started)
     {
       transdata->transfer->cancel = 1;
+      transdata->transfer->fromreq->cancel = 1;
+      transdata->transfer->toreq->cancel = 1;
       transdata->transfer->skip_file = 0;
     }
   else
@@ -1418,6 +1409,8 @@
       if (transdata->transfer->started)
         {
           transdata->transfer->cancel = 1;
+          transdata->transfer->fromreq->cancel = 1;
+          transdata->transfer->toreq->cancel = 1;
           transdata->transfer->skip_file = 1;
         }
 
@@ -1467,6 +1460,8 @@
       transdata->curfle == transdata->transfer->curfle)
     {
       transdata->transfer->cancel = 1;
+      transdata->transfer->fromreq->cancel = 1;
+      transdata->transfer->toreq->cancel = 1;
       transdata->transfer->skip_file = 1;
     }
   else if (transdata->curfle != transdata->transfer->curfle &&
@@ -2145,6 +2140,8 @@
                   tdata->next_file = 1;
                   tdata->skip_file = 0;
                   tdata->cancel = 0;
+                  tdata->fromreq->cancel = 0;
+                  tdata->toreq->cancel = 0;
                 }
               else
                 {
@@ -2272,11 +2269,3 @@
              g_strerror (errno));
 }
 
-
-static RETSIGTYPE
-sig_connquit (int signo)
-{
-  signal (signo, sig_connquit);
-  siglongjmp (connenvir, signo == SIGINT ? 1 : 2);
-}
-