|
|
1.1 ! root 1: /********************************************************************** ! 2: * ! 3: * bndbufp.c - Contains the exported RPC interfaces for inserting and ! 4: * removing strings from the central buffer pool. ! 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: ! 22: // Functions prototype ! 23: ! 24: void enter_item(char *input); ! 25: void remove_item(char *output); ! 26: ! 27: ! 28: // external variables ! 29: ! 30: extern char buffer[MAX_ITEM][MAX_SIZE]; // Global buffer pool ! 31: extern HANDLE hMutex; // Handle to mutex ! 32: extern HANDLE hEmptySem; // Handle to empty semaphore ! 33: extern HANDLE hFullSem; // Handle to full semaphore ! 34: extern int pro_buf_pos; // Producer buffer position ! 35: extern int con_buf_pos; // Consumer buffer position ! 36: ! 37: ! 38: /************************************************************************* ! 39: ! 40: void insert_buffer(unsigned char *item) ! 41: ! 42: Synchronizes access to the central buffer pool for inserting a string. ! 43: ! 44: **************************************************************************/ ! 45: ! 46: void insert_buffer(unsigned char *item) ! 47: { ! 48: ! 49: WaitForSingleObject(hEmptySem, INFINITE); // Decrease empty count ! 50: WaitForSingleObject(hMutex, INFINITE); // Acquire Mutex ! 51: enter_item(item); // Put item in buffer ! 52: ReleaseMutex(hMutex); // Release Mutex ! 53: ReleaseSemaphore(hFullSem, 1, NULL); // Increment full count ! 54: ! 55: } ! 56: ! 57: ! 58: ! 59: /************************************************************************* ! 60: ! 61: void remove_buffer(unsigned char *item) ! 62: ! 63: Synchronizes access to the the central buffer pool for removing a string. ! 64: ! 65: **************************************************************************/ ! 66: ! 67: void remove_buffer(unsigned char *item) ! 68: { ! 69: ! 70: WaitForSingleObject(hFullSem, INFINITE); // Decrease full count ! 71: WaitForSingleObject(hMutex, INFINITE); // Acquire Mutex ! 72: remove_item(item); // Take item from buffer ! 73: ReleaseMutex(hMutex); // Release Mutex ! 74: ReleaseSemaphore(hEmptySem, 1, NULL); // Increment full count ! 75: ! 76: } ! 77: ! 78: ! 79: ! 80: /************************************************************************* ! 81: ! 82: void enter_item(char *input) ! 83: ! 84: Puts a string in the centralized buffer pool ! 85: ! 86: We maintain two buffer pointers separately for the producer ! 87: and the consumer so that they can keep track of where they ! 88: are in the buffer queue. ! 89: ! 90: ----------------------------- ! 91: Producer --> | | | ... | | | --> Consumer ! 92: | | | | | | ! 93: ----------------------------- ! 94: ^ ^ ! 95: | | ! 96: current current ! 97: producer consumer ! 98: pointer pointer ! 99: ! 100: **************************************************************************/ ! 101: ! 102: ! 103: void enter_item(char *input) ! 104: { ! 105: ! 106: strncpy(buffer[pro_buf_pos], input, MAX_SIZE); ! 107: printf("\nproduce ---> %s", buffer[pro_buf_pos]); ! 108: pro_buf_pos = ((++pro_buf_pos) % MAX_ITEM); ! 109: } ! 110: ! 111: ! 112: /************************************************************************* ! 113: ! 114: void remove_item(char *output) ! 115: ! 116: Removes a string from the centralized buffer pool. ! 117: ! 118: **************************************************************************/ ! 119: ! 120: void remove_item(char *output) ! 121: { ! 122: ! 123: strncpy(output, buffer[con_buf_pos], 20); ! 124: printf("\nconsume ---> %s", output); ! 125: con_buf_pos = ((++con_buf_pos) % MAX_ITEM); ! 126: ! 127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.