Annotation of os2sdk/demos/examples/queues/serv.c, revision 1.1.1.1

1.1       root        1: /* Server.c
                      2:  *
                      3:  * This program emulates the headwaiter reading requests (from a queue)
                      4:  * placed in the queue by the gatekeeper (see customer.c).  The following
                      5:  * functions are illustrated here:
                      6:  *      DOSCREATEQUEUE, DOSQUERYQUEUE, DOSREADQUEUE, DOSCLOSEQUEUE
                      7:  *
                      8:  * This example first makes the shared segment created by customer.c
                      9:  * addressable. The data queued by the customer.c is contained in this
                     10:  * segment. It creates a queue, loops querying the number of elements in the
                     11:  * queue. It exits the loop when the number of elements in the queue is
                     12:  * nonzero. It loops reading each element from the queue and checking the
                     13:  * value of the RequestID in the element. It exits the loop when the
                     14:  * RequestID indicates nomore elements. It frees the shared segment
                     15:  * and closes the queue.
                     16:  *
                     17:  * Compile as: cl -AL -G2 -Lp server.c
                     18:  *
                     19:  * Copyright (C) Microsoft Corp. 1986
                     20:  */
                     21: 
                     22: #include <doscalls.h>                   /* 286DOS function declarations     */
                     23: #include "defines.h"                    /* definitions for example programs */
                     24: 
                     25: #define Q                       0       /* determine type of Queue to create */
                     26: #define ERROR_FILE_NOT_FOUND    2
                     27: 
                     28: 
                     29: 
                     30: 
                     31: 
                     32: 
                     33: void main (argc, argv, envp)
                     34:     int argc;
                     35:     char *argv[];
                     36:     char *envp;
                     37: {
                     38:         unsigned        QueueHandle,        /* handle to the queue          */
                     39:                         NumberElements = 0, /* number of elements in queue  */
                     40:                         DataLength,         /* length of element received   */
                     41:                         SharedSel;          /* selector to shared segment   */
                     42:         unsigned long   DataAddress,        /* address of element received  */
                     43:                         PID_RequestID;      /* will hold PID & request ID   */
                     44:         unsigned char   ElemPriority,       /* priority of element in queue */
                     45:                         TableID,            /* ID of the table              */
                     46:                         Priorty,            /* Priority of the Data Element */
                     47:                         type;               /* example type                 */
                     48: 
                     49:         /* get the shared segment */
                     50:         while (DOSGETSHRSEG (SEGNAME, &SharedSel) ==
                     51:                ERROR_FILE_NOT_FOUND) /* keep trying to get the shared seg...*/
                     52:                   DOSSLEEP(1000L);   /* ...until the customer creates it    */
                     53: 
                     54:         /* create the appropriate queue */
                     55:         if (argc > 1){
                     56:            ++argv;
                     57:            type = *argv[0];
                     58:         }
                     59:         else type = 'd';
                     60:         switch (*argv[0]) {
                     61:           case 'f': DOSCREATEQUEUE (&QueueHandle, FIFO, QUEUENAME);
                     62:                     printf("FIFO Queue selected ... \n");
                     63:             break;
                     64:           case 'F': DOSCREATEQUEUE (&QueueHandle, FIFO, QUEUENAME);
                     65:                     printf("FIFO Queue selected ...\n");
                     66:             break;
                     67:           case 'l': DOSCREATEQUEUE (&QueueHandle, LIFO, QUEUENAME);
                     68:                     printf("LIFO Queue selected ...\n");
                     69:             break;
                     70:           case 'L': DOSCREATEQUEUE (&QueueHandle, LIFO, QUEUENAME);
                     71:                     printf("LIFO Queue selected ...\n");
                     72:             break;
                     73:           case 'p': DOSCREATEQUEUE (&QueueHandle, PRIO, QUEUENAME);
                     74:                     printf("PRIO Queue selected ...\n");
                     75:             break;
                     76:           case 'P': DOSCREATEQUEUE (&QueueHandle, PRIO, QUEUENAME);
                     77:                     printf("PRIO Queue selected ...\n");
                     78:             break;
                     79:           default: DOSCREATEQUEUE (&QueueHandle, FIFO, QUEUENAME);
                     80:                     printf("FIFO Queue selected - default\n");
                     81:             ;
                     82:         } /* endswitch */
                     83: 
                     84:         /* check if there are any requests */
                     85:         while (NumberElements == 0) {
                     86:           DOSQUERYQUEUE (QueueHandle, &NumberElements);
                     87:           DOSSLEEP(1000L);
                     88:         }
                     89: 
                     90:         /* there are requests in the queue. */
                     91: 
                     92:         /* initialise request ID */
                     93:         *((unsigned *)(&PID_RequestID) + 1) = REQWAITER;
                     94: 
                     95:         /* loop for rest of queue elements until no nore */
                     96: 
                     97:         do {
                     98: 
                     99:           /* read an element from the queue */
                    100:           DOSREADQUEUE (QueueHandle, &PID_RequestID,
                    101:                         &DataLength, &DataAddress, FIRSTELEMENT,
                    102:                         (unsigned char) WAIT, &ElemPriority,
                    103:                         (unsigned long) DUMMYPARAM);
                    104:           TableID = *((unsigned char *) DataAddress);
                    105:           Priorty  = *((unsigned char *) DataAddress + 1);
                    106: 
                    107:           /* dispatch waiter to table */
                    108: 
                    109:           if (*((unsigned *)(&PID_RequestID) + 1) != NOMORE){
                    110:             printf("Server sending waiter to Table %u : Priority = %u ", TableID, Priorty);
                    111:             printf(": Data Length= %u\n", DataLength);
                    112:           } /* endif */
                    113: 
                    114:         } while (*((unsigned *)(&PID_RequestID) + 1) != NOMORE); /* enddo */
                    115: 
                    116: 
                    117: 
                    118:         /* free the shared segment */
                    119:         DOSFREESEG (SharedSel);
                    120: 
                    121:         /* close the queue */
                    122:         DOSCLOSEQUEUE (QueueHandle);
                    123: }

unix.superglobalmegacorp.com

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