Annotation of coherent/b/STREAMS/io.386/bufq.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * File:       bufq.c
                      3:  *
                      4:  * Purpose:
                      5:  *     Queueing routines for SCSI driver.
                      6:  *     Should be generalizable for other hard drives.
                      7:  *
                      8:  * $Log:       bufq.c,v $
                      9:  * Revision 2.2  93/07/26  15:28:01  nigel
                     10:  * Nigel's R80
                     11:  * 
                     12:  * Revision 1.1  93/04/14  10:10:07  root
                     13:  * r75
                     14:  * 
                     15:  * Revision 1.3  92/04/06  15:35:10  hal
                     16:  * *** empty log message ***
                     17:  * 
                     18:  * Revision 1.2  91/05/21  23:23:36  hal
                     19:  * Enhanced debug printout.
                     20:  * 
                     21:  * Revision 1.1  91/05/21  13:54:11  root
                     22:  * First running version.
                     23:  * 
                     24:  */
                     25: 
                     26: /*
                     27:  * Includes.
                     28:  */
                     29: #include <sys/coherent.h>
                     30: #include <sys/buf.h>
                     31: 
                     32: /*
                     33:  * Definitions.
                     34:  *     Constants.
                     35:  *     Macros with argument lists.
                     36:  *     Typedefs.
                     37:  *     Enums.
                     38:  */
                     39: typedef struct {
                     40:        BUF     * head; /* point to first node */
                     41:        BUF     * tail; /* point to last node */
                     42:        int     count;  /* number of nodes in the queue */
                     43: } bufq_type;
                     44: 
                     45: /*
                     46:  * Global Data.
                     47:  *     Import Variables.
                     48:  *     Export Variables.
                     49:  *     Local Variables.
                     50:  */
                     51: static int     num_q;          /* number of queues in use */
                     52: static bufq_type  * bufq_q;    /* pointer to allocated queue structs */
                     53: 
                     54: /*
                     55:  * Functions.
                     56:  *     Import Functions.
                     57:  *     Export Functions.
                     58:  *     Local Functions.
                     59:  */
                     60: int bufq_init();
                     61: void bufq_rlse();
                     62: void bufq_wr_tail();
                     63: BUF * bufq_rd_head();
                     64: BUF * bufq_rm_head();
                     65: 
                     66: /*
                     67:  * Debug macros.
                     68:  */
                     69: #if (DEBUG >= 3)
                     70: #define QSIZE  printf("Q%d:%d ", s_id, bqp->count)
                     71: #else
                     72: #if (DEBUG >= 2)
                     73: #define QSIZE  {if (bqp->count>1)printf("Q%d:%d ", s_id, bqp->count);}
                     74: #else
                     75: #define QSIZE
                     76: #endif
                     77: #endif
                     78: 
                     79: /*
                     80:  * bufq_init()
                     81:  *
                     82:  * Set up the desired number of queues.
                     83:  *
                     84:  * Return 1 if ok, 0 if kalloc() failed.
                     85:  */
                     86: int bufq_init(qcount)
                     87: int qcount;
                     88: {
                     89:        int ret;
                     90: 
                     91:        if (qcount > 0 && (bufq_q = kalloc(qcount*sizeof(bufq_type)))) {
                     92:                ret = 1;
                     93:                kclear(bufq_q, qcount*sizeof(bufq_type));
                     94:                num_q = qcount;
                     95: #if (DEBUG >= 2)
                     96: printf("%d queues allocated\n", qcount);
                     97: #endif
                     98:        } else
                     99:                ret = 0;
                    100: 
                    101:        return ret;
                    102: }
                    103: 
                    104: /*
                    105:  * bufq_rlse()
                    106:  *
                    107:  * Deallocate buffer queue structs.
                    108:  */
                    109: void bufq_rlse()
                    110: {
                    111:        num_q = 0;
                    112:        if (bufq_q)
                    113:                kfree(bufq_q);
                    114: }
                    115: 
                    116: /*
                    117:  * bufq_wr_tail()
                    118:  *
                    119:  * Append a BUF object to the doubly-linked queue.
                    120:  * Object to be inserted has been allocated by the caller.
                    121:  */
                    122: void bufq_wr_tail(s_id, bp)
                    123: int s_id;
                    124: BUF * bp;
                    125: {
                    126:        int s;
                    127:        bufq_type * bqp;
                    128: 
                    129:        if (s_id < num_q) {
                    130:                bqp = bufq_q + s_id;
                    131:                s = sphi();
                    132:                if (bqp->count == 0) {
                    133:                        bqp->head = bqp->tail = bp;
                    134:                        bp->b_actf = bp->b_actl = NULL;
                    135:                } else {
                    136:                        bqp->tail->b_actf = bp;
                    137:                        bp->b_actf = NULL;
                    138:                        bp->b_actl = bqp->tail;
                    139:                        bqp->tail = bp;
                    140:                }
                    141:                bqp->count++;
                    142: QSIZE;
                    143:                spl(s);
                    144:        }
                    145: }
                    146: 
                    147: /*
                    148:  * bufq_rd_head()
                    149:  *
                    150:  * Nondestructively fetch the head entry in the queue - i.e., this routine
                    151:  * does not remove an entry from the queue (see ss_rm_head() for that).
                    152:  * Return NULL if queue is empty, else return pointer to head item.
                    153:  */
                    154: BUF * bufq_rd_head(s_id)
                    155: int s_id;
                    156: {
                    157:        bufq_type * bqp;
                    158: 
                    159:        if (s_id < num_q) {
                    160:                bqp = bufq_q + s_id;
                    161:                return bqp->head;
                    162:        } else
                    163:                return NULL;
                    164: }
                    165: 
                    166: /*
                    167:  * bufq_rm_head()
                    168:  *
                    169:  * Delete head item from the queue.  Return a pointer to the node deleted,
                    170:  * or NULL if the queue was already empty.
                    171:  *
                    172:  * This routine does NOT deallocate the node.  That must be done by the
                    173:  * calling function after this routine runs.
                    174:  */
                    175: BUF * bufq_rm_head(s_id)
                    176: int s_id;
                    177: {
                    178:        BUF * ret;
                    179:        int s;
                    180:        bufq_type * bqp;
                    181: 
                    182:        if (s_id < num_q) {
                    183:                bqp = bufq_q + s_id;
                    184:                s = sphi();
                    185:                if (bqp->count > 0) {
                    186:                        ret = bqp->head;
                    187:                        if (bqp->count == 1) {
                    188:                                bqp->head = bqp->tail = NULL;
                    189:                        } else {
                    190:                                bqp->head = bqp->head->b_actf;
                    191:                                bqp->head->b_actl = NULL;
                    192:                        }
                    193:                        bqp->count--;
                    194: QSIZE;
                    195:                } else
                    196:                        ret = NULL;
                    197:                spl(s);
                    198:        } else
                    199:                ret = NULL;
                    200: 
                    201:        return ret;
                    202: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.