From 12857f8fdde6f59eb8759b35d75e89c0dad8cfbe Mon Sep 17 00:00:00 2001 From: didg Date: Thu, 22 Oct 2009 04:59:50 +0000 Subject: [PATCH] remove the need for blocking SIGALRM (still need to deal with attention volumes changed) --- include/atalk/dsi.h | 6 +++++- libatalk/dsi/dsi_attn.c | 4 ++-- libatalk/dsi/dsi_init.c | 3 +-- libatalk/dsi/dsi_read.c | 4 +++- libatalk/dsi/dsi_stream.c | 6 +++++- libatalk/dsi/dsi_tickle.c | 4 ++-- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/include/atalk/dsi.h b/include/atalk/dsi.h index 91cee9ba..5053cb13 100644 --- a/include/atalk/dsi.h +++ b/include/atalk/dsi.h @@ -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; diff --git a/libatalk/dsi/dsi_attn.c b/libatalk/dsi/dsi_attn.c index 30ec736d..395ee1db 100644 --- a/libatalk/dsi/dsi_attn.c +++ b/libatalk/dsi/dsi_attn.c @@ -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)); diff --git a/libatalk/dsi/dsi_init.c b/libatalk/dsi/dsi_init.c index 309a28c5..9f1ff38e 100644 --- a/libatalk/dsi/dsi_init.c +++ b/libatalk/dsi/dsi_init.c @@ -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); diff --git a/libatalk/dsi/dsi_read.c b/libatalk/dsi/dsi_read.c index 5c00504f..cd004dbc 100644 --- a/libatalk/dsi/dsi_read.c +++ b/libatalk/dsi/dsi_read.c @@ -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--; } /* */ diff --git a/libatalk/dsi/dsi_stream.c b/libatalk/dsi/dsi_stream.c index 028364fa..872ea187 100644 --- a/libatalk/dsi/dsi_stream.c +++ b/libatalk/dsi/dsi_stream.c @@ -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); } diff --git a/libatalk/dsi/dsi_tickle.c b/libatalk/dsi/dsi_tickle.c index 98606d40..5b5c7e7b 100644 --- a/libatalk/dsi/dsi_tickle.c +++ b/libatalk/dsi/dsi_tickle.c @@ -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)); -- 2.39.2