Annotation of os2sdk/demos/examples/queues/cust.c, revision 1.1

1.1     ! root        1: /* Customer.c
        !             2:  *
        !             3:  * This program emulates the gatekeeper placing requests in a queue that
        !             4:  * will be read by the headwaiter (see server.c). The following functions
        !             5:  * are illustrated here:
        !             6:  *      DOSOPENQUEUE, DOSWRITEQUEUE, DOSCLOSEQUEUE
        !             7:  *
        !             8:  * This example first allocates a shared segment. It loops trying to open
        !             9:  * the queue until successful. It loops (for an arbitrary number of times)
        !            10:  * placing data in the shared segment and writing an element (with
        !            11:  * DataAddress pointing to the data in the shared segment) to the queue.
        !            12:  * The data is contained in the static array CustData. Each word represents
        !            13:  * a byte containing the priority of the request and a byte for the table.
        !            14:  * It writes the last element with RequestID set to indicate that this
        !            15:  * will be the last element to be written to the queue. It then frees the
        !            16:  * shared segment and then closes the queue.
        !            17:  *
        !            18:  * Compile as: cl -AL -G2 -Lp customer.c
        !            19:  *
        !            20:  * Copyright (C) Microsoft Corp. 1986
        !            21:  */
        !            22: 
        !            23: #include <doscalls.h>                   /* 286DOS function declarations */
        !            24: #include "defines.h"                    /* definitions for example programs */
        !            25: #include <dos.h>                        /* contains FP_SEG and FP_OFF macros */
        !            26: 
        !            27: #define ERROR_QUE_NAME_NOT_EXIST        343
        !            28: 
        !            29: void main (argc, argv, envp)
        !            30:     int argc;
        !            31:     char *argv[];
        !            32:     char *envp;
        !            33: {
        !            34:         register unsigned i;    /* loop control variable         */
        !            35:         unsigned  TableID,      /* table where a customer group is seated */
        !            36:                   Priorty,       /* Priority of Table */
        !            37:                   *SharedSeg;   /* pointer to shared segment     */
        !            38:         unsigned OwnerPID,      /* queue owner's PID             */
        !            39:                  QueueHandle,   /* handle of queue               */
        !            40:                  SharedSel;     /* selector to shared segment    */
        !            41:         char     type;          /* type of example selected      */
        !            42:         static unsigned CustData[MAXQWRITES] = {0x0600, 0x0501, 0x0802, 0x0003,
        !            43:                                                 0x0104, 0x0305, 0x0406, 0x0707};
        !            44:                                 /* represents customers requests */
        !            45:                                 /* in Format PPTT, where PP is   */
        !            46:                                 /* priority and TT is table number */
        !            47: 
        !            48:         if (argc > 1){
        !            49:            ++argv;
        !            50:            type = *argv[0];
        !            51:         }
        !            52:         else type = 'd';
        !            53: 
        !            54:         /* allocate shared segment */
        !            55:         DOSALLOCSHRSEG ((unsigned) SEGSIZE, SEGNAME, &SharedSel);
        !            56: 
        !            57:         /* open the queue */
        !            58:         while (DOSOPENQUEUE (&OwnerPID, &QueueHandle, QUEUENAME) ==
        !            59:                ERROR_QUE_NAME_NOT_EXIST) /* keep trying to open the queue...*/
        !            60:                   DOSSLEEP(1000L);       /* ...until the server creates it  */
        !            61: 
        !            62:         /* compute the address to the shared segment */
        !            63:         FP_SEG(SharedSeg) = SharedSel;
        !            64:         FP_OFF(SharedSeg) = 0;
        !            65: 
        !            66:         /* write some requests to the queue, emulating customer's requests  */
        !            67:         TableID = 1;
        !            68:         if ((type == 'L') || (type == 'l')){
        !            69:            /* write data in LIFO format */
        !            70: 
        !            71:            DOSWRITEQUEUE (QueueHandle, NOMORE, DATALENGTH,
        !            72:                           (char *) &SharedSeg[TableID++], /* any prio OK - not used */
        !            73:                           LIFOPRIO);
        !            74: 
        !            75:            for (i = 0; i < MAXQWRITES; ++i){
        !            76:              SharedSeg[TableID] = CustData[i];
        !            77:              DOSWRITEQUEUE (QueueHandle, REQWAITER, DATALENGTH,
        !            78:                             (char *) &SharedSeg[TableID++], LIFOPRIO);
        !            79: 
        !            80:            } /* endfor */
        !            81: 
        !            82:         } else {
        !            83:            /* write data in fifo/prio format */
        !            84: 
        !            85:            for (i = 0; i < MAXQWRITES; ++i){
        !            86:              SharedSeg[TableID] = CustData[i];
        !            87:              Priorty = CustData[i] >> 8;      /* Priority must be a WORD */
        !            88:              DOSWRITEQUEUE (QueueHandle, REQWAITER, DATALENGTH,
        !            89:                            (char *) &SharedSeg[TableID++], Priorty);
        !            90:            } /* endfor */
        !            91: 
        !            92: 
        !            93:            /* indicate there are no more customers */
        !            94:            DOSWRITEQUEUE (QueueHandle, NOMORE, DATALENGTH,
        !            95:                           (char *) &SharedSeg[TableID], /* any prio OK - not used */
        !            96:                           ELEMPRIORITY);
        !            97:         } /* endif */
        !            98: 
        !            99: 
        !           100:         /* free the shared segment */
        !           101:         DOSFREESEG (SharedSel);
        !           102: 
        !           103:         /* close the queue */
        !           104:         DOSCLOSEQUEUE (QueueHandle);
        !           105: }

unix.superglobalmegacorp.com

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