int checkForDeadlock(int N,int M) { acquireMutexLock(MATRIX_MUTEX); int matrix[N][M]; FILE *fp = fopen(MATRIX_FILENAME, "r+"); int i,j; for(i=0;i< N ;i++) { for(j=0;j< M ;j++) { fscanf(fp, "%d", &matrix[i][j]); } } fclose(fp); releaseMutexLock(MATRIX_MUTEX); int pos[N]; for(i=0;i<N;i++)pos[i]=-1; int flag=-1; printf("\nChecking for Deadlock...\n\n"); j=0; int k=0; int found=0; while(k<N && !found) { if(flag==-1)j=0; for(i=0;i<N;i++) if(matrix[i][j]==2) {pos[k]=i; break;} if(pos[k]==-1) return 0; if(pos[k]==pos[0] && k!=0) {found=1; break;} flag=-1; for(j=0;j<M;j++) if(matrix[pos[k]][j]==1) {flag=j; break;} if(flag==-1) return 0; k++; } if(found) { printf("\n\nDeadlock !!!\n\nDeadlocked Cycle : \n"); //printf("k = %d\n",k ); for(i=0;i<k;i++) printf("Train %d from %s is waiting for Train %d from %s\n",pid_arr[pos[i]], direction_arr[pos[i]] ,pid_arr[pos[i+1]] , direction_arr[pos[i+1]] ); printf("\n\nPress a key to kill all Processes and exit !\n"); getch(); killAllProcesses(); //appendResults(probability); return 1; } else return 0; }
int checkInternalCommand(char *args[]){ if (!strcmp(args[0],"clear")) { // "clear" command pid_t pid; int status; if((pid = fork())==0) execl("/usr/bin/clear", "clear", NULL); else waitpid(pid, &status, 0); //continue; return 1; } if (!strcmp(args[0],"exit")){ // "quit" command killAllProcesses(); return -1; } if (!strcmp(args[0],"ps_all")){ // list listAllProcesses(); return 1; } if (!strcmp(args[0],"kill")){ // kill int index = 0; char Index[10]; if(args[1][0] == '%')//INDEX strcpy(Index, &args[1][1]); else strcpy(Index, &args[1][0]); index = atoi(Index); if(args[1][0] == '%') killWithIndex(index); else killWithProcessId(index); return 1; } if (!strcmp(args[0],"fg")){ // fg int index = 0; char Index[10]; if( args[1][0] != '%'){//INDEX fprintf(stderr, "\nUsage : fg %cindex",'%'); return 1; } strcpy(Index, &args[1][1]); index = atoi(Index); bringForeground(index); return 1; } if (!strcmp(args[0],"bg")){ // bg bringBackground(); return 1; } return 0; }
void main(int argc,char* argv[]) { int DPP; float probability = 0.2; if(argc!=3) { printf("Please run the program with 2 arguments : <DPP_toggle (0 or 1)> <probability> \n"); // DPP --> Deadlock Prevention Protocol exit(1); } else { sscanf(argv[1],"%d",&DPP); sscanf(argv[2],"%f",&probability); if((DPP != 0 && DPP != 1)||(probability<0 || probability >1)) { printf("Please run the program with valid arguments : <DPP_toggle (0 or 1)> <probability>\n"); // DPP --> Deadlock Prevention Protocol exit(1); } } semID = semget((key_t)SEMAPHORE_KEY,7,IPC_CREAT|0666); initializeAllSubSemaphoreValues(); acquireMutexLock(MATRIX_MUTEX); initializeMatrixFile(); releaseMutexLock(MATRIX_MUTEX); int mssgQ0_ID=msgget((key_t)MSSG_Q0_KEY,IPC_CREAT|0666); int mssgQ1_ID=msgget((key_t)MSSG_Q1_KEY,IPC_CREAT|0666); int i; for(i=0;i<NUM_PRODUCERS;i++) { char command[50]; sprintf(command,"xterm -hold -e ./producer %d %d %d &",MSSG_Q0_KEY,MSSG_Q1_KEY,i); system(command); sleep(1); // otherwise the item to be first inserted becomes the same for all the Queues due to the timeseeding : srand(time(NULL)) } for(i=0;i<NUM_CONSUMERS;i++) { char command[50]; sprintf(command,"xterm -hold -e ./consumer %d %d %d %f %d &",MSSG_Q0_KEY,MSSG_Q1_KEY,NUM_PRODUCERS+i,probability,DPP); system(command); } while(1) { int m,n; // if Deadlock is found, then Consumer m (Cm) and Consumer n (Cn) are such that Q0 --> Cm --> Q1 --> Cn --> Q0, in the Resource Allocation Graph int found_deadlock = 0; printf("Checking for Deadlock...\n"); acquireMutexLock(MATRIX_MUTEX); found_deadlock = checkForDeadlock(&m,&n); releaseMutexLock(MATRIX_MUTEX); if(found_deadlock) { printf("\n\nDeadlock !!!\n\nDeadlocked Cycle : Q0 --> C%d --> Q1 --> C%d --> Q0 \n\nKilling all Processes...",m,n); printf("\n\nPress a key to kill all Processes\n"); getch(); killAllProcesses(); appendResults(probability); exit(0); } sleep(2); } }