40 #define HASH_NUM (1 << HASH_SHIFT)
41 #define HASH_MASK (HASH_NUM - 1)
42 #define HNDL_MAGIC 0xABBA0000
43 #define HNDL_MASK 0xFFFF0000
50 typedef struct s_SectionFilterHeap
55 U16BIT sectionFiltersInUse;
63 } S_SecFilterHeap, *P_SecFilterHeap;
67 #ifdef ACCELERATE_CAROUSEL_LOADING
70 typedef struct _accelerate_carousel_loading_struct
74 U16BIT storedSectionsNB;
75 U16BIT SectionsReinjection;
76 BOOLEAN bLargeDDBFilterSet;
77 U16BIT requestedModidPos;
79 } accelerateCarouselLoading_t;
81 extern accelerateCarouselLoading_t accCarouselLoadingInfos;
85 static U32BIT sfStatsNum = 0;
86 static U32BIT sfStatsMax = 0;
91 static void SectionFilterHeapInit( P_SecFilterHeap pSfHeap );
98 #ifdef ACCELERATE_CAROUSEL_LOADING
100 E_SecFiltKind sfKind,
102 E_SFPriority sfPriority,
106 extern E_DscError requestedModuleIdSet(U16BIT moduleID);
108 extern E_DscError requestedModuleIdReset(U16BIT moduleID);
127 void **pSectionFilterHeap, U32BIT *pHeapSize )
129 E_DscError err = CLDSM_OK;
130 P_SecFilterHeap pSfHeap;
133 dsmDP3((
"DSC_SsectionFilterHeapCreate()\n"));
134 dsmAssert((idp != NULL));
137 size +=
sizeof(S_SecFilterHeap);
139 *pSectionFilterHeap = NULL;
141 pSfHeap = (P_SecFilterHeap)idp->setup.allocFunc( size );
146 DBGLOG(DD_SF,
"Section Filter heap size = %u bytes", size)
148 pSfHeap->totalFilters = *pHeapSize;
150 pSfHeap->activeCounter = 0x0000;
152 SectionFilterHeapInit( pSfHeap );
154 *pSectionFilterHeap = pSfHeap;
160 ERRPRINT(
"Failed to get section filter heap (%u); sz=%u",*pHeapSize,size)
161 err = CLDSM_ERR_ALLOC_FAILED;
164 dsmDP3(("exit DSC_SsectionFilterHeapCreate -> rtn: %u\n", err));
173 P_SecFilterHeap pSfHeap;
177 dsmDP3((
"DSC_SsectionFilterHeapReset()\n"));
179 ASSERT( idp != NULL )
180 pSfHeap = idp->sectionFilterHeap;
181 ASSERT( pSfHeap != NULL )
184 if (pSfHeap->sectionFiltersInUse != 0)
186 ERRPRINT(
"************ Section filters still in USE! %d *************",
187 pSfHeap->sectionFiltersInUse )
188 for (ndx = 0; ndx != HASH_NUM; ndx++)
190 pSFHead = pSfHeap->sfActiveHeads + ndx;
191 while (*pSFHead != NULL)
195 ERRPRINT(
"handle=0x%x targetKind=%d status=%d targetId=0x%x", pSF->handle, pSF->target.kind, pSF->status, pSF->target.id )
197 DSC_SectionFilterStop(idp, &pSF);
199 if (!pSfHeap->sectionFiltersInUse)
204 SectionFilterHeapInit( pSfHeap );
206 dsmDP3(("exit DSC_SsectionFilterHeapReset\n"));
219 E_DscError err = CLDSM_OK;
223 dsmDP3((
"DSC_SectionFilterStart()\n"));
224 dsmAssert((idp != NULL));
225 dsmAssert((pTarget != NULL));
226 dsmAssert((ppSF != NULL));
230 pSF = AllocSectionFilterBlock( idp );
234 dsmDP1((
"ERROR: Limited section filters not yet supported\n"));
236 err = CLDSM_ERR_SECTION_FILTER_HEAP_FULL;
238 else if (pTarget->u.pRC == NULL)
240 ERRPRINT(
"target ref is NULL")
241 err = CLDSM_ERR_INVALID_SI_QUERY_REF;
242 FreeSectionFilterBlock( idp, pSF );
246 switch (pTarget->kind)
250 pSF->filter.tableId = DSIDII_ID;
251 pSF->filter.tableIdExt = 0x0000;
252 pSF->filter.tableIdExtMask = 0xFFFE;
253 #ifdef ACCELERATE_CAROUSEL_LOADING
254 if (FALSE == accCarouselLoadingInfos.bLargeDDBFilterSet)
256 sectionLargeDDBFilterStart( idp, SFK_DDB, pTarget->serviceId,
257 SF_PRIORITY_LOW, &accCarouselLoadingInfos.largeDDBFilter,
258 pTarget->associationTag);
259 accCarouselLoadingInfos.bLargeDDBFilterSet = TRUE;
266 pSF->filter.tableId = DSIDII_ID;
267 pSF->filter.tableIdExt = (U16BIT)pTarget->id;
268 pSF->filter.tableIdExtMask = 0xFFFE;
276 pSF->filter.tableId = DSIDII_ID;
277 pSF->filter.tableIdExt = (U16BIT)pTarget->id;
278 pSF->filter.tableIdExtMask = 0xFFFF;
284 pSF->filter.tableId = DDB_ID;
285 pSF->filter.tableIdExt = (U16BIT)pTarget->id;
286 pSF->filter.tableIdExtMask = 0xFFFF;
287 #ifdef ACCELERATE_CAROUSEL_LOADING
288 requestedModuleIdSet(pTarget->id);
292 case SFK_STREAM_DESCR:
297 pSF->filter.tableId = STREAM_DESCR_ID;
298 pSF->filter.tableIdExt = (U16BIT)pTarget->id;
299 pSF->filter.tableIdExtMask = 0xFFFF;
304 ERRPRINT(
"section filter kind = %u", pTarget->kind)
305 err = CLDSM_ERR_INTERNAL;
311 ERRLOG(DD_SF,
"setup fail: err=%d", err)
312 FreeSectionFilterBlock( idp, pSF );
317 pSF->tms.mainTimerHandle = NULL;
318 pSF->tms.nextTimerHandle = NULL;
319 pSF->tms.nextDuration = 0;
321 pSF->filter.priority = (U8BIT)sfPriority;
322 pSF->target = *pTarget;
324 if (pTarget->associationTag == INVALID_ASSOCIATION_TAG)
327 pSF->filter.pid = pTarget->serviceId;
328 err = DSC_SectionFilterCommit( idp, pSF );
335 ERRLOG(DD_SF,
"Commit fail: err=%d", err)
336 FreeSectionFilterBlock( idp, pSF );
342 siQueryData.kind = SIQUERY_PID;
343 siQueryData.serviceId = pTarget->serviceId;
344 siQueryData.associationTag = pTarget->associationTag;
345 err =
siQueryStart( idp, &siQueryData, (
void *) pSF, &siQueryResult );
351 DBGLOG(DD_SF,
"PENDING kind=%d qhdl=%p\n", siQueryResult.kind, siQueryResult.data.queryHandle);
352 pSF->u.pPendingSiQueryRef = siQueryResult.data.queryHandle;
353 pSF->status = SFA_PENDING;
361 pSF->filter.pid = siQueryResult.data.pid;
362 if (pSF->filter.pid == 0)
364 dsmDP1((
"zero PID!"));
365 err = CLDSM_ERR_INVALID_SI_INFO;
369 DBGLOG(DD_SF,
"kind=%d pid=0x%x\n", siQueryResult.kind, siQueryResult.data.pid);
370 err = DSC_SectionFilterCommit( idp, pSF );
376 dsmDP1((
"DSC_SectionFilterCommit.err = %x", err));
381 ERRLOG(DD_SF,
"Query fail: err=%d", err)
382 FreeSectionFilterBlock( idp, pSF );
388 dsmDP3(("exit DSC_SectionFilterStart -> rtn: %u\n", err));
405 E_DscError DSC_SsectionFilterUpdatePriority(
P_DsmCoreInst idp,
407 BOOLEAN latchHighest )
409 E_DscError err = CLDSM_OK;
411 dsmDP3((
"DSC_SsectionFilterUpdatePriority()\n"));
412 dsmAssert((idp != NULL));
413 dsmAssert((pSF != NULL));
416 sectionTimerUpdate(idp, pSF, FALSE, TRUE);
421 if ((newSfPriority != pSF->filter.priority) &&
422 !((latchHighest == TRUE) &&
423 (newSfPriority < pSF->filter.priority)))
426 pSF->filter.priority = (U8BIT)newSfPriority;
440 DBGLOG(DD_SF,
"pSF->u.filterHandle=%p", pSF->u.filterHandle)
444 if (idp->setup.sfPriorityChangeFunc != NULL)
446 idp->setup.sfPriorityChangeFunc( idp->setup.sfmInstance,
447 pSF->u.filterHandle, (H_DscSFRef)pSF->handle, newSfPriority );
459 ERRPRINT(
"Illegal section filter status = %u\n", pSF->status )
460 err = CLDSM_ERR_INTERNAL;
465 DBG3(DD_SF, "exit DSC_SsectionFilterUpdatePriority -> rtn: %u\n", err)
479 #ifdef ACCELERATE_CAROUSEL_LOADING
483 dsmDP3((
"DSC_SectionFilterStop()\n"));
484 dsmAssert((idp != NULL));
485 dsmAssert((ppSF != NULL));
493 #ifdef ACCELERATE_CAROUSEL_LOADING
494 if (pSF->target.kind == SFK_DDB)
496 pTargetModule = pSF->target.u.pModule;
497 requestedModuleIdReset(pTargetModule->moduleInfo.moduleId);
502 sectionTimerRemove(idp, pSF);
507 DBGLOG(DD_SF,
"SFA_PENDING 0x%x", pSF->u.pPendingSiQueryRef)
513 dsmAssert((pSF->u.pPendingSiQueryRef != NULL));
517 pSF->u.pPendingSiQueryRef = NULL;
522 DBGLOG(DD_SF, "SFA_COMMITTED 0x%x", pSF->u.filterHandle)
525 idp->setup.delSectionFilterFunc( idp->setup.sfmInstance, pSF->u.filterHandle,
526 (H_DscSFRef)pSF->handle );
533 DBGLOG(DD_SF, "SFA_ABORTED")
538 dsmDP1(("ERROR: Illegal section filter status = %u\n", pSF->status));
540 if (idp->setup.errorFunc)
542 idp->setup.errorFunc( CLDSM_ERR_INTERNAL, NULL);
546 FreeSectionFilterBlock( idp, pSF );
550 dsmDP3((
"exit DSC_SectionFilterStop\n"));
562 dsmAssert((idp != NULL));
563 dsmAssert((pSF != NULL));
564 dsmAssert((pSF->status != SFA_COMMITTED));
565 dsmAssert((pSF->filter.pid != 0));
567 DBGLOG(DD_SF,
" PID=0x%x, tid=0x%x tidExt=0x%x msk=0x%x hdl=0x%x",
568 pSF->filter.pid, pSF->filter.tableId, pSF->filter.tableIdExt,
569 pSF->filter.tableIdExtMask, pSF->handle)
572 pSF->status = SFA_COMMITTED;
575 pSF->u.filterHandle = idp->setup.addSectionFilterFunc( idp->setup.sfmInstance,
576 &pSF->filter, pSF->handle );
578 if (!pSF->u.filterHandle)
580 ERRLOG(DD_SF,
"addSectionFilterFunc. returned NULL")
581 pSF->status = SFA_ABORTED;
582 err = CLDSM_ERR_SYSTEM_ADD_SECTION_FILTER;
587 SectionTimerArm(idp, pSF);
591 DBGLOG(DD_SF,
" rtn: %u", err)
603 dsmDP3((
"DSC_SectionFilterAbortDependants()\n"));
604 dsmAssert((idp != NULL));
605 dsmAssert((pSectionFilter != NULL));
606 dsmAssert(((pSectionFilter->status == SFA_PENDING) ||
607 (pSectionFilter->status == SFA_ABORTED)));
609 pSectionFilter->status = SFA_ABORTED;
611 switch (pSectionFilter->target.kind)
619 pRC = pSectionFilter->target.u.pRC;
620 dsmAssert((pRC->status == RCS_BOOTING));
626 dsmAssert((pRC->pDsiSf));
627 DSC_SectionFilterStop( idp, &pRC->pDsiSf );
630 DSC_RootCrslAbortLoadRequest( idp, pRC );
644 DSC_DataCrslDelete( idp, pSectionFilter->target.u.pDC );
665 case SFK_STREAM_DESCR:
670 dsmDP1((
"ERROR: Illegal section filter kind = %u\n",
671 pSectionFilter->target.kind));
675 if (idp->setup.errorFunc)
677 idp->setup.errorFunc( CLDSM_ERR_INTERNAL, NULL);
682 dsmDP3((
"exit DSC_SectionFilterAbortDependants\n"));
690 P_SecFilterHeap pSfHeap;
694 pSfHeap = idp->sectionFilterHeap;
696 pSectionFilter = pSfHeap->sfActiveHeads[handle & HASH_MASK];
697 while (pSectionFilter != NULL)
699 if (pSectionFilter->handle == handle)
703 pSectionFilter = pSectionFilter->nextBlock;
705 return pSectionFilter;
713 static void SectionFilterHeapInit( P_SecFilterHeap pSfHeap )
718 dsmDP3((
"SectionFilterHeapInit()\n"));
719 dsmAssert((pSfHeap != NULL));
721 dsmDP4((
"pSfHeap->sectionFiltersInUse = %d", pSfHeap->sectionFiltersInUse));
723 pSfHeap->sectionFiltersInUse = 0;
725 p_secFlt = pSfHeap->sectionFilters;
726 pSfHeap->sfFreeListHead = p_secFlt;
727 total = pSfHeap->totalFilters;
730 for (i = 0; i != total; i++, p_secFlt++)
733 p_secFlt->filter.pid = 0;
734 p_secFlt->filter.priority = (U8BIT)SF_PRIORITY_LOW;
735 p_secFlt->filter.tableId = 0;
736 p_secFlt->filter.tableIdExt = 0;
737 p_secFlt->filter.tableIdExtMask = 0x0000;
739 p_secFlt->status = SFA_INITIAL;
740 p_secFlt->target.kind = SFK_NONE;
741 p_secFlt->target.id = 0;
742 p_secFlt->target.u.pRC = NULL;
744 p_secFlt->handle = 0;
747 p_secFlt->nextBlock = p_secFlt + 1;
751 p_secFlt->nextBlock = NULL;
752 pSfHeap->sfFreeListTail = p_secFlt;
754 for (i = 0; i != HASH_NUM; i++)
756 pSfHeap->sfActiveHeads[i] = NULL;
759 dsmDP3((
"exit SectionFilterHeapInit\n"));
767 P_SecFilterHeap pSfHeap;
771 dsmDP3((
"AllocSectionFilterBlock()\n"));
772 dsmAssert((idp != NULL));
773 dsmAssert((idp->sectionFilterHeap != NULL));
775 pSfHeap = idp->sectionFilterHeap;
779 if (sfStatsMax < sfStatsNum)
780 sfStatsMax = sfStatsNum;
781 ERRPRINT(
"sfStatsNum=%d sfStatsMax=%d", sfStatsNum, sfStatsMax)
784 dsmAssert((pSfHeap->sectionFiltersInUse <= pSfHeap->totalFilters));
786 handle = pSfHeap->activeCounter++;
789 if (pSfHeap->sectionFiltersInUse < pSfHeap->totalFilters)
791 ASSERT(pSfHeap->sfFreeListHead != NULL)
793 pSfHeap->sectionFiltersInUse++;
796 pSectionFilter = pSfHeap->sfFreeListHead;
797 pSectionFilter->handle = handle;
799 pSfHeap->sfFreeListHead = pSectionFilter->nextBlock;
800 if (pSfHeap->sfFreeListHead == NULL)
802 pSfHeap->sfFreeListTail = NULL;
805 handle = handle & HASH_MASK;
806 pSectionFilter->nextBlock = pSfHeap->sfActiveHeads[handle];
807 pSfHeap->sfActiveHeads[handle] = pSectionFilter;
808 DBGLOG(DD_SF,
"rtn: %p handle=0x%x", pSectionFilter, pSectionFilter->handle)
812 ERRPRINT(
"no free section filters")
814 return pSectionFilter;
823 P_SecFilterHeap pSfHeap;
826 DBGLOG(DD_SF,
" handle=0x%x", pSectionFilter->handle)
827 dsmAssert((idp != NULL));
828 dsmAssert((pSectionFilter != NULL));
830 pSfHeap = idp->sectionFilterHeap;
833 ERRPRINT(
"sfStatsNum=%d sfStatsMax=%d", sfStatsNum, sfStatsMax)
838 (pSectionFilter >= &pSfHeap->sectionFilters[0]) &&
839 (pSectionFilter < &pSfHeap->sectionFilters[ pSfHeap->totalFilters ])
841 dsmAssert((pSfHeap->sectionFiltersInUse > 0));
842 dsmAssert((pSfHeap->sectionFiltersInUse <= pSfHeap->totalFilters));
843 dsmAssert(((pSectionFilter->handle&HNDL_MASK) == HNDL_MAGIC));
844 if ((pSectionFilter->handle&HNDL_MASK) == HNDL_MAGIC)
846 ppSfActiveHead = pSfHeap->sfActiveHeads + (pSectionFilter->handle & HASH_MASK);
847 while (*ppSfActiveHead != NULL)
849 if (*ppSfActiveHead == pSectionFilter)
851 *ppSfActiveHead = pSectionFilter->nextBlock;
854 ppSfActiveHead = &((*ppSfActiveHead)->nextBlock);
859 pSectionFilter->filter.pid = 0;
860 pSectionFilter->filter.priority = (U8BIT)SF_PRIORITY_LOW;
861 pSectionFilter->filter.tableId = 0;
862 pSectionFilter->filter.tableIdExt = 0;
863 pSectionFilter->filter.tableIdExtMask = 0x0000;
865 dsmDP4((
"pSectionFilter = %p", pSectionFilter));
866 pSectionFilter->status = SFA_INITIAL;
867 pSectionFilter->target.kind = SFK_NONE;
868 pSectionFilter->target.id = 0;
869 pSectionFilter->target.u.pRC = NULL;
871 pSectionFilter->handle = 0;
873 pSectionFilter->nextBlock = NULL;
876 if (pSfHeap->sfFreeListTail == NULL)
878 ASSERT( pSfHeap->sfFreeListHead == NULL )
879 pSfHeap->sfFreeListHead = pSectionFilter;
883 pSfHeap->sfFreeListTail->nextBlock = pSectionFilter;
885 pSfHeap->sfFreeListTail = pSectionFilter;
887 pSfHeap->sectionFiltersInUse--;
889 dsmDP3((
"exit FreeSectionFilterBlock\n"));
892 #ifdef ACCELERATE_CAROUSEL_LOADING
895 E_SecFiltKind sfKind,
897 E_SFPriority sfPriority,
902 E_DscError err = CLDSM_OK;
906 dsmDP3((
"sectionLargeDDBFilterStart()\n"));
907 dsmAssert((idp != NULL));
908 dsmAssert((pSectionFilter != NULL));
911 *pSectionFilter = NULL;
913 pSF = AllocSectionFilterBlock( idp );
918 dsmDP1((
"ERROR: Limited section filters not yet supported\n"));
920 err = CLDSM_ERR_SECTION_FILTER_HEAP_FULL;
924 pSF->target.kind = sfKind;
925 pSF->target.u.pRC = 0;
926 pSF->hCarousel = NULL;
928 pSF->target.id = 145;
931 pSF->filter.tableId = DDB_ID;
932 pSF->filter.tableIdExt = 0xFFFF;
934 pSF->filter.tableIdExtMask = 0x0000;
938 pSF->filter.priority = sfPriority;
941 siQueryData.kind = SIQUERY_PID;
942 siQueryData.service_id = service_id;
943 siQueryData.data.association_tag = assocTag;
945 err =
siQueryStart( idp, &siQueryData, (
void *) pSF, &siQueryResult );
950 pSF->u.pPendingSiQueryRef = siQueryResult.data.queryHandle;
951 pSF->status = SFA_PENDING;
952 *pSectionFilter = pSF;
958 pSF->filter.PID = siQueryResult.data.PID;
959 err = DSC_SectionFilterCommit( idp, pSF );
962 *pSectionFilter = pSF;
967 FreeSectionFilterBlock( idp, pSF );
981 DEBUG_CHK( err == CLDSM_OK,
982 dsmDP1((
"ERROR: sectionLargeDDBFilterStart %u\n", err)));
991 P_SecFilterInfo *pSectionFilter = &accCarouselLoadingInfos.largeDDBFilter;
993 dsmDP3((
"largeDDBsectionFilterStop()\n"));
994 dsmAssert((idp != NULL));
995 dsmAssert((pSectionFilter != NULL));
996 dsmAssert((*pSectionFilter != NULL));
998 pSF = *pSectionFilter;
1004 switch (pSF->status)
1012 dsmAssert((pSF->u.pPendingSiQueryRef != NULL));
1016 pSF->u.pPendingSiQueryRef = NULL;
1023 idp->setup.delSectionFilterFunc( pSF->u.filterHandle, (H_DscSFRef)pSF,
1036 dsmDP1((
"ERROR: Illegal section filter status = %u\n",
1041 if (idp->setup.errorFunc)
1043 idp->setup.errorFunc( CLDSM_ERR_INTERNAL, NULL);
1047 FreeSectionFilterBlock( idp, pSF );
1048 *pSectionFilter = NULL;
1051 dsmDP3((
"exit largeDDBsectionFilterStop\n"));
Header to the dataCarousel module - functions/methods for creating/destroying and managing attributes...
General include file for clDsm library internal definitions.
Header to the loadMgr module.
Header to the sectionTimer module.
void DSC_ModuleDeleteDcTidyUp(P_DsmCoreInst idp, P_Module pModule)
Delete module and destroy parent DC if now empty.
void siQueryAbortPending(P_DsmCoreInst idp, P_SiQuery pSiQueryRef)
Aborts the specified SI Query before completion. Stops/destroys duplicate queries. For original queries or duplicate queries that have expired parents (and no further duplicates) calls stop SI Query callback on relevant query.
Header to dsmStreamEvent module - functions for managing DSM streamEvent.
Header to the sectionFilter module.
Header to the objectCarousel module.
E_DscError siQueryStart(P_DsmCoreInst idp, P_SIQueryRequest pQueryData, void *queryTarget, P_SIQueryResult pResult)
Starts an SI Query. First tests if we have already made this query and the results are stored or stil...
Header to siQuery module - functions for managing SI queries.
Header to the 'module' module - Functions/methods for creating/destroying and managing attributes of ...