job *get_recycled_job() { job *pjob; pthread_mutex_lock(recycler.rc_mutex); pjob = next_job_from_recycler(&recycler.rc_jobs,&recycler.rc_iter); if (pjob == NULL) recycler.rc_iter = -1; pthread_mutex_unlock(recycler.rc_mutex); if (pjob != NULL) pjob->ji_being_recycled = FALSE; return(pjob); } /* END get_recycled_job() */
void *remove_some_recycle_jobs( void *vp) { int i; all_jobs_iterator *iter = NULL; job *pjob = NULL; pthread_mutex_lock(recycler.rc_mutex); recycler.rc_jobs.lock(); iter = recycler.rc_jobs.get_iterator(); recycler.rc_jobs.unlock(); for (i = 0; i < JOBS_TO_REMOVE; i++) { pjob = next_job_from_recycler(&recycler.rc_jobs,iter); if (pjob == NULL) break; if (LOGLEVEL >= 10) log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, pjob->ji_qs.ji_jobid); pjob->ji_being_recycled = FALSE; //Need to set the being_recycled flag to false or //or remove_job won't remove it. remove_job(&recycler.rc_jobs, pjob); unlock_ji_mutex(pjob, __func__, "1", LOGLEVEL); free(pjob->ji_mutex); memset(pjob, 255, sizeof(job)); free(pjob); } pthread_mutex_unlock(recycler.rc_mutex); if (iter != NULL) delete iter; return(NULL); } /* END remove_some_recycle_jobs() */