Ticket #3326: multirecmjl.patch

File multirecmjl.patch, 5.3 KB (added by martin@…, 12 years ago)

Forces scheduler to check all cards, rather than settling on the first with no conflicts, and choose one with most input group overlap if possible.

  • scheduler.h

     
    8787    void PruneOverlaps(void);
    8888    void BuildListMaps(void);
    8989    void ClearListMaps(void);
    90     bool FindNextConflict(const RecList &cardlist,
     90    int FindNextConflict(const RecList &cardlist,
    9191                          const ProgramInfo *p, RecConstIter &iter,
    9292                          bool openEnd = false) const;
    9393    const ProgramInfo *FindConflict(const QMap<int, RecList> &reclists,
     94                                    const ProgramInfo *p, bool openEnd, int *preference) const;
     95    const ProgramInfo *FindConflict(const QMap<int, RecList> &reclists,
    9496                                    const ProgramInfo *p, bool openEnd = false) const;
    9597    void MarkOtherShowings(ProgramInfo *p);
    9698    void MarkShowingsList(RecList &showinglist, ProgramInfo *p);
  • scheduler.cpp

     
    278278            return a->recstartts < b->recstartts;
    279279    }
    280280
     281    if(a->title != b->title)
     282    {
     283        return a->title > b->title;
     284    }
     285
    281286    if (a->inputid != b->inputid)
    282287        return a->inputid < b->inputid;
    283288
     
    751756    recordidlistmap.clear();
    752757}
    753758
    754 bool Scheduler::FindNextConflict(
     759int Scheduler::FindNextConflict(
    755760    const RecList     &cardlist,
    756761    const ProgramInfo *p,
    757762    RecConstIter      &j,
    758763    bool               openEnd) const
    759764{
     765    bool found_ideal = false;
     766
    760767    bool is_conflict_dbg = false;
    761768
    762769    for ( ; j != cardlist.end(); j++)
     
    813820            GetSharedInputGroup(p->inputid, q->inputid) &&
    814821            p->GetMplexID() && (p->GetMplexID() == q->GetMplexID()))
    815822        {
     823            found_ideal = true;
    816824            continue;
    817825        }
    818826
    819827        if (is_conflict_dbg)
    820828            cout << "\n  Found conflict" << endl;
    821829
    822         return true;
     830        return -1;
    823831    }
    824832
    825833    if (is_conflict_dbg)
    826834        cout << "\n  No conflict" << endl;
    827835
    828     return false;
     836    // Actually... give multiplex/inputgroup overlaps a priority.
     837    if(found_ideal)
     838    {
     839        return 1;
     840    }else{
     841        return 0;
     842    }
    829843}
    830844
    831845const ProgramInfo *Scheduler::FindConflict(
     
    833847    const ProgramInfo        *p,
    834848    bool openend) const
    835849{
     850    int preference = 0;
     851    return FindConflict(reclists, p, openend, &preference);
     852}
     853
     854const ProgramInfo *Scheduler::FindConflict(
     855    const QMap<int, RecList> &reclists,
     856    const ProgramInfo        *p,
     857    bool openend, int *preference) const
     858{
    836859    bool is_conflict_dbg = false;
    837860
    838861    QMap<int, RecList>::const_iterator it = reclists.begin();
     
    846869
    847870        const RecList &cardlist = *it;
    848871        RecConstIter k = cardlist.begin();
    849         if (FindNextConflict(cardlist, p, k, openend))
     872        int result = FindNextConflict(cardlist, p, k, openend);
     873        if (result < 0)
    850874        {
    851875            return *k;
    852876        }
     877        // The more group overlaps the better.
     878        *preference += result;
    853879    }
    854880
    855881    return NULL;
     
    10501076
    10511077    bool openEnd = (bool)gContext->GetNumSetting("SchedOpenEnd", 0);
    10521078
     1079    int bestpreference = -1;
     1080    ProgramInfo *best_program = NULL;
     1081
    10531082    RecIter i = worklist.begin();
    10541083    while (i != worklist.end())
    10551084    {
     
    10581087            MarkOtherShowings(p);
    10591088        else if (p->recstatus == rsUnknown)
    10601089        {
    1061             const ProgramInfo *conflict = FindConflict(cardlistmap, p, openEnd);
     1090            int preference = 0;
     1091            const ProgramInfo *conflict = FindConflict(cardlistmap, p, openEnd, &preference);
    10621092            if (!conflict)
    10631093            {
     1094                cout << QString(" No conflict, preference %2 ").arg(preference);
     1095                // Decide if this is the best choice, but don't set it stone yet.
     1096                if(preference > bestpreference)
     1097                {
     1098                    bestpreference = preference;
     1099                    best_program = p;
     1100                }
     1101            }
     1102            else
     1103            {
     1104                retrylist.push_front(p);
     1105                PrintRec(p, "  #");
     1106                PrintRec(conflict, "     !");
     1107            }
     1108        }
     1109
     1110        int lastpri = p->recpriority;
     1111        QDateTime lastrecstart = p->recstartts;
     1112        const char* lastchanid = p->chanid;
     1113        i++;
     1114
     1115        // If we've moved on to a different program, or the end, save the best showing.
     1116
     1117        if(i == worklist.end() || lastrecstart != (*i)->recstartts || lastchanid != (*i)->chanid)
     1118        {
     1119            p = best_program;
     1120            if(bestpreference > -1)
     1121            {
    10641122                p->recstatus = rsWillRecord;
    10651123
    10661124                if (p->recstartts < schedTime.addSecs(90))
     
    10811139                MarkOtherShowings(p);
    10821140                PrintRec(p, "  +");
    10831141            }
    1084             else
    1085             {
    1086                 retrylist.push_front(p);
    1087                 PrintRec(p, "  #");
    1088                 PrintRec(conflict, "     !");
    1089             }
     1142            bestpreference = -1;
     1143           
    10901144        }
    1091 
    1092         int lastpri = p->recpriority;
    1093         i++;
     1145       
    10941146        if (i == worklist.end() || lastpri != (*i)->recpriority)
    10951147        {
    10961148            MoveHigherRecords();