]> arthur.barton.de Git - netatalk.git/commitdiff
remove the need for blocking SIGALRM (still need to deal with attention volumes changed)
authordidg <didg>
Thu, 22 Oct 2009 04:59:50 +0000 (04:59 +0000)
committerdidg <didg>
Thu, 22 Oct 2009 04:59:50 +0000 (04:59 +0000)
include/atalk/dsi.h
libatalk/dsi/dsi_attn.c
libatalk/dsi/dsi_init.c
libatalk/dsi/dsi_read.c
libatalk/dsi/dsi_stream.c
libatalk/dsi/dsi_tickle.c

index 91cee9ba1ef2b1b520a0ac14bad739fc2da11bc0..5053cb13d4565e285d64c7b616d03ebd1fc66c51 100644 (file)
@@ -60,7 +60,11 @@ typedef struct DSI {
   
   sigset_t sigblockset, oldset;
   int      sigblocked;
-  struct itimerval timer, savetimer;
+  struct itimerval timer;
+
+  int     in_write;      /* in the middle of writing multiple packets, signal handlers
+                          * can't write to the socket 
+                         */
   
   u_int32_t attn_quantum, datasize, server_quantum;
   u_int16_t serverID, clientID;
index 30ec736df7458df8da3039ff976404f40c9b4674..395ee1db940e73063a80819e05168438569ca0d8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_attn.c,v 1.6 2005-04-28 20:50:02 bfernhomberg Exp $
+ * $Id: dsi_attn.c,v 1.7 2009-10-22 04:59:50 didg Exp $
  *
  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -35,7 +35,7 @@ int dsi_attention(DSI *dsi, AFPUserBytes flags)
   u_int32_t len, nlen;
   u_int16_t id;
 
-  if (dsi->asleep)
+  if (dsi->asleep || dsi->in_write)
       return 1;
       
   id = htons(dsi_serverID(dsi));
index 309a28c5c366d30c4b45a1c11cb58938984907f6..9f1ff38ee4d9b6f78fdf60156e404e85826daaa1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_init.c,v 1.5 2005-05-03 14:55:15 didg Exp $
+ * $Id: dsi_init.c,v 1.6 2009-10-22 04:59:50 didg Exp $
  *
  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -33,7 +33,6 @@ DSI *dsi_init(const dsi_proto protocol, const char *program,
     sigemptyset(&dsi->sigblockset);
     sigaddset(&dsi->sigblockset, SIGTERM);
     sigaddset(&dsi->sigblockset, SIGHUP);
-    sigaddset(&dsi->sigblockset, SIGALRM);
     sigaddset(&dsi->sigblockset, SIGUSR1);
     /* always block SIGUSR2 even if SERVERTEXT is not defined */
     sigaddset(&dsi->sigblockset, SIGUSR2);
index 5c00504fcda64b159af85936da6564446429da06..cd004dbca8e3056f26cd1764b94cbe80888fbdfb 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_read.c,v 1.5 2009-10-20 04:53:19 didg Exp $
+ * $Id: dsi_read.c,v 1.6 2009-10-22 04:59:50 didg Exp $
  *
  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -45,6 +45,7 @@ ssize_t dsi_readinit(DSI *dsi, void *buf, const size_t buflen,
 
   sigprocmask(SIG_BLOCK, &dsi->sigblockset, &dsi->oldset);
   dsi->sigblocked = 1;
+  dsi->in_write++;
   if (dsi_stream_send(dsi, buf, buflen)) {
     dsi->datasize = size - buflen;
     return min(dsi->datasize, buflen);
@@ -57,6 +58,7 @@ void dsi_readdone(DSI *dsi)
 {
   sigprocmask(SIG_SETMASK, &dsi->oldset, NULL);
   dsi->sigblocked = 0;
+  dsi->in_write--;
 }
 
 /* */
index 028364fadbb1685a8bc9ef45eaa32785bbb66796..872ea1877af716610af35a1a2be70f90cf7a9328 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_stream.c,v 1.14 2009-10-19 11:01:51 didg Exp $
+ * $Id: dsi_stream.c,v 1.15 2009-10-22 04:59:50 didg Exp $
  *
  * Copyright (c) 1998 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -134,6 +134,7 @@ size_t dsi_stream_write(DSI *dsi, void *data, const size_t length, int mode _U_)
   }
 #endif
   
+  dsi->in_write++;
   written = 0;
   while (written < length) {
     if ((-1 == (len = send(dsi->socket, (u_int8_t *) data + written,
@@ -160,6 +161,7 @@ size_t dsi_stream_write(DSI *dsi, void *data, const size_t length, int mode _U_)
   }
 
   dsi->write_count += written;
+  dsi->in_write--;
   return written;
 }
 
@@ -266,6 +268,7 @@ void dsi_sleep(DSI *dsi, const int state)
 */
 static void block_sig(DSI *dsi)
 {
+  dsi->in_write++;
   if (!dsi->sigblocked) sigprocmask(SIG_BLOCK, &dsi->sigblockset, &dsi->oldset);
 }
 
@@ -273,6 +276,7 @@ static void block_sig(DSI *dsi)
 */
 static void unblock_sig(DSI *dsi)
 {
+  dsi->in_write--;
   if (!dsi->sigblocked) sigprocmask(SIG_SETMASK, &dsi->oldset, NULL);
 }
 
index 98606d4017cb61d8945b91b91b5c2415087b4e51..5b5c7e7b7409c0f097fdba688b6d70f7d68f65ce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_tickle.c,v 1.6 2005-04-28 20:50:02 bfernhomberg Exp $
+ * $Id: dsi_tickle.c,v 1.7 2009-10-22 04:59:50 didg Exp $
  *
  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -27,7 +27,7 @@ int dsi_tickle(DSI *dsi)
   u_int16_t id;
   int ret;
   
-  if (dsi->asleep)
+  if (dsi->asleep || dsi->in_write)
       return 1;
 
   id = htons(dsi_serverID(dsi));