summaryrefslogtreecommitdiff
path: root/server/client.c
diff options
context:
space:
mode:
authorGravatar Richard Basch <probe@mit.edu>1994-08-01 04:42:17 +0000
committerGravatar Richard Basch <probe@mit.edu>1994-08-01 04:42:17 +0000
commit0398e01a5032434abef05a26e2f9eeb058fecb31 (patch)
tree33357d7224ffe50ca69fae66053d80df4a150510 /server/client.c
parent6c547bc312ef528815040e42ca5e80233ff98265 (diff)
Don't do signal blocking; simply set a semaphore flag indicating it is
in critical code, and let the main loop deal with the flag being set. This saves on context switches into the kernel for this rare condition.
Diffstat (limited to 'server/client.c')
-rw-r--r--server/client.c38
1 files changed, 7 insertions, 31 deletions
diff --git a/server/client.c b/server/client.c
index 1067ae7..c1b129c 100644
--- a/server/client.c
+++ b/server/client.c
@@ -65,11 +65,6 @@ client_register(notice, who, client, server, wantdefaults)
register ZHostList_t *hlp = server->zs_hosts;
register ZHostList_t *hlp2;
register ZClientList_t *clist;
-#ifdef POSIX
- sigset_t mask, omask;
-#else
- int omask;
-#endif
/* chain the client's host onto this server's host list */
@@ -129,19 +124,11 @@ client_register(notice, who, client, server, wantdefaults)
/* chain him in to the clients list in the host list*/
-#ifdef POSIX
- (void) sigemptyset(&mask);
- (void) sigaddset(&mask, SIGFPE);
- (void) sigprocmask(SIG_BLOCK, &mask, &omask);
-#else
- omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */
-#endif
+ START_CRITICAL_CODE;
+
xinsque(clist, hlp2->zh_clients);
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+
+ END_CRITICAL_CODE;
if (!server->zs_dumping && wantdefaults)
/* add default subscriptions only if this is not
@@ -165,14 +152,8 @@ client_deregister(client, host, flush)
int flush;
{
ZClientList_t *clients;
-#ifdef POSIX
- sigset_t mask, omask;
- (void) sigemptyset(&mask);
- (void) sigaddset(&mask, SIGFPE);
- (void) sigprocmask(SIG_BLOCK, &mask, &omask);
-#else
- int omask = sigblock(sigmask(SIGFPE)); /* don't let db dumps start */
-#endif
+
+ START_CRITICAL_CODE;
/* release any not-acked packets in the rexmit queue */
nack_release(client);
@@ -195,12 +176,7 @@ client_deregister(client, host, flush)
free_zstring(client->zct_principal);
xfree(client);
xfree(clients);
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask,
- (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+ END_CRITICAL_CODE;
return;
}
syslog(LOG_CRIT, "clt_dereg: clt not in host list");