Annotation of os2sdk/demos/examples/share/share.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * This example illustrates the use of shared memory and ram semaphores
        !             3:  * between separate processes.  One process reads and stores keystrokes
        !             4:  * into a circular buffer in shared memory, and another reads the buffer
        !             5:  * and writes to standard output. The output program throttles output to
        !             6:  * one character per sec so the effect of buffering can be seen. Type
        !             7:  * CONTROL-d to terminate.
        !             8:  *
        !             9:  * Note the mutual exclusion on access to the head and tail pointers of the
        !            10:  * buffer.  For a discussion, see Peterson & Silberschatz, "Operating
        !            11:  * System Concepts", 2nd ed., chapter 9.
        !            12:  *
        !            13:  * Be aware when running this that the system does keyboard buffering
        !            14:  * underneath this program, so you can type ahead more than you might think.
        !            15:  *
        !            16:  * Needs shrchild.c as companion program.
        !            17:  *
        !            18:  * Compile as: cl -AL -G2 -Lp share.c
        !            19:  *
        !            20:  * Copyright (C) Microsoft Corp. 1986
        !            21:  */
        !            22: 
        !            23: #include <doscalls.h>
        !            24: #include <subcalls.h>
        !            25: #include "share.h"             /* common declarations between processes */
        !            26: 
        !            27: #define        CHILD1PROG      "SHRCHILD.EXE"          /* child process */
        !            28: #define        CTRLd           4                       /* termination character */
        !            29: #define FBSZ           32
        !            30: 
        !            31: struct KeyData KeyData;                /* declared in subcalls.h */
        !            32: 
        !            33: main()
        !            34: {
        !            35:        unsigned        Selector;
        !            36:        struct ResultCodes childID;     /* child process id */
        !            37:        unsigned        nBytes;
        !            38:        unsigned        rc;             /* return code */
        !            39:        char            c,
        !            40:                        fbuf[FBSZ];     /* failing object buffer */
        !            41:        struct ShareRec *SmemPtr;       /* shared memory pointer */
        !            42: 
        !            43:        /* allocate the shared memory segment */
        !            44:        if (rc = DOSALLOCSHRSEG( SHRSEGSIZE, (char *)SHRSEGNAME,
        !            45:                                (unsigned *)&Selector ))  {
        !            46:                printf("alloc of shared memory failed, error: %d\n", rc);
        !            47:                DOSEXIT(1, 0);
        !            48:        }
        !            49: 
        !            50:        /* Get a far pointer from a 16 bit selector */
        !            51:        SmemPtr = (struct ShareRec *) GETSEGPTR(Selector, 0);
        !            52: 
        !            53:        /* Initialize circular buffer flags */
        !            54:        DOSSEMCLEAR((long)&(SmemPtr->fullsem));
        !            55:        DOSSEMSET((long)&(SmemPtr->emptysem));
        !            56:        DOSSEMCLEAR((long)&(SmemPtr->mutexsem));
        !            57:        SmemPtr->head = 0;
        !            58:        SmemPtr->tail = 0;
        !            59: 
        !            60:        /* exec asynchronously the consumer process */
        !            61:        if (rc = DOSEXECPGM(
        !            62:                (char *) fbuf,                  /* ObjNameBuf           */
        !            63:                (unsigned) FBSZ,                /* ObjNameLen           */
        !            64:                (unsigned) 1,                   /* AsyncTraceFlags      */
        !            65:                (char *) 0L,                    /* Argument Strings     */
        !            66:                (char *) 0L,                    /* Environment Strings  */
        !            67:                (struct ResultCodes *) &childID,
        !            68:                                                /* ID & Termination Codes */
        !            69:                (char *) CHILD1PROG )) {        /* Program Filename     */
        !            70:            
        !            71:                printf("exec of child process failed, error: %d\n", rc);
        !            72:                DOSEXIT(1, 0);
        !            73:        }
        !            74: 
        !            75:        /* Here, we read chars from the keyboard, and put them in a */
        !            76:        /* circular buffer in shared memory */
        !            77: 
        !            78:        KBDCHARIN(&KeyData, 0, 0);      /* read character from keyboard */
        !            79: 
        !            80:        while((c = KeyData.char_code) != CTRLd) {
        !            81: 
        !            82:            /* block if buffer full */
        !            83:            DOSSEMWAIT((long)&(SmemPtr->fullsem), WAITFOREVER);
        !            84: 
        !            85:            /* mutual exclusion on buffer pointers */
        !            86:            DOSSEMREQUEST((long)&(SmemPtr->mutexsem), WAITFOREVER);
        !            87:            SmemPtr->CircBuffer[SmemPtr->head] = c;
        !            88:            SmemPtr->head++;                /* step pointer */
        !            89:            SmemPtr->head %= CIRCBUFSIZE;   /* wrap at end  */
        !            90:            if(BUFFUL(SmemPtr))             /* set semaphore if buffer full */
        !            91:                DOSSEMSET((long)&(SmemPtr->fullsem));
        !            92:            DOSSEMCLEAR((long)&(SmemPtr->mutexsem));
        !            93: 
        !            94:            DOSSEMCLEAR((long)&(SmemPtr->emptysem));  /* indicate buf !emtpy */
        !            95: 
        !            96:            KBDCHARIN(&KeyData, 0, 0);  /* read character from keyboard */
        !            97:        }
        !            98:        DOSKILLPROCESS( 1, childID.TermCode_PID );      /* kill consumer */
        !            99:        DOSEXIT( 1, 0 );                /* exit, terminating all threads */
        !           100: }

unix.superglobalmegacorp.com

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