|
|
DataMuseum.dkPresents historical artifacts from the history of: Regnecentalen RC-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Regnecentalen RC-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T U s
Length: 13953 (0x3681)
Types: TextFile
Notes: UNIX file
Names: »stream.h«
└─⟦a6ab2eb36⟧ Bits:30004042/kconfig3.imd SW95705I 386/ix Multi-user Release 1.2
└─⟦a6ab2eb36⟧ UNIX Filesystem
└─⟦this⟧ »kc/new/usr/include/sys/stream.h«
/* Copyright (c) 1984 AT&T */
/* All Rights Reserved */
/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
/* The copyright notice above does not evidence any */
/* actual or intended publication of such source code. */
#ident "@(#)stream.h 1.5"
/*
* data queue
*/
struct queue {
struct qinit *q_qinfo; /* procs and limits for queue */
struct msgb *q_first; /* first data block */
struct msgb *q_last; /* last data block */
struct queue *q_next; /* Q of next stream */
struct queue *q_link; /* to next Q for scheduling */
caddr_t q_ptr; /* to private data structure */
ushort q_count; /* number of blocks on Q */
ushort q_flag; /* queue state */
short q_minpsz; /* min packet size accepted by this module */
short q_maxpsz; /* max packet size accepted by this module */
ushort q_hiwat; /* queue high water mark */
ushort q_lowat; /* queue low water mark */
};
typedef struct queue queue_t;
/*
* Queue flags
*/
#define QENAB 01 /* Queue is already enabled to run */
#define QWANTR 02 /* Someone wants to read Q */
#define QWANTW 04 /* Someone wants to write Q */
#define QFULL 010 /* Q is considered full */
#define QREADR 020 /* This is the reader (first) Q */
#define QUSE 040 /* This queue in use (allocation) */
#define QNOENB 0100 /* Don't enable Q via putq */
/*
* module information structure
*/
struct module_info {
ushort mi_idnum; /* module id number */
char *mi_idname; /* module name */
short mi_minpsz; /* min packet size accepted */
short mi_maxpsz; /* max packet size accepted */
ushort mi_hiwat; /* hi-water mark */
ushort mi_lowat; /* lo-water mark */
};
/*
* queue information structure
*/
struct qinit {
int (*qi_putp)(); /* put procedure */
int (*qi_srvp)(); /* service procedure */
int (*qi_qopen)(); /* called on startup */
int (*qi_qclose)(); /* called on finish */
int (*qi_qadmin)(); /* for 3bnet only */
struct module_info *qi_minfo; /* module information structure */
struct module_stat *qi_mstat; /* module statistics structure */
};
/*
* Streamtab (used in cdevsw and fmodsw to point to module or driver)
*/
struct streamtab {
struct qinit *st_rdinit;
struct qinit *st_wrinit;
struct qinit *st_muxrinit;
struct qinit *st_muxwinit;
};
/*
* Header for a stream: interface to rest of system
*/
struct stdata {
struct queue *sd_wrq; /* write queue */
struct msgb *sd_iocblk; /* return block for ioctl */
struct inode *sd_inode; /* backptr, for hangups */
struct streamtab *sd_strtab; /* pointer to streamtab for stream */
long sd_flag; /* state/flags */
long sd_iocid; /* ioctl id */
ushort sd_iocwait; /* count of procs waiting to do ioctl */
short sd_pgrp; /* process group, for signals */
ushort sd_wroff; /* write offset */
unsigned char sd_error; /* hangup or error to set u.u_error */
int sd_pushcnt; /* number of pushes done on stream */
struct strevent *sd_siglist; /* pid linked list to rcv SIGPOLL sig */
struct strevent *sd_pollist; /* pid linked list to wakeup poll() */
int sd_sigflags; /* logical OR of all siglist events */
int sd_pollflags; /* logical OR of all sellist events */
};
/*
* stdata flag field defines
*/
#define IOCWAIT 01 /* Someone wants to do ioctl */
#define RSLEEP 02 /* Someone wants to read/recv msg */
#define WSLEEP 04 /* Someone wants to write */
#define STRPRI 010 /* An M_PCPROTO is at stream head */
#define STRHUP 020 /* Device has vanished */
#define STWOPEN 040 /* waiting for 1st open */
#define STPLEX 0100 /* stream is being multiplexed */
#define CTTYFLG 0200 /* used of finding control tty */
#define RMSGDIS 0400 /* read msg discard */
#define RMSGNODIS 01000 /* read msg no discard */
#define STRERR 02000 /* fatal error from M_ERROR */
#define STRTIME 04000 /* used with timeout strtime */
#define STR2TIME 010000 /* used with timeout str2time */
#define STR3TIME 020000 /* used with timeout str3time */
/*
* structure for storing triples of mux'ed streams
*/
struct linkblk {
queue_t *l_qtop; /* lowest level write queue of upper stream */
queue_t *l_qbot; /* highest level write queue of lower stream */
int l_index; /* file[] index for lower stream. */
};
/*
* Structure of list of processes to be sent SIGSEL signal
* on request, or for processes sleeping on select(). The valid
* SIGSEL events are defined in stropts.h, and the valid select()
* events are defined in select.h.
*/
struct strevent {
union {
struct {
struct proc *procp;
long events;
} e;
struct {
int (*func)();
long arg;
} b;
} x;
struct strevent *se_next;
};
#define se_procp x.e.procp
#define se_events x.e.events
#define se_func x.b.func
#define se_arg x.b.arg
#define SE_SLEEP 0 /* ok to sleep in allocation */
#define SE_NOSLP 1 /* don't sleep in allocation */
/*
* Data block descriptor
*/
struct datab {
struct datab *db_freep;
unsigned char *db_base;
unsigned char *db_lim;
unsigned char db_ref;
unsigned char db_type;
unsigned char db_class;
};
/*
* Message block descriptor
*/
struct msgb {
struct msgb *b_next;
struct msgb *b_prev;
struct msgb *b_cont;
unsigned char *b_rptr;
unsigned char *b_wptr;
struct datab *b_datap;
};
typedef struct msgb mblk_t;
typedef struct datab dblk_t;
/*
* Data block allocation information. Defines cutoffs for allocation
* priorities; bufcall lists.
*/
struct dbalcst {
int dba_cnt;
int dba_lo;
int dba_med;
struct strevent *dba_lop;
struct strevent *dba_medp;
struct strevent *dba_hip;
};
/********************************************************************************/
/* Streams message types */
/********************************************************************************/
/*
* Data and protocol messages (regular priority)
*/
#define M_DATA 00 /* regular data */
#define M_PROTO 01 /* protocol control */
/*
* Control messages (regular priority)
*/
#define M_BREAK 010 /* line break */
#define M_PASSFP 011 /* pass file pointer */
#define M_SIG 013 /* generate process signal */
#define M_DELAY 014 /* real-time xmit delay (1 param) */
#define M_CTL 015 /* device-specific control message */
#define M_IOCTL 016 /* ioctl; set/get params */
#define M_SETOPTS 020 /* set various stream head options */
/*
* Control messages (high priority; go to head of queue)
*/
#define M_IOCACK 0201 /* acknowledge ioctl */
#define M_IOCNAK 0202 /* negative ioctl acknowledge */
#define M_PCPROTO 0203 /* priority proto message */
#define M_PCSIG 0204 /* generate process signal */
#define M_FLUSH 0206 /* flush your queues */
#define M_STOP 0207 /* stop transmission immediately */
#define M_START 0210 /* restart transmission after stop */
#define M_HANGUP 0211 /* line disconnect */
#define M_ERROR 0212 /* fatal error used to set u.u_error */
/*
* Queue message class definitions.
*/
#define QNORM 0 /* normal messages */
#define QPCTL 0200 /* priority cntrl messages */
/*
* IOCTL structure - this structure is the format of the M_IOCTL message type.
*/
struct iocblk {
int ioc_cmd; /* ioctl command type */
ushort ioc_uid; /* effective uid of user */
ushort ioc_gid; /* effective gid of user */
uint ioc_id; /* ioctl id */
uint ioc_count; /* count of bytes in data field */
int ioc_error; /* error code */
int ioc_rval; /* return value */
};
/*
* Options structure for M_SETOPTS message. This is sent upstream
* by driver to set stream head options.
*/
struct stroptions {
short so_flags; /* options to set */
short so_readopt; /* read option */
ushort so_wroff; /* write offset */
short so_minpsz; /* minimum read packet size */
short so_maxpsz; /* maximum read packet size */
ushort so_hiwat; /* read queue high water mark */
ushort so_lowat; /* read queue low water mark */
};
/* flags for stream options set message */
#define SO_ALL 077 /* set all options */
#define SO_READOPT 01 /* set read opttion */
#define SO_WROFF 02 /* set write offset */
#define SO_MINPSZ 04 /* set min packet size */
#define SO_MAXPSZ 010 /* set max packet size */
#define SO_HIWAT 020 /* set high water mark */
#define SO_LOWAT 040 /* set low water mark */
/********************************************************************************/
/* Miscellaneous parameters and flags */
/********************************************************************************/
/*
* Default timeout in seconds for ioctls and close
*/
#define STRTIMOUT 15
/*
* Stream head default high/low water marks
*/
#define STRHIGH 5120
#define STRLOW 1024
/*
* flag values for stream io waiting procedure (strwaitq)
*/
#define WRITEWAIT 0x1 /* waiting for write event */
#define READWAIT 0x2 /* waiting for read event */
#define NOINTR 0x4 /* error is not to be set for signal */
/*
* sleep priorities for stream io
*/
#define STIPRI PZERO+3
#define STOPRI PZERO+3
/*
* Block allocation parameters
*/
#define NCLASS 9 /* number of block classes */
#define QBSIZE 65 /* min size for block allocation retries */
#define MAXBSIZE 4096 /* max block size */
#define MAXIOCBSZ 1024 /* max ioctl data block size */
/*
* Copy modes for tty and I_STR ioctls
*/
#define U_TO_K 01 /* User to Kernel */
#define K_TO_K 02 /* Kernel to Kernel */
/*
* Values for stream flag in open to indicate module open, clone open;
* return value for failure.
*/
#define MODOPEN 0x1 /* open as a module */
#define CLONEOPEN 0x2 /* open for clone, pick own minor device */
#define OPENFAIL -1 /* returned for open failure */
/*
* Priority definitions for block allocation.
*/
#define BPRI_LO 1
#define BPRI_MED 2
#define BPRI_HI 3
/*
* Value for packet size that denotes infinity
*/
#define INFPSZ -1
/*
* Flags for flushq()
*/
#define FLUSHALL 1 /* flush all messages */
#define FLUSHDATA 0 /* don't flush control messages */
/************************************************************************/
/* Defintions of Streams macros and function interfaces. */
/************************************************************************/
/*
* determine block allocation cutoff for given class and priority.
*/
#define bcmax(class, pri) ( (pri) == BPRI_LO ? dballoc[class].dba_lo : \
((pri) == BPRI_HI ? nmblock : dballoc[class].dba_med))
/*
* Queue scheduling macros
*/
#define setqsched() qrunflag = 1 /* set up queue scheduler */
#define qready() qrunflag /* test if queues are ready to run */
/*
* Definition of spl function needed to provide critical region protection
* for streams drivers and modules.
*/
#if u3b2 | i386
#define splstr() spltty()
#else
#define splstr() spl5()
#endif
/*
* noenable - set queue so that putq() will not enable it.
* enableok - set queue so that putq() can enable it.
* canenable - check if queue can be enabled by putq().
*/
#define noenable(q) (q)->q_flag |= QNOENB
#define enableok(q) (q)->q_flag &= ~QNOENB
#define canenable(q) !((q)->q_flag & QNOENB)
/*
* Finding related queues
*/
#define OTHERQ(q) ((q)->q_flag&QREADR? (q)+1: (q)-1)
#define WR(q) (q+1)
#define RD(q) (q-1)
/*
* put a message of the next queue of the given queue
*/
#define putnext(q, mp) ((*q->q_next->q_qinfo->qi_putp)(q->q_next, mp))
/*
* free a queue pair
*/
#define freeq(q) ((q)->q_flag = WR(q)->q_flag = 0)
/*
* Test if data block type is one of the data messages (i.e. not a control
* message).
*/
#define datamsg(type) (type == M_DATA || type == M_PROTO || type == M_PCPROTO)
/*
* extract queue class of message block
*/
#define queclass(bp) (bp->b_datap->db_type & QPCTL)
/*
* Align address on next lower word boundary
*/
#define straln(a) (caddr_t)((long)(a) & ~(sizeof(int)-1))
/*
* Copy data from one data buffer to another.
* The addresses must be word aligned - if not, use bcopy!
*/
#ifdef u3b2
/*
* Use the MOVBLW instruction on the 3b2.
*/
asm void
strbcpy(s, d, c)
{
%mem s,d,c;
MOVW s,%r0
MOVW d,%r1
MOVW c,%r2
ADDW2 &3,%r2
LRSW3 &2,%r2,%r2
MOVBLW
}
#else
#define strbcpy(s, d, c) bcopy(s, d, c)
#endif
/*
* declarations of common routines
*/
extern mblk_t *rmvb();
extern mblk_t *dupmsg();
extern mblk_t *copymsg();
extern mblk_t *allocb();
extern mblk_t *unlinkb();
extern mblk_t *dupb();
extern mblk_t *copyb();
extern mblk_t *getq();
extern int putq();
extern queue_t *backq();
extern queue_t *allocq();
extern int qenable();
extern mblk_t *unlinkb();
extern mblk_t *unlinkmsg();
extern int pullupmsg();
extern int adjmsg();
extern struct queue *getendq();
extern struct linkblk *findlinks();
extern struct file *getf();
extern struct strevent *sealloc();
extern int sefree();
/*
* shared or externally configured data structures
*/
extern struct stdata streams[]; /* table of streams */
extern queue_t queue[]; /* table of queues */
extern mblk_t mblock[]; /* table of msg blk desc */
extern dblk_t dblock[]; /* table of data blk desc */
extern ushort rbsize[]; /* map of class to real block size */
extern struct linkblk linkblk[]; /* multiplexor link table */
extern struct strevent strevent[]; /* table of stream event cells */
extern struct strstat strst; /* Streams statistics structure */
extern queue_t *qhead; /* head of runnable queue list */
extern queue_t *qtail; /* tail of runnable queue list */
extern int strmsgsz; /* maximum stream message size */
extern int strctlsz; /* maximum size of ctl part of message */
extern int nmblock; /* number of msg blk desc */
extern int nmuxlink; /* number of multiplexor links */
extern int nstrpush; /* maxmimum number of pushes allowed */
extern int nstrevent; /* initial number of stream event cells */
extern int maxsepgcnt; /* page limit for event cell allocation */
extern int pollwait; /* poll sleeps on &pollwait */
extern char qrunflag; /* set if there are queues to run */
extern char queueflag; /* set iff inside queuerun() */