Annotation of q_a/samples/bndbuf/bndbufc.c, revision 1.1.1.1

1.1       root        1: /**********************************************************************
                      2: *   bndbufc.c -- sample program demonstrating two client threads
                      3: *        producing to and consuming from a central buffer
                      4: *        pool via RPC.
                      5: *
                      6: *   Frederick Chong
                      7: *   Microsoft Developer Support
                      8: *   Copyright (c) 1992, 1993 Microsoft Corporation
                      9: *
                     10: ***********************************************************************/
                     11: 
                     12: 
                     13: #include <windows.h>
                     14: #include <stdio.h>
                     15: #include <string.h>
                     16: #include <stdlib.h>
                     17: #include <rpc.h>
                     18: #include "common.h"
                     19: #include "bndbuf.h"
                     20: 
                     21: // Function prototypes
                     22: 
                     23: void producer();
                     24: void consumer();
                     25: void produce_item(char * string);
                     26: void _CRTAPI1 main(int argc, char *argv[]);
                     27: 
                     28: // Global variables
                     29: 
                     30: HANDLE hMainThrd;   // Handle to main thread
                     31: HANDLE hConThrd;    // Handle to consumer thread
                     32: HANDLE hProdThrd;   // Handle to producer thread
                     33: LONG   lConThreadId;    // Consumer thread ID
                     34: LONG   lProdThreadId;   // Producer thread ID
                     35: DWORD  retCode;
                     36: 
                     37: 
                     38: /**********************************************************************
                     39: 
                     40: void _CRTAPI1 main(int argc, char *argv[])
                     41: 
                     42: Creates the producer and consumer thread and then suspend itself.
                     43: 
                     44: ***********************************************************************/
                     45: 
                     46: void _CRTAPI1 main(int argc, char *argv[])
                     47: {
                     48: 
                     49: 
                     50:     // Create Consumer Thread
                     51: 
                     52:     hConThrd = CreateThread(NULL,
                     53:                 0,
                     54:                 (LPTHREAD_START_ROUTINE)consumer,
                     55:                 NULL,
                     56:                 0,
                     57:                 (LPDWORD) &lConThreadId );
                     58: 
                     59: 
                     60:     // Create producer thread
                     61: 
                     62:     hProdThrd = CreateThread(NULL,
                     63:                  0,
                     64:                  (LPTHREAD_START_ROUTINE)producer,
                     65:                  NULL,
                     66:                  0,
                     67:                  (LPDWORD) &lProdThreadId );
                     68: 
                     69: 
                     70:     // Suspend the main thread
                     71: 
                     72:     hMainThrd = GetCurrentThread();
                     73: 
                     74:     if (SuspendThread(hMainThrd) == -1)
                     75:     {
                     76:         retCode = GetLastError();
                     77:         printf("\nSuspendThread returns %d\n", retCode);
                     78:         ExitProcess(0);
                     79:     }
                     80: 
                     81: 
                     82: 
                     83: 
                     84: }
                     85: 
                     86: 
                     87: /***********************************************************************
                     88: 
                     89: void producer()
                     90: 
                     91: This is the producer thread function. It produces a string of 20 random
                     92: characters then make a RPC to insert the string item.
                     93: 
                     94: ************************************************************************/
                     95: 
                     96: void producer()
                     97: {
                     98:     char item[MAX_SIZE];
                     99: 
                    100:     // Delay for awhile before starting
                    101:     Sleep(200);
                    102: 
                    103:     while (TRUE)
                    104:     {
                    105:     produce_item(item);     // Produce random string
                    106: 
                    107: 
                    108:     // RPC guarded statements
                    109: 
                    110:     RpcTryExcept
                    111:     {
                    112:         insert_buffer(item);    // Put item in buffer
                    113:         printf("\nproduce   ---> %s", item);
                    114:     }
                    115:     RpcExcept(1)
                    116:     {
                    117:         printf("The RPC runtime library raised exception 0x%lx.\n", RpcExceptionCode());
                    118:         printf("Please verify that the server application and \n");
                    119:         printf("the locator service have been started.");
                    120:     }
                    121:     RpcEndExcept
                    122: 
                    123:     // End RPC guarded statements
                    124: 
                    125:     }
                    126: }
                    127: 
                    128: 
                    129: /***********************************************************************
                    130: 
                    131: void consumer()
                    132: 
                    133: This is the consumer thread function. It makes a RPC and then remove
                    134: the string item from the central buffer pool.
                    135: 
                    136: ************************************************************************/
                    137: 
                    138: 
                    139: void consumer()
                    140: {
                    141:     char item[20];
                    142: 
                    143:     while (TRUE)
                    144:     {
                    145: 
                    146:     // RPC guarded statements
                    147: 
                    148:     RpcTryExcept
                    149:     {
                    150:         remove_buffer(item);        // Take item from buffer
                    151:         printf("\nconsume   ---> %s", item);
                    152:     }
                    153: 
                    154:     RpcExcept(1)
                    155:     {
                    156:         printf("The RPC runtime library raised exception %lx.\n", RpcExceptionCode());
                    157:         printf("Please verify that the server application and \n");
                    158:         printf("the locator service have been started.");
                    159:     }
                    160:     RpcEndExcept
                    161: 
                    162:     // End RPC guarded statements
                    163: 
                    164: 
                    165:     }
                    166: 
                    167: 
                    168: }
                    169: 
                    170: 
                    171: /***********************************************************************
                    172: 
                    173: void produce_item(char *string)
                    174: 
                    175: Generates a random string of 20 characters.
                    176: 
                    177: ************************************************************************/
                    178: 
                    179: void produce_item(char *string)
                    180: {
                    181:     char *tmp;
                    182:     int i;
                    183: 
                    184:     tmp = string;
                    185: 
                    186:     for (i = MAX_SIZE; i > 1; i--)
                    187:     {
                    188:         *tmp = (rand() % 26) + 'A';
                    189:         tmp++;
                    190:     }
                    191:     strcpy(tmp, "\0");
                    192: 
                    193: }
                    194: 
                    195: 
                    196: 
                    197: /***********************************************************************
                    198:     MIDL allocate and free
                    199: ***********************************************************************/
                    200: 
                    201: void __RPC_FAR * __RPC_API MIDL_user_allocate(size_t len)
                    202: {
                    203:     return(malloc(len));
                    204: }
                    205: 
                    206: void __RPC_API MIDL_user_free(void __RPC_FAR * ptr)
                    207: {
                    208:     free(ptr);
                    209: }

unix.superglobalmegacorp.com

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