/* process a single symbol table entry. * (notice that all non-SYSV strings are in the string table.) */ static void transformSymEntry(SYM *n) { String s = buildNewString(n); #ifdef SYSV n->n_zeroes = 0; #endif N_STRINDEX(*n) = 0; if (s.length() > 0) { const char *t = (const char*)s; #ifdef SYSV if (s.length() <= SYMNMLEN) strncpy(n->n_name, t, SYMNMLEN); else #endif { N_STRINDEX(*n) = newSngLoc; // fix n's index newSngLoc += xfwrite(t, sizeof(char), s.length()+1, newSng); // write the new string } } }
/* * The scheduler will read queries from a file and send them to the workers * to be processed * * filename - path to read queries from * size - number of workers * */ void scheduler(char* filename, int size) { #ifdef DEBUG fprintf(stderr, "scheduler started\n"); #endif //open file, gets filename from command-line args FILE *fp; //number of workers that have been sent a complete message int finishedWorkers = 0; //used to determine the ID of a sender MPI_Status status; //toSend contains the entire outgoing message char *toSend; //outgoing messages will be placed in this buffer char *buffer; buffer = malloc(BUFFER_SIZE); if (buffer == NULL) fatal("scheduler: malloc of buffer failed"); int queriesRead; fp = fopen(filename, "r"); if (fp == NULL) fatal("scheduler: fopen failed"); if(!fp) { fprintf(stderr, "%s, %s\n", filename, strerror(errno)); exit(EXIT_FAILURE); } #ifdef DEBUG fprintf(stderr, "scheduler initialized\n"); #endif //loop until all of the workers have completed while(finishedWorkers < size - 2) { //receive ready message from a worker MPI_Recv(buffer, 8, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); #ifdef DEBUG fprintf(stderr, "scheduler got message\n"); #endif //get sender of the message int sender = status.MPI_SOURCE; //build a new query string to send to the worker toSend = buildNewString(fp, &queriesRead); //if no more queries, send complete message if(toSend == NULL) { #ifdef DEBUG fprintf(stderr, "scheduler sending complete message\n"); #endif MPI_Send("", 1, MPI_CHAR, sender, COMPLETE_TAG, MPI_COMM_WORLD); finishedWorkers++; } else { int messageLength; messageLength = strlen(toSend); //fprintf(stderr, "message length is %d\n", messageLength); //fprintf(stderr, "%s\n", toSend); //fprintf(stderr, "####################\n", toSend); int cntSent = 0; #ifdef DEBUG fprintf(stderr, "scheduler sending begin message\n"); #endif //send begin message tag MPI_Send("", 1, MPI_CHAR, sender, BEGIN_TAG, MPI_COMM_WORLD); //send message while (cntSent < messageLength) { #ifdef DEBUG fprintf(stderr, "scheduler copying message into buffer\n"); #endif //copy characters from message into buffer int n; if (messageLength - cntSent >= BUFFER_SIZE) { n = BUFFER_SIZE; } else { n = messageLength - cntSent; } strncpy(buffer, toSend + cntSent, n); #ifdef DEBUG fprintf(stderr, "scheduler sending buffer message\n"); #endif //send buffer MPI_Send(buffer, n, MPI_CHAR, sender, MESSAGE_TAG, MPI_COMM_WORLD); cntSent += n; } #ifdef DEBUG fprintf(stderr, "scheduler sending end message\n"); #endif //send end message tag MPI_Send("", 1, MPI_CHAR, sender, END_TAG, MPI_COMM_WORLD); free(toSend); } } #ifdef DEBUG fprintf(stderr, "scheduler sending complete message 2\n"); #endif //send complete message to writer process MPI_Send("", 1, MPI_CHAR, WRITER_PROCESS, COMPLETE_TAG, MPI_COMM_WORLD); }