examples/PIPS/opencproducerconsumerex/src/producer.c

Go to the documentation of this file.
00001 
00015 /* INCLUDE FILES */
00016 #include <sys/types.h>
00017 #include <sys/ipc.h>
00018 #include <sys/msg.h>
00019 #include <stdlib.h>
00020 #include <stdio.h>
00021 
00022 #include "CommanHeader.h"
00023 
00024 #define MIN(X, Y) (X < Y) ? X : Y;
00025 
00026 /*****************************************************************************
00027 *  ProducerThreadEntryPoint
00028 *  Function: Producer Thread that produces M number of items at a time 
00029 *  where M is number of Consumers.
00030 *  This thread will produce N number of items where N is total number of items 
00031 *  needed by all the Consumers.
00032 *  It also informs the Observer thread about item production
00033 *******************************************************************************/
00034 
00035 void* ProducerThreadEntryPoint( void* aParam ) 
00036 {
00037         ThreadParam* args = (ThreadParam*) aParam;
00038         int yetToProduce = args->noOfItems;
00039         int produceNow = 0;
00040         int noOfConsumers = args->noOfConsumers;
00041         ProducedItem item;
00042         key_t msgQFd = -1;
00043         int ret = 0;
00044         /* Construct the message to be send thru msg q */
00045         struct msgbuf* sendMsg = (struct msgbuf*)malloc(KMAXSENDMSG);
00046         sendMsg->mtype = 1;
00047         
00048         /* Get the Handler to Observer Msg Q */
00049         msgQFd = msgget(KMSGQKEY, IPC_CREAT);
00050 
00051         item.itemNum = 1;
00052 
00053         while (yetToProduce != 0) 
00054         {
00055                 produceNow = MIN(yetToProduce, noOfConsumers);
00056                 yetToProduce -= produceNow;
00057 
00058                 /* Acquire the Lock so that Producer can Produce "produceNow" items once. */
00059                 sem_wait(&args->itemLock);
00060                 for(;produceNow != 0; produceNow--) 
00061                 {
00062                         sprintf(item.itemName, "Item-Number: #%d", item.itemNum);
00063                         /* Push this item on to Stack so that Consumetrs can take it.*/
00064                         PushOntoStack(&item);
00065                         item.itemNum++;
00066                         /* Inform the Observer about Item Production */
00067                         sprintf(sendMsg->mtext, " Producer Produced %s\0", item.itemName);
00068                         ret = msgsnd(msgQFd, sendMsg, strlen(sendMsg->mtext)+4, 0);
00069                 }
00070                 /* Release the Lock so that Consumers can consume produced items. */
00071                 sem_post(&args->itemLock);
00072         }
00073 
00074         free( sendMsg );
00075         return (int*)0;
00076 }
00077 
00078 /*  End of File */

Generated by  doxygen 1.6.2