コード例 #1
0
ファイル: demangle.c プロジェクト: seyko2/cfront-3
/* 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
		}
	}
}
コード例 #2
0
/*
 * 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);
}