int checkPart (int partid,int partidx,int partsrno,int slotIndex) { int jid,m,tt; /* we have found slots for all jobs for this part */ if (partidx >= parts[partid].totjobs) return 1; jid = parts[partid].jobs[partidx]; for (tt=slotIndex;tt<tsec;tt++) { for (m=0;m<total_machines;m++) { if (!machineCanDo (m,jid)) continue; if (checkSlotsFor (m,jid,tt)) { markSlots(m,partid,partsrno,jid,tt,jobs[jid].rtime); if (checkPart (partid,partidx+1,partsrno,tt+jobs[jid].rtime)) return 1; else { markSlots(m,-1,-1,-1,tt,jobs[jid].rtime); return 0; } } } } return 0; }
MOZ_ALWAYS_INLINE void ForkJoinNursery::traceObject(ForkJoinNurseryCollectionTracer *trc, JSObject *obj) { const Class *clasp = obj->getClass(); if (clasp->trace) clasp->trace(trc, obj); if (!obj->isNative()) return; if (!obj->hasEmptyElements()) markSlots(obj->getDenseElements(), obj->getDenseInitializedLength()); HeapSlot *fixedStart, *fixedEnd, *dynStart, *dynEnd; obj->getSlotRange(0, obj->slotSpan(), &fixedStart, &fixedEnd, &dynStart, &dynEnd); markSlots(fixedStart, fixedEnd); markSlots(dynStart, dynEnd); }
MOZ_ALWAYS_INLINE void ForkJoinNursery::markSlots(HeapSlot *vp, uint32_t nslots) { markSlots(vp, vp + nslots); }