DataMuseum.dk

Presents historical artifacts from the history of:

Commodore CBM-900

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Commodore CBM-900

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦e3d5e6fde⟧ TextFile

    Length: 3477 (0xd95)
    Types: TextFile
    Notes: UNIX file
    Names: »pipe.c«

Derivation

└─⟦f27320a65⟧ Bits:30001972 Commodore 900 hard disk image with partial source code
    └─⟦2d53db1df⟧ UNIX V7 Filesystem
        └─ ⟦this⟧ »sys/coh/pipe.c« 

TextFile

/* (-lgl
 * 	The information contained herein is a trade secret of Mark Williams
 * 	Company, and  is confidential information.  It is provided  under a
 * 	license agreement,  and may be  copied or disclosed  only under the
 * 	terms of  that agreement.  Any  reproduction or disclosure  of this
 * 	material without the express written authorization of Mark Williams
 * 	Company or persuant to the license agreement is unlawful.
 * 
 * 	COHERENT Version 0.7.3
 * 	Copyright (c) 1982, 1983, 1984.
 * 	An unpublished work by Mark Williams Company, Chicago.
 * 	All rights reserved.
 -lgl) */
/*
 * Coherent.
 * Pipes.
 */
#include <coherent.h>
#include <errno.h>
#include <filsys.h>
#include <ino.h>
#include <inode.h>
#include <io.h>
#include <proc.h>
#include <sched.h>
#include <signal.h>
#include <uproc.h>

/*
 * Create and return a locked pipe inode.  This is called from the
 * pipe system call.
 */
INODE *
pmake(mode)
{
	register INODE *ip;

	if ((ip=ialloc(pipedev, IFPIPE|mode)) != NULL) {
		iclear(ip);
		ip->i_a.i_pnc = 0;
		ip->i_a.i_prx = 0;
		ip->i_a.i_pwx = 0;
	}
	return (ip);
}

/*
 * Open a pipe given the inode pointer.
 */
popen(ip, mode)
{
}

/*
 * Close a pipe inode.
 */
pclose(ip)
register INODE *ip;
{
	if (ip->i_refc == 2) {
		pevent(ip);
		ip->i_flag |= IFEOF;
	}
}

/*
 * Only one end of the pipe is going to be left.
 */
pevent(ip)
register INODE *ip;
{
	if ((ip->i_flag&IFWFR) != 0) {
		ip->i_flag &= ~IFWFR;
		wakeup((char *)&ip->i_a.i_pwx);
	}
	if ((ip->i_flag&IFWFW) != 0) {
		ip->i_flag &= ~IFWFW;
		wakeup((char *)&ip->i_a.i_prx);
	}
}

/*
 * Read from a pipe.  The given inode is locked.
 */
pread(ip, iop)
register INODE *ip;
register IO *iop;
{
	register unsigned n;
	register unsigned ioc;

	while (ip->i_a.i_pnc == 0) {
		if ((ip->i_flag&IFEOF) != 0) {
			ip->i_flag &= ~IFEOF;
			break;
		}
		if (ip->i_nlink==0 && ip->i_refc<2)
			break;
		ip->i_flag |= IFWFW;
		iunlock(ip);
		sleep((char *)&ip->i_a.i_prx, CVPIPE, IVPIPE, SVPIPE);
		ilock(ip);
	}
	if ((ip->i_flag&IFEOF)!=0 && ip->i_a.i_pnc==0)
		ip->i_flag &= ~IFEOF;
	ioc = iop->io_ioc;
	while (u.u_error==0 && ioc>0 && ip->i_a.i_pnc>0) {
		if ((n=PIPSIZE-ip->i_a.i_prx) > ioc)
			n = ioc;
		if (n > ip->i_a.i_pnc)
			n = ip->i_a.i_pnc;
		iop->io_ioc = n;
		iop->io_seek = ip->i_a.i_prx;
		fread(ip, iop);
		n -= iop->io_ioc;
		if ((ip->i_a.i_prx+=n) == PIPSIZE)
			ip->i_a.i_prx = 0;
		ip->i_a.i_pnc -= n;
		ioc -= n;
	}
	iop->io_ioc = ioc;
	if ((ip->i_flag&IFWFR)!=0 && ip->i_a.i_pnc<PIPSIZE) {
		ip->i_flag &= ~IFWFR;
		wakeup((char *)&ip->i_a.i_pwx);
	}
}

/*
 * Write to a pipe.  The given inode is locked.
 */
pwrite(ip, iop)
register INODE *ip;
register IO *iop;
{
	register unsigned n;
	register unsigned ioc;

	ioc = iop->io_ioc;
	while (u.u_error==0 && ioc>0) {
		if (ip->i_refc<2 && ip->i_nlink==0) {
			u.u_error = EPIPE;
			sendsig(SIGPIPE, SELF);
			return;
		}
		if ((n=PIPSIZE-ip->i_a.i_pwx) > ioc)
			n = ioc;
		if (n > PIPSIZE-ip->i_a.i_pnc)
			n = PIPSIZE - ip->i_a.i_pnc;
		if (n==0 || (ip->i_flag&IFEOF)!=0) {
			ip->i_flag |= IFWFR;
			iunlock(ip);
			sleep((char *)&ip->i_a.i_pwx, CVPIPE, IVPIPE, SVPIPE);
			ilock(ip);
			continue;
		}
		iop->io_ioc = n;
		iop->io_seek = ip->i_a.i_pwx;
		fwrite(ip, iop);
		n -= iop->io_ioc;
		if ((ip->i_a.i_pwx+=n) == PIPSIZE)
			ip->i_a.i_pwx = 0;
		ip->i_a.i_pnc += n;
		ioc -= n;
		if ((ip->i_flag&IFWFW) && ip->i_a.i_pnc>0) {
			ip->i_flag &= ~IFWFW;
			wakeup((char *)&ip->i_a.i_prx);
		}
	}
	iop->io_ioc = ioc;
}