Annotation of coherent/d/PS2_KERNEL/coh.286/fifo_open.c, revision 1.1.1.1

1.1       root        1: /* fifo_open.c -- Routines implementing internally typed fifos.  */
                      2: #include <sys/typed.h>
                      3: 
                      4: /* Open a typed space as a fifo.
                      5:  *
                      6:  * Takes a typed_space that is already allocated, and a mode.    The type of
                      7:  * the typed space must be a FIFO.  Only T_FIFO_SIC has been implimented
                      8:  * (static, in-core fifo).
                      9:  *
                     10:  * The mode indicates whether to open for reading or writing.
                     11:  *  mode == 0 means read only.
                     12:  *  mode == 1 means write only.
                     13:  *  Other values are illegal.
                     14:  *
                     15:  * Returns a pointer to an initialized FIFO structure.  FIFO structures are
                     16:  * allocated from a pre-allocated array.  Returns F_NULL if it can't open
                     17:  * the fifo.
                     18:  */
                     19: FIFO *
                     20: fifo_open(fifo_space, mode)
                     21:        typed_space *fifo_space;
                     22:        int mode;
                     23: {
                     24:        /* ff_table is a table of FIFO structures which can be allocated on
                     25:         * demand.  It is functionally similiar to the file descritor table
                     26:         * in the kernel.
                     27:         */
                     28:        static FIFO ff_table[NFIFOS];
                     29:        static int inited = (1==2);     /* Has ff_table been initialized?  */
                     30: 
                     31:        int i;          /* A handy counter.  */
                     32:        FIFO *the_fifo; /* The fifo we are going to allocate.  */
                     33: 
                     34:        /* Initilize ff_table the first time we get called.  */
                     35:        if (!inited) {
                     36:                for (i = 0; i < NFIFOS; ++i) {
                     37:                        ff_table[i].f_space = F_NULL;
                     38:                        ff_table[i].f_flags = 0;
                     39:                }
                     40:                inited = (1==1);
                     41:        }
                     42: 
                     43:        /* Check the type of the space we were passed.  */
                     44:        switch (fifo_space->ts_type) {
                     45:        case T_FIFO:    /* Overly general type, assuming SIC.  */
                     46:                fifo_space->ts_type = T_FIFO_SIC;
                     47:                break;
                     48:        case T_FIFO_SIC:/* Static In-core Fifo.  */
                     49:                break;
                     50:        case T_FIFO_DIC:/* Dynamic In-core Fifo (can grow).  */
                     51:                return(F_NULL); /* Unimplimented.  */
                     52:        case T_FIFO_SP: /* Static Permanent Fifo (fixed size file). */
                     53:                return(F_NULL); /* Unimplimented.  */
                     54:        case T_FIFO_DP: /* Dynamic Permanent Fifo (ordinary file).  */
                     55:                return(F_NULL); /* Unimplimented.  */
                     56:        default:
                     57:                return(F_NULL); /* Illegal type encountered.  */
                     58:        }
                     59: 
                     60:        /* ASSERTION: fifo_space is a valid and implimented FIFO.  */
                     61: 
                     62:        /* Find the first free FIFO structure.  */
                     63: 
                     64:        /* This should be re-implimented using a malloc-based scheme.
                     65:         * At the moment, the tertiary boot libraries do not include a
                     66:         * malloc.
                     67:         */
                     68:        for (i = 0; (i < NFIFOS) && (0 != ff_table[i].f_flags); ++i) {
                     69:                /* Do nothing else.  */
                     70:        }
                     71: 
                     72:        if (NFIFOS == i) {
                     73:                return(F_NULL); /* No more free fifo structs.  */
                     74:        }
                     75: 
                     76:        the_fifo = &(ff_table[i]);
                     77: 
                     78:        /* ASSERTION: the_fifo points at a FIFO we can take.  */
                     79: 
                     80:        /* Initialize the FIFO struct.  */
                     81:        the_fifo->f_space = fifo_space;
                     82:        the_fifo->f_offset = fifo_space->ts_data;
                     83: 
                     84:        /* Initilize the flags.  */
                     85:        switch(mode) {
                     86:        case 0: /* read */
                     87:                the_fifo->f_flags |= F_READ;
                     88:                break;
                     89:        case 1: /* write */
                     90:                the_fifo->f_flags |= F_WRITE;
                     91:                break;
                     92:        default:
                     93:                return(F_NULL); /* Illegal mode flag.  */
                     94:        }
                     95:                
                     96:        return(the_fifo);
                     97: } /* fifo_open() */
                     98: 
                     99: 
                    100: #ifdef TEST
                    101: #include <stdio.h>
                    102: 
                    103: /* This is the typed space we will use for our FIFO operations.  */
                    104: TYPED_SPACE(global_space, 128, T_FIFO_SIC);    /* Static In-Core Fifo.  */
                    105: 
                    106: int
                    107: main()
                    108: {
                    109:        FIFO *ffp;              /* Fifo pointer for a handle.  */
                    110:        char line[1024];        /* Place to put input lines.  */
                    111:        long size;              /* Length for line.  (Sizes are all long.)  */
                    112:        int i;
                    113: 
                    114:        typed_space *local_space;
                    115: 
                    116:        /* Open the fifo for writing.  */
                    117:        if (F_NULL == (ffp = fifo_open(&global_space, 1))) {
                    118:                fprintf(stderr, "Can't open global_space for writing.\n");
                    119:                exit(1);
                    120:        }
                    121: 
                    122:        do {
                    123:                printf("Feed me: ");
                    124:                gets(line);
                    125:                size = (long) (strlen(line) + 1);
                    126:        } while (T_NULL != fifo_write_untyped(ffp, line, size, T_STR_STR));
                    127: 
                    128:        if (0 == fifo_close(ffp)) {
                    129:                fprintf(stderr, "Failed to close global_space.\n");
                    130:                exit(1);
                    131:        }
                    132: 
                    133:        printf("OK, global_space is now full.\n");
                    134:        /* ASSERTION: We've filled global_space with strings.  */
                    135: 
                    136:        /* Open the fifo for reading.  */
                    137:        if (F_NULL == (ffp = fifo_open(&global_space, 0))) {
                    138:                fprintf(stderr, "Can't open global_space for reading.\n");
                    139:                exit(1);
                    140:        }
                    141: 
                    142:        /* Dump the contents of this FIFO.  */
                    143:        for (i = 1; T_NULL != (local_space = fifo_read(ffp)); ++i) {
                    144:                printf("%d: size: %ld: type: 0x%x\n", i,
                    145:                        local_space->ts_size,
                    146:                        local_space->ts_type);
                    147: 
                    148:                /* Assume everything is a NUL terminated string.  */
                    149:                printf("datum: %s\n\n", local_space->ts_data);
                    150:                printf("Hit <RETURN>");
                    151:                gets(line);
                    152:        }
                    153: 
                    154: 
                    155:        /* Rewind the file, and dump it out again.  */
                    156:        printf("Rewinding.\n");
                    157:        if (0 == fifo_rewind(ffp)) {
                    158:                fprintf("Can't rewind global_space.\n");
                    159:                exit(1);
                    160:        }
                    161: 
                    162:        for (i = 1; T_NULL != (local_space = fifo_read(ffp)); ++i) {
                    163:                printf("%d: size: %ld: type: 0x%x\n", i,
                    164:                        local_space->ts_size,
                    165:                        local_space->ts_type);
                    166: 
                    167:                /* Assume everything is a NUL terminated string.  */
                    168:                printf("datum: %s\n\n", local_space->ts_data);
                    169:        }
                    170: 
                    171:        if (0 == fifo_close(ffp)) {
                    172:                fprintf(stderr, "Failed to close global_space.\n");
                    173:                exit(1);
                    174:        }
                    175: 
                    176:        exit(0);
                    177: } /* main() */
                    178: 
                    179: #endif /* TEST */

unix.superglobalmegacorp.com

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