/* @(#)lock.c	1.2 */#include "sys/param.h"#include "sys/types.h"#include "sys/mmu.h"#include "sys/proc.h"#include "sys/dir.h"#include "sys/signal.h"#include "sys/user.h"#include "sys/errno.h"#include "sys/text.h"#include "sys/lock.h"lock(){	struct a {		long oper;	};	if (!suser())		return;	switch(((struct a *)u.u_ap)->oper) {	case TXTLOCK:		if ((u.u_lock&(PROCLOCK|TXTLOCK)) || textlock() == 0)			goto bad;		break;	case PROCLOCK:		if (u.u_lock&(PROCLOCK|TXTLOCK))			goto bad;		(void) textlock();		proclock();		break;	case DATLOCK:		if (u.u_lock&(PROCLOCK|DATLOCK))			goto bad;		u.u_lock |= DATLOCK;	/* NOP for VAX */		break;	case UNLOCK:		if (punlock() == 0)			goto bad;		break;	default:bad:		u.u_error = EINVAL;	}}textlock(){	if (u.u_procp->p_textp == NULL)		return(0);	u.u_lock |= TXTLOCK;	return(1);}		tunlock(){	if (u.u_procp->p_textp == NULL || (u.u_lock&TXTLOCK) == 0)		return;	u.u_lock &= ~TXTLOCK;}proclock(){	u.u_procp->p_flag |= SSYS;	u.u_lock |= PROCLOCK;}punlock(){	if ((u.u_lock&(PROCLOCK|TXTLOCK|DATLOCK)) == 0)		return(0);	u.u_procp->p_flag &= ~SSYS;	u.u_lock &= ~PROCLOCK;	u.u_lock &= ~DATLOCK;	tunlock();	return(1);}