This commit is contained in:
Oliver Lehmann 1989-06-12 09:55:16 +00:00
parent 0620b914e8
commit 75340b93d0
1 changed files with 69 additions and 0 deletions

View File

@ -0,0 +1,69 @@
# include <stdio.h>
# include "gen.h"
# include "../h/dbs.h"
# include "../h/pipes.h"
# include "IIglobals.h"
extern exit();
int (*IIinterrupt)() = exit;
/*
** RESYNCHRONIZE PIPES AFTER AN INTERRUPT
**
** The pipes are all cleared out. This routines must be called
** by all processes in the system simultaneously. It should be
** called from the interrupt catching routine.
*/
IIresync()
{
register struct pipfrmt *pbuf;
struct pipfrmt buf;
signal(2, (int (*)()) 1);
signal(3, (int (*)()) 1);
pbuf = &buf;
IIwrpipe(P_PRIME, pbuf);
/* write the sync block out */
IIwrpipe(P_INT, pbuf, IIw_down);
/* read the sync block back on both pipes */
/* must be in right order */
IIrdpipe(P_INT, pbuf, IIr_front);
IIrdpipe(P_INT, pbuf, IIr_down);
/* flush remaining old data from buffer */
IIrdpipe(P_PRIME, &IIeinpipe);
/* Get out of a retrieve and clear errors */
IIin_retrieve = 0;
IIerrflag = 0;
IIndoms = IIdoms = 0;
/* reset the signal */
signal(2, IIresync);
signal(3, IIresync);
/* allow the user to service the interrupt */
(*IIinterrupt)(-1);
/*
** If IIinterupt returns the user might hang in a retrieve
*/
IIsyserr("RESYNC: Interupt returned");
}
# ifdef P8000
# include <setret.h>
extern ret_buf IIjmp_buf;
# define setexit() setret(IIjmp_buf)
# define reset() longret(IIjmp_buf, 1)
# else
# include <setjmp.h>
extern jmp_buf IIjmp_buf;
# define setexit() setjmp(IIjmp_buf)
# define reset() longjmp(IIjmp_buf, 1)
# endif
int IIreset() { reset(); }
int IIsetexit() { setexit(); }