|
|
BSD 4.3
# include <useful.h>
# include <signal.h>
# include <sccs.h>
SCCSID(@(#)rub.c 8.1 12/31/84)
/*
** RUB -- handle interrupt signals
**
** This routine arranges to handle the interrupt signal
** on behalf of the CM. It sends SYNC blocks to everyone
** who ought to get them, and arranges to ignore all
** blocks except SYNC (and RESET) blocks from everyone
** who will be sending one. It also calls all of the
** interrupt functions for all active modules. It does
** this after writing all of the sync blocks, so an
** interrupt function can safely issue a query if it
** wants. It then does a non-local goto to the top of
** the main loop.
**
** Parameters:
** none
**
** Returns:
** non-local
**
** Side Effects:
** Proc_name gets set to the CM name.
** Interrupt functions for all active modules
** are invoked.
** The 'Syncs' vector is updated appropriately.
** SYNC blocks are sent to all adjacent processes.
**
** Called By:
** System, via 'signal' (section 2).
**
** Trace Flags:
** none
*/
int RubLevel; /* depth of ruboff calls, -1 if off */
char *RubWhy; /* why are interrupts disabled */
int RubGot; /* set if we have an unprocessed interrupt */
rubcatch()
{
/* ignore interrupts while we are processing */
signal(SIGINT, SIG_IGN);
/* find out if we are allowing interrupts */
if (RubLevel < 0)
syserr("bad SIGINT");
else if (RubLevel > 0)
{
/* save interrupt for later processing */
RubGot++;
if (RubWhy != NULL)
printf("Rubout locked out (%s in progress)\n", RubWhy);
}
else
{
/* do other processing (either from ctlmod or standalones) */
rubproc();
syserr("rubcatch: rubproc");
}
}
/*
** TURN RUBOUTS OFF
**
** Further rubouts will be caught by rubsave.
** The parameter should be the name of the processor which
** insists that rubouts do not occur.
*/
ruboff(why)
char *why;
{
/* check to see if this should be ignored */
if (RubLevel < 0 || RubLevel++ > 0)
return;
/* set up to ignore interrupts */
RubGot = 0;
RubWhy = why;
}
/*
** TURN RUBOUTS BACK ON
**
** Rubout processing is restored to the norm (calling rubcatch).
** If any rubouts have occured while disabled, they are processed
** now.
*/
rubon()
{
/* check to see if we should leave as-is */
if (RubLevel < 0 || --RubLevel > 0)
return;
/* process any old interrupts */
if (RubGot > 0)
rubcatch();
/* reset state */
RubWhy = NULL;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.