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;
/*
- * $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.
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));
/*
- * $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.
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);
/*
- * $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.
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);
{
sigprocmask(SIG_SETMASK, &dsi->oldset, NULL);
dsi->sigblocked = 0;
+ dsi->in_write--;
}
/* */
/*
- * $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.
}
#endif
+ dsi->in_write++;
written = 0;
while (written < length) {
if ((-1 == (len = send(dsi->socket, (u_int8_t *) data + written,
}
dsi->write_count += written;
+ dsi->in_write--;
return written;
}
*/
static void block_sig(DSI *dsi)
{
+ dsi->in_write++;
if (!dsi->sigblocked) sigprocmask(SIG_BLOCK, &dsi->sigblockset, &dsi->oldset);
}
*/
static void unblock_sig(DSI *dsi)
{
+ dsi->in_write--;
if (!dsi->sigblocked) sigprocmask(SIG_SETMASK, &dsi->oldset, NULL);
}
/*
- * $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.
u_int16_t id;
int ret;
- if (dsi->asleep)
+ if (dsi->asleep || dsi->in_write)
return 1;
id = htons(dsi_serverID(dsi));