void doJobs(struct calcJob *jobList) { struct calcJob *job; for (job = jobList; job != NULL; job = job->next) synQueuePut(toDo, job); uglyTime("To load syn queue"); for (job = jobList; job != NULL; job = job->next) synQueueGet(done); }
void *workerBee(void *v) /* Wait for jobs, and then eat them. */ { struct calcJob *job; for (;;) { job = synQueueGet(toDo); bigCalc(job->output, job->end - job->start, job->start, job->end); synQueuePut(done, job); } }
void *computeDistance(void *thread_ID) { struct microDataDistance *geneDistArray = NULL; struct microData *curGene; int baseGenesPerThread, genesPerThread, rmdrPerThread, rmdr, xtra; int subListSize; int i; /* offset = thread ID */ int offset = *((int *)thread_ID); /* create subList size for each thread to process */ baseGenesPerThread = geneCount / numThreads; rmdr = geneCount % numThreads; rmdrPerThread = rmdr / numThreads; xtra = rmdr % numThreads; genesPerThread = baseGenesPerThread + rmdrPerThread; subListSize = (offset == numThreads-1) ? genesPerThread + xtra : genesPerThread; /* each thread positions initial current gene */ curGene = geneList; for (i = 0; i < offset*genesPerThread; i++) curGene = curGene->next; /* compute the pairwise experiment distances */ for (i = 0; i < subListSize; i++, curGene = curGene->next) { AllocArray(geneDistArray, geneCount); calcDistances(geneDistArray, curGene, geneList, weights); qsort(geneDistArray, geneCount, sizeof(geneDistArray[0]), cmpMicroDataDistance); synQueuePut( synQ, geneDistArray ); pthread_mutex_lock( &mutexDotOut ); dotOut(); pthread_mutex_unlock( &mutexDotOut ); } pthread_exit(NULL); }
void hubMessagePut(struct paraMessage *pm) /* Add message to central queue. Message must be dynamically allocated. */ { return synQueuePut(sq, pm); }