From cbe6681f2f369310c9afe7b129b6cd1bfca6f11e Mon Sep 17 00:00:00 2001 From: akailash Date: Wed, 26 Oct 2011 21:05:08 +0530 Subject: [PATCH] multiple queue fix and other minor changes --- include/minix/libmsgque.h | 2 -- servers_pm/msgque.c | 75 +++++++++++++++++++++------------------ servers_pm/msgque_const.h | 4 +-- test.c | 17 +++++---- 4 files changed, 53 insertions(+), 45 deletions(-) diff --git a/include/minix/libmsgque.h b/include/minix/libmsgque.h index 636eca7..3be3e27 100644 --- a/include/minix/libmsgque.h +++ b/include/minix/libmsgque.h @@ -26,8 +26,6 @@ struct MsgQue { #define MQ_SUCCESS 0 #define MQ_FAILED -1 #define MQ_ERR_MAX_MSGQUE -2 -#define MQ_ERR_MAX_MESSAGES -3 -#define MQ_ERR_MAX_RECIEVERS -4 #define ERR_INVALID_MQ -5 #define ERR_MQ_INUSE -6 #define ERR_INVALID_ARG -8 diff --git a/servers_pm/msgque.c b/servers_pm/msgque.c index d019d84..925dee3 100644 --- a/servers_pm/msgque.c +++ b/servers_pm/msgque.c @@ -101,38 +101,6 @@ PRIVATE int insertUser( struct MQueue *mq, int proc_nr) { return MQ_SUCCESS; } -/* Any user calling mclose() will do below */ -PRIVATE void removeUser( struct MQueue *mq, int proc_nr ) { - struct MQUser *tmp; - struct MQUser *prev = NULL; - - if(mq==NULL) - return; - - tmp = mq->userHead; - printf("\nCS551 DBG: removeUser"); - - while( tmp ) { - if( tmp->proc_nr == proc_nr ) - { - if( prev == NULL ) - mq->userHead = tmp->next; - else - prev->next = tmp->next; - free( tmp ); - - if( mq->userHead == NULL ) { - truncateQueue( mq ); - mq->token = MQ_FREE; - mq->queueLen = 0; - } - return; - } - prev = tmp; - tmp = tmp->next; - } -} - /* First args NULL, causes search in all Q */ PRIVATE struct MQUser* getUserPtr( struct MQueue *mq, int proc_nr ) { struct MQUser *tmp; @@ -292,6 +260,42 @@ PRIVATE int truncateQueue( struct MQueue *mq ) { return MQ_SUCCESS; } +/* Any user calling mclose() will do below */ +PRIVATE void removeUser( struct MQueue *mq, int proc_nr ) { + struct MQUser *tmp; + struct MQUser *prev = NULL; + + if(mq==NULL) + return; + + tmp = mq->userHead; + printf("\nCS551 DBG: removeUser"); + + while( tmp ) { + if( tmp->proc_nr == proc_nr ) + { + if( prev == NULL ) + mq->userHead = tmp->next; + else + prev->next = tmp->next; + free( tmp ); + + if( mq->userHead == NULL ) { + truncateQueue( mq ); + mq->token = MQ_FREE; + mq->queueLen = 0; + mq->msgCounter = 0; + mq->msgHead = NULL; + mq->msgTail = NULL; + mq->userHead = NULL; + } + return; + } + prev = tmp; + tmp = tmp->next; + } +} + /* Called by mrecv() when message already present in Queue * Called by msend() when unblocking reciever @@ -397,7 +401,7 @@ PUBLIC int do_minit(void) return( MQ_SUCCESS ); } - if( mQueues_[i].token = MQ_FREE && firstFreeQueue == MQ_FREE ) + if( mQueues_[i].token == MQ_FREE && firstFreeQueue == MQ_FREE ) firstFreeQueue = i; } @@ -634,7 +638,10 @@ PUBLIC int do_mclean(void) truncateQueue( mq ); mq->token = MQ_FREE; mq->queueLen = 0; - + mq->msgCounter = 0; + mq->msgHead = NULL; + mq->msgTail = NULL; + mq->userHead = NULL; return MQ_SUCCESS; } diff --git a/servers_pm/msgque_const.h b/servers_pm/msgque_const.h index 012aeba..315515d 100644 --- a/servers_pm/msgque_const.h +++ b/servers_pm/msgque_const.h @@ -7,8 +7,8 @@ * */ -#define MQ_MAX_MSGQUES 128 -#define MQ_MAX_MESSAGES 512 +#define MQ_MAX_MSGQUES 5 +#define MQ_MAX_MESSAGES 50 #define MQ_MAX_BYTES_IN_MSG 256 /* Single msg que can hold 512 * 256 bytes */ #define MQ_CLEANUP_TIMER 1500 /* number of ticks after which cleanup is to be run */ diff --git a/test.c b/test.c index 74d02d8..c0c6393 100644 --- a/test.c +++ b/test.c @@ -49,13 +49,16 @@ int main(int argc, char *argv[], char *envp[]) } minit(key, &msgque); - + printf("Process[%d] registered to queue[%d,0x%x]\n", getpid(), msgque.token, msgque.queue); + if (sleep_time>0) + sleep(sleep_time); + while(repeat>0) { if((proc_num<1)||(proc_num>2)) { printf("\nEnter choice[1-recv, 2-send]"); - scanf("%d",choice); + scanf("%d",&choice); } else { @@ -64,17 +67,17 @@ int main(int argc, char *argv[], char *envp[]) if(choice==1){ rc = mrecv(&msgque, msg, 50); if ( rc != MQ_SUCCESS) - printf("%d:Error while receiving\n",rc); + printf("Process[%d] %d:Error while receiving\n",getpid(), rc); else - printf("Recved:%d %s\n",rc, msg); + printf("Process[%d] Recved:%d %s\n", getpid(), rc, msg); } else if(choice==2) { sprintf(msg,"Process[%d] MsgNo %d", getpid(), msg_num++); rc = msend(&msgque, msg, 50); if (rc != MQ_SUCCESS) - printf("Sender: %d Error while sending\n",rc); + printf("Process[%d] Sender: %d Error while sending\n", getpid(), rc); else - printf("Sender got:%d\n",rc); + printf("Process[%d] Sender got:%d\n",getpid(), rc); } repeat--; mclean(&msgque); @@ -84,4 +87,4 @@ int main(int argc, char *argv[], char *envp[]) mclose(&msgque); return 0; -} \ No newline at end of file +}