Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #4
0
void hubMessagePut(struct paraMessage *pm)
/* Add message to central queue.  Message must be dynamically allocated. */
{
    return synQueuePut(sq, pm);
}