Ejemplo n.º 1
0
void clearFinishedJobs(struct joblist* jlist) {
    struct job* job = jlist->first;
    while (job != 0) {
	if (isJobEmpty(job->jid) == 1) { //no processes - delete job.
	    close(job->fd);
	    free(job);
	    removeJobFromList(jlist, job);		    
	}
	job = job->next;
    }  
}
Ejemplo n.º 2
0
PSchedule Schedule :: crossViaPreviewAllBlocks(PSchedule schedule, float permissibleResourceRemains)
{
    PSchedule earlySchedule =
    (this->type() == ScheduleTypeEarly) ? shared_from_this() : this->earlySchedule();
    PSchedule earlySchedule2 =
    (schedule->type() == ScheduleTypeEarly) ? schedule : schedule->earlySchedule();
    
    auto denseJobsBlocks = earlySchedule->denseJobsBlocks(permissibleResourceRemains);
    auto denseJobsBlocks2 = earlySchedule2->denseJobsBlocks(permissibleResourceRemains);
    
    auto jobsList = *earlySchedule->activeList()->jobList();
    auto jobsList2 = *earlySchedule2->activeList()->jobList();
    vector<Job *> childJobsList(0);
    
    while (denseJobsBlocks->size() != 0 || denseJobsBlocks2->size() != 0) {
        
        shared_ptr<pair<PVectorJobs, float>> bestBlock = nullptr;
        vector<Job *> *bestJobsList = NULL;
        
        shared_ptr<vector<shared_ptr<pair<PVectorJobs, float>>>>
        bestDenseJobsBlocks = nullptr, otherDenseJobsBlocks = nullptr;
        
        if (denseJobsBlocks->size() != 0 && denseJobsBlocks2->size() == 0) {
            bestBlock = (*denseJobsBlocks)[0];
            bestJobsList = &jobsList;
            bestDenseJobsBlocks = denseJobsBlocks;
            otherDenseJobsBlocks = denseJobsBlocks2;
        }
        else if (denseJobsBlocks->size() == 0 && denseJobsBlocks2->size() != 0) {
            bestBlock = (*denseJobsBlocks2)[0];
            bestJobsList = &jobsList2;
            bestDenseJobsBlocks = denseJobsBlocks2;
            otherDenseJobsBlocks = denseJobsBlocks;
        }
        else {
            auto block = (*denseJobsBlocks)[0], block2 = (*denseJobsBlocks2)[0];
            if (block->second < block2->second) {
                bestBlock = block;
                bestJobsList = &jobsList;
                bestDenseJobsBlocks = denseJobsBlocks;
                otherDenseJobsBlocks = denseJobsBlocks2;
            }
            else {
                bestBlock = block2;
                bestJobsList = &jobsList2;
                bestDenseJobsBlocks = denseJobsBlocks2;
                otherDenseJobsBlocks = denseJobsBlocks;
            }
        }
        
        while (bestJobsList->size()) {
            
            Job *job = (*bestJobsList)[0];
            
            childJobsList.push_back(job);
            
            removeJobFromList(job, &jobsList);
            removeJobFromList(job, &jobsList2);
            
            removeJobFromList(job, bestBlock->first.get());
            
            // remove blocks with current job
            for (int j=0; j<bestDenseJobsBlocks->size();) {
                auto b = (*bestDenseJobsBlocks)[j];
                if (b != bestBlock && jobInList(job, b->first.get())) {
                    bestDenseJobsBlocks->erase(bestDenseJobsBlocks->begin() + j);
                }
                else {
                    j++;
                }
            }
            for (int j=0; j<otherDenseJobsBlocks->size();) {
                if (jobInList(job, (*otherDenseJobsBlocks)[j]->first.get())) {
                    otherDenseJobsBlocks->erase(otherDenseJobsBlocks->begin() + j);
                }
                else {
                    j++;
                }
            }
            
            if (!bestBlock->first->size()) {
                bestDenseJobsBlocks->erase(bestDenseJobsBlocks->begin());
                break;
            }
        }
    }
    
    if (childJobsList.size() != earlySchedule->activeList()->size()) {
        vector<Job *> *bestJobsList = NULL;
        if (earlySchedule->duration() < earlySchedule2->duration()) bestJobsList = &jobsList;
        else bestJobsList = &jobsList2;
        childJobsList.insert(childJobsList.end(), bestJobsList->begin(), bestJobsList->end());
    }
    
    ActiveList childActiveList(&childJobsList);
    return Schedule :: scheduleEarly(&childActiveList, _resources);
}