Annotation of coherent/d/PS2_KERNEL/coh.286/fifo_open.c, revision 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.