summaryrefslogtreecommitdiff
path: root/server/subscr.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/subscr.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/subscr.c')
-rw-r--r--server/subscr.c107
1 files changed, 22 insertions, 85 deletions
diff --git a/server/subscr.c b/server/subscr.c
index 790e8f5..cb2b110 100644
--- a/server/subscr.c
+++ b/server/subscr.c
@@ -162,20 +162,11 @@ subscr_subscribe_real(who, newsubs, notice)
ZSTRING *sender;
ZSubscr_t *subs2, *subs3, *subs;
int relation;
-#ifdef POSIX
- sigset_t mask, omask;
-#else
- int omask;
-#endif
sender = make_zstring(notice->z_sender,0);
-#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;
+
for (subs = newsubs->q_forw;
subs != newsubs;
subs = subs->q_forw) {
@@ -245,11 +236,7 @@ subscr_subscribe_real(who, newsubs, notice)
if (!(subs3 = (ZSubscr_t *) xmalloc(sizeof(ZSubscr_t)))) {
free_subscriptions(newsubs);
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+ END_CRITICAL_CODE;
return(ENOMEM);
}
@@ -263,11 +250,7 @@ subscr_subscribe_real(who, newsubs, notice)
if ((retval = class_register(who, subs)) != ZERR_NONE) {
xfree(subs3);
free_subscriptions(newsubs);
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+ END_CRITICAL_CODE;
return(retval);
}
@@ -276,11 +259,8 @@ subscr_subscribe_real(who, newsubs, notice)
duplicate:
;
}
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+
+ END_CRITICAL_CODE;
free_subscriptions(newsubs);
return(ZERR_NONE);
@@ -430,11 +410,6 @@ subscr_cancel(sin, notice)
Code_t retval;
int found = 0;
int relation;
-#ifdef POSIX
- sigset_t mask, omask;
-#else
- int omask;
-#endif
#if 0
zdbug((LOG_DEBUG,"subscr_cancel"));
@@ -448,14 +423,8 @@ subscr_cancel(sin, notice)
if (!(subs = extract_subscriptions(notice)))
return(ZERR_NONE); /* no subscr -> no error */
-
-#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;
+
for (subs4 = subs->q_forw; subs4 != subs; subs4 = subs4->q_forw) {
for (subs2 = who->zct_subs->q_forw;
subs2 != who->zct_subs;) {
@@ -493,20 +462,13 @@ subscr_cancel(sin, notice)
subs2 = subs2->q_forw)
if ((retval = class_register(who, subs2)) != ZERR_NONE) {
free_subscriptions(subs);
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+ END_CRITICAL_CODE;
return(retval);
}
}
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+ END_CRITICAL_CODE;
+
free_subscriptions(subs);
if (found) {
#if 0
@@ -530,11 +492,6 @@ subscr_cancel_client(client)
ZClient_t *client;
{
register ZSubscr_t *subs;
-#ifdef POSIX
- sigset_t mask, omask;
-#else
- int omask;
-#endif
#if 0
zdbug((LOG_DEBUG,"subscr_cancel_client %s",
@@ -542,14 +499,9 @@ subscr_cancel_client(client)
#endif
if (!client->zct_subs)
return;
-
-#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;
+
for (subs = client->zct_subs->q_forw;
subs != client->zct_subs;
subs = client->zct_subs->q_forw) {
@@ -577,11 +529,8 @@ subscr_cancel_client(client)
xfree(subs);
client->zct_subs = NULLZST;
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+ END_CRITICAL_CODE;
+
return;
}
@@ -597,32 +546,20 @@ struct in_addr *addr;
{
register ZHostList_t *hosts;
register ZClientList_t *clist = NULLZCLT, *clt;
-#ifdef POSIX
- sigset_t mask, omask;
-#else
- int omask;
-#endif
/* find the host */
if (!(hosts = hostm_find_host(addr)))
return(ZSRV_HNOTFOUND);
clist = hosts->zh_clients;
-#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;
+
/* flush each one */
for (clt = clist->q_forw; clt != clist; clt = clt->q_forw)
(void) subscr_cancel_client(clt->zclt_client);
-#ifdef POSIX
- (void) sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
-#else
- (void) sigsetmask(omask);
-#endif
+
+ END_CRITICAL_CODE;
+
return(ZERR_NONE);
}
#endif