/*! * \brief Calculates the time the job has been waiting at the specified * priority. * * Adds to the totalTime and totalJobs kept in the thread pool statistics * structure. * * \internal */ static void CalcWaitTime( /*! . */ ThreadPool *tp, /*! . */ ThreadPriority p, /*! . */ ThreadPoolJob *job) { struct timeval now; long diff; assert(tp != NULL); assert(job != NULL); gettimeofday(&now, NULL); diff = DiffMillis(&now, &job->requestTime); switch (p) { case LOW_PRIORITY: StatsAccountLQ(tp, diff); break; case MED_PRIORITY: StatsAccountMQ(tp, diff); break; case HIGH_PRIORITY: StatsAccountHQ(tp, diff); break; default: assert(0); } }
/**************************************************************************** * Function: BumpPriority * * Description: * Determines whether any jobs * need to be bumped to a higher priority Q and bumps them. * * tp->mutex must be locked. * Internal Only. * Parameters: * ThreadPool *tp *****************************************************************************/ static void BumpPriority( ThreadPool *tp ) { int done = 0; struct timeval now; unsigned long diffTime = 0; ThreadPoolJob *tempJob = NULL; assert( tp != NULL ); gettimeofday(&now, NULL); while( !done ) { if( tp->medJobQ.size ) { tempJob = ( ThreadPoolJob *) tp->medJobQ.head.next->item; diffTime = DiffMillis( &now, &tempJob->requestTime ); if( diffTime >= ( tp->attr.starvationTime ) ) { // If job has waited longer than the starvation time // bump priority (add to higher priority Q) StatsAccountMQ( tp, diffTime ); ListDelNode( &tp->medJobQ, tp->medJobQ.head.next, 0 ); ListAddTail( &tp->highJobQ, tempJob ); continue; } } if( tp->lowJobQ.size ) { tempJob = ( ThreadPoolJob *) tp->lowJobQ.head.next->item; diffTime = DiffMillis( &now, &tempJob->requestTime ); if( diffTime >= ( tp->attr.maxIdleTime ) ) { // If job has waited longer than the starvation time // bump priority (add to higher priority Q) StatsAccountLQ( tp, diffTime ); ListDelNode( &tp->lowJobQ, tp->lowJobQ.head.next, 0 ); ListAddTail( &tp->medJobQ, tempJob ); continue; } } done = 1; } }