42 #define CACHE0_TIMEOUT_MS 30
52 #ifdef DSM_NO_MEM_CONTEXT
53 #define builderConstruct( x, a, b, c, d, e ) \
54 builderConstruct( a, b, c, d, e )
58 U32BIT moduleSize, U16BIT blockSize,
64 U16BIT blockNum, U16BIT ddbDataSize, U8BIT *pDDBData, P_ModuleData *phModuleData );
120 dsmAssert((pModule->llData[DC_MODULE_LIST ].pLLCtrl == NULL));
121 dsmAssert((pModule->llData[MODULE_ACQUIRE_LIST].pLLCtrl == NULL));
122 dsmAssert((pModule->llData[MODULE_DELETE_LIST ].pLLCtrl == NULL));
125 dsmAssert((pModule->llcLoadRequests == NULL));
128 dsmAssert((pModule->pDdbSf == 0));
131 dsmAssert((pModule->currentUseCount == 0));
134 dsmAssert((pModule->loadedCount == 0));
137 dsmAssert((pModule->highPriorityCount == 0));
139 if (pModule->pModuleBuilder)
141 builderDestroy( idp, &pModule->pModuleBuilder );
143 if (pModule->hCompModuleData)
145 dsmAssert((pModule->hCompModuleData != pModule->hModuleData));
146 moduleDataDestroy( idp, &pModule->hCompModuleData );
148 if (pModule->hModuleData)
150 moduleDataDestroy( idp, &pModule->hModuleData );
153 DSC_CmMemRelease( idp, pModule );
155 dsmDP3((
"exit DSC_ModuleDestroy\n"));
167 dsmAssert((idp != NULL));
168 dsmAssert((pModule != NULL));
170 #define MAX_CURRENT_USE_COUNT \
171 (~(0xFFFFFFFF << ((sizeof(pModule->currentUseCount) * 8) - 1)))
174 dsmAssert((pModule->currentUseCount <= MAX_CURRENT_USE_COUNT));
177 if (pModule->currentUseCount < MAX_CURRENT_USE_COUNT)
179 pModule->currentUseCount++;
188 dsmAssert((idp != NULL));
189 dsmAssert((pModule != NULL));
192 dsmAssert((pModule->currentUseCount > 0));
195 if (pModule->currentUseCount > 0)
197 pModule->currentUseCount--;
205 P_Module pModule, E_SFPriority sfPriority )
211 dsmAssert((idp != NULL));
212 dsmAssert((pModule != NULL));
213 pDC = LLParent(pModule, DC_MODULE_LIST);
214 dsmAssert((pDC != NULL));
215 if (LLInsertHead( pDC->llcModuleAcquires, pModule ))
217 target.kind = SFK_DDB;
218 target.id = pModule->moduleInfo.moduleId;
219 target.associationTag = pModule->moduleInfo.associationTag;
220 target.serviceId = (target.associationTag == INVALID_ASSOCIATION_TAG) ?
221 DSC_DataCrslGetPid(pDC) : DSC_DataCrslGetServiceId(pDC);
222 target.u.pModule = pModule;
223 dsmDP3((
"INFO: Load Module Id: %u pModule = 0x%p [timeout = %u]\n",
224 pModule->moduleInfo.moduleId, pModule,
225 pModule->moduleInfo.u.mhgp.moduleTimeout));
227 err = DSC_SectionFilterStart( idp, &target, sfPriority, &pModule->pDdbSf );
228 if (err == CLDSM_ERR_SI_QUERY_FAILED)
230 DBGLOG((DD_SF|DD_MOD),
" Treating query failure as OK")
237 err = DSC_SsectionFilterUpdatePriority( idp, pModule->pDdbSf, sfPriority, TRUE );
241 LLRemove( pModule, MODULE_ACQUIRE_LIST );
244 DEBUG_CHK( err == CLDSM_OK,
245 dsmDP1((
"ERROR: ocModuleAcquireStart %u\n", err)));
255 E_SFPriority sfPriority;
258 dsmAssert((idp != NULL));
259 dsmAssert((pModule != NULL));
261 if (pModule->pDdbSf != NULL)
263 target = pModule->pDdbSf->target;
264 sfPriority = pModule->pDdbSf->filter.priority;
265 DSC_SectionFilterStop( idp, &pModule->pDdbSf );
270 dsmAssert((pDC != NULL));
271 target.kind = SFK_DDB;
272 target.id = pModule->moduleInfo.moduleId;
273 target.associationTag = pModule->moduleInfo.associationTag;
274 target.serviceId = (target.associationTag == INVALID_ASSOCIATION_TAG) ?
275 DSC_DataCrslGetPid(pDC) : DSC_DataCrslGetServiceId(pDC);
276 target.u.pModule = pModule;
277 sfPriority = DSC_ModulePriority(pModule);
279 err = DSC_SectionFilterStart( idp, &target, sfPriority, &pModule->pDdbSf );
280 DEBUG_CHK( err == CLDSM_OK,
281 dsmDP1((
"ERROR: DSC_ModuleAcquireRestart %u\n", err)));
290 dsmAssert((idp != NULL));
291 dsmAssert((pModule != NULL));
293 LLRemove( pModule, MODULE_ACQUIRE_LIST );
296 dsmAssert((pModule->pDdbSf));
297 DSC_SectionFilterStop( idp, &pModule->pDdbSf );
316 switch (pModule->status)
322 case MS_PENDING_INFO:
324 DSC_DataCrslAcquireStop( idp, pDC, SF_PRIORITY_HIGH );
329 DSC_DataCrslAcquireStop( idp, pDC, SF_PRIORITY_LOW );
336 inList = LLCheckInListId( MODULE_ACQUIRE_LIST, pModule );
346 DSC_DataCrslAcquireStop( idp, pDC, SF_PRIORITY_LOW );
354 DSC_DataCrslAcquireStop( idp, pDC, SF_PRIORITY_LOW );
366 LLRemoveFromAll( pModule, NUM_LISTS_MODULE );
371 DSC_ModuleAbortLoadRequests( idp, pModule );
374 if (pModule->loadedCount > 0)
378 dsmAssert((pModule->status == MS_CACHED));
379 pModule->status = MS_EXPIRED;
380 LLInsertHead( idp->llcExpiredModules, pModule );
384 DSC_ModuleDestroy( idp, pModule );
392 pLoadRqst = pModule->pLoadRqst;
393 pDC = LLParent( pModule, DC_MODULE_LIST );
397 DSC_LoadRsqtFinalNotify( idp, pLoadRqst, LRS_ABORTED_LOAD_ERROR );
399 else if (!LLCount(pDC->llcDcModules))
401 DSC_DataCrslDestroy( idp, pDC );
416 dsmAssert((pModule->pDdbSf == NULL));
419 if (pModule->llcLoadRequests != NULL ||
423 pModule->cachingRules = CACHE_RULES_DEFAULT;
425 DBG3(DD_MOD,
"Up-to-date module %p, status %u, upd %u, now %u",
428 err = CLDSM_DUPLICATE_REQUEST;
432 DBG2(DD_MOD,
"REFRESH module %p, status %u, lc %u, upd %u, now %u",
437 dsmAssert((pModule->moduleInfo.blockSize == pDC->diiInfo.blockSize));
438 dsmAssert((pModule->moduleInfo.associationTag == pDC->tap.associationTag));
440 if (pModule->pModuleBuilder)
442 builderDestroy( idp, &pModule->pModuleBuilder );
444 if (pModule->hCompModuleData)
446 dsmAssert((pModule->hCompModuleData != pModule->hModuleData));
447 moduleDataDestroy( idp, &pModule->hCompModuleData );
449 if (pModule->hModuleData)
451 moduleDataDestroy( idp, &pModule->hModuleData );
453 pModule->decompressFailureCount = 0;
454 pModule->cachingRules = CACHE_RULES_DEFAULT;
455 pModule->status = MS_PENDING_DDB;
457 if (DSC_DataCrslFirstModule(pDC) == pModule &&
458 DSC_RootCrslSrgObjectReset(LLParent(pDC, OC_DATA_CAROUSEL_LIST)) == CLDSM_OK)
485 dsmAssert((pModule->loadedCount == 0));
489 case MS_PENDING_INFO:
493 pModule->decompressFailureCount = 0;
494 memset( &pModule->moduleInfo, 0,
sizeof(
S_ModuleInfo) );
497 dsmAssert((pDC != NULL));
498 pModule->moduleInfo.blockSize = pDC->diiInfo.blockSize;
499 pModule->moduleInfo.associationTag = pDC->tap.associationTag;
500 pModule->cachingRules = CACHE_RULES_DEFAULT;
502 if (pModule->pModuleBuilder)
504 builderDestroy( idp, &pModule->pModuleBuilder );
506 if (pModule->hCompModuleData)
508 dsmAssert((pModule->hCompModuleData != pModule->hModuleData));
509 moduleDataDestroy( idp, &pModule->hCompModuleData );
511 if (pModule->hModuleData)
513 moduleDataDestroy( idp, &pModule->hModuleData );
516 pModule->status = MS_PENDING_INFO;
525 pModule->cachingRules = CACHE_RULES_DEFAULT;
527 if (pModule->pModuleBuilder)
529 builderDestroy( idp, &pModule->pModuleBuilder );
531 if (pModule->hCompModuleData)
533 dsmAssert((pModule->hCompModuleData != pModule->hModuleData));
534 moduleDataDestroy( idp, &pModule->hCompModuleData );
536 if (pModule->hModuleData)
538 moduleDataDestroy( idp, &pModule->hModuleData );
541 pModule->status = MS_ACQ_FAILED;
550 pModule->cachingRules = CACHE_RULES_DEFAULT;
552 if (pModule->pModuleBuilder)
554 builderDestroy( idp, &pModule->pModuleBuilder );
556 if (pModule->hCompModuleData)
558 dsmAssert((pModule->hCompModuleData != pModule->hModuleData));
559 moduleDataDestroy( idp, &pModule->hCompModuleData );
561 if (pModule->hModuleData)
563 moduleDataDestroy( idp, &pModule->hModuleData );
565 pModule->status = MS_ACQ_ABORTED;
570 dsmDP1((
"ERROR: Illegal requested module state = %u\n", reqdState));
575 dsmDP3((
"exit DSC_ModuleResetState\n"));
580 P_Module pModuleFromList, pNextModule;
581 ListId_t moduleListId;
589 moduleListId = LListId( pDC->llcDcModules );
590 pModuleFromList = (
P_Module)LLHead( pDC->llcDcModules );
594 while (pModuleFromList)
596 pNextModule = LLNext( pModuleFromList, moduleListId );
597 if (pModuleFromList != pModule &&
598 pModuleFromList->moduleInfo.moduleId == pModule->moduleInfo.moduleId &&
599 pModuleFromList->moduleInfo.version == pModule->moduleInfo.version)
603 pModuleFromList = pNextModule;
617 E_DscError err = CLDSM_OK;
618 P_ModuleData hDecompModuleData = NULL;
620 dsmDP3((
"decompressCachedModule()\n"));
621 dsmAssert((idp != NULL));
622 dsmAssert((pModule != NULL));
626 DSC_ModuleUse( idp, pModule );
628 dsmAssert((pModule->hCompModuleData != NULL));
629 dsmAssert((pModule->hModuleData == NULL));
631 err = moduleDecompress( idp,
632 pModule->moduleInfo.moduleSize,
633 pModule->moduleInfo.originalSize,
634 pModule->hCompModuleData, &hDecompModuleData );
638 if (hDecompModuleData != NULL)
641 dsmDP3((
"INFO: Module Id: %u decompressed\n",
642 pModule->moduleInfo.moduleId));
643 moduleDataDestroy( idp, &pModule->hCompModuleData );
644 pModule->hModuleData = hDecompModuleData;
645 pModule->decompressFailureCount = 0;
649 dsmDP1((
"ERROR: Module Id: %u Rcvd: 0x%x Size: %d decompression failure - ",
650 pModule->moduleInfo.moduleId, pModule->moduleInfo.blkRcvd, pModule->moduleInfo.moduleSize));
660 pModule->decompressFailureCount++;
661 if (pModule->decompressFailureCount >=
662 MAX_MODULE_DECOMPRESS_FAILURES)
668 DSC_ModuleResetState( idp, pModule, MS_ACQ_ABORTED);
669 err = CLDSM_ERR_MODULE_ACQUISITION_FAILURE;
673 dsmDP1((
"continue\n"));
676 DSC_ModuleResetState( idp, pModule, MS_ACQ_FAILED);
678 err = CLDSM_ERR_END_OF_DATA;
683 DSC_ModuleUnUse( idp, pModule );
690 E_DscError err = CLDSM_OK;
693 pDC = LLParent(pModule, DC_MODULE_LIST);
694 pLoadRqst = pModule->pLoadRqst;
695 dsmAssert((pModule->status == MS_CACHED));
696 if (pModule->hModuleData == NULL)
698 err = DSC_ModuleDecompress( idp, pModule );
701 ERRLOG(DD_MOD,
"Decompress failed modId=%x err=%d", pModule->moduleInfo.moduleId, err)
704 if (pModule->hModuleData != NULL && pLoadRqst != NULL)
707 dsmAssert((idp->setup.ssuFuncs.saveModuleData != NULL));
708 dsmAssert((pLoadRqst->remaining >= pModule->moduleInfo.originalSize));
710 idp->setup.ssuFuncs.saveModuleData( pLoadRqst->usrRef, MAKE_MODULE_REF(pDC->dataCarouselId, pModule->moduleInfo.moduleId),
711 pModule->moduleInfo.u.ssup.offset, pModule->moduleInfo.originalSize, moduleDataPtr(pModule->hModuleData) );
713 pModule->pLoadRqst = NULL;
715 if (pLoadRqst->remaining < pModule->moduleInfo.originalSize)
721 pLoadRqst->remaining -= pModule->moduleInfo.originalSize;
722 if (pLoadRqst->remaining == 0)
724 DSC_LoadRsqtFinalNotify( idp, pLoadRqst, LRS_LOADED );
732 #include "defMemUtilsContig.h"
761 SET_POS_REL( pDDBMsgPayload, 2 );
764 READ_UINT8( pDDBMsgPayload, moduleVersion );
767 SET_POS_REL( pDDBMsgPayload, 1 );
770 ddbBlockSize = (U16BIT)(ddbMsgPayloadLen - DDB_MSG_PAYLOAD_HDR_LEN);
772 if (moduleVersion != pModInfo->version)
781 dsmDP3((
"INFO: Module Id: %u version change at DDB (ver expd: %u, rcvd: %u) - DDB discarded\n",
782 pModInfo->moduleId, pModInfo->version, moduleVersion));
784 else if (ddbBlockSize > pModInfo->blockSize)
786 dsmDP1((
"DATA ERROR: DDB Block size != DII Block size: %u, %u\n",
787 ddbBlockSize, pModInfo->blockSize));
792 if (pModule->pModuleBuilder == NULL)
794 err = builderCreate( idp, pModInfo->moduleSize,
795 pModInfo->blockSize, &pModule->pModuleBuilder );
796 pModule->status = MS_BUILDING;
805 READ_UINT16( pDDBMsgPayload, blockNum );
807 dsmDP3((
"Mod %d: Blk=%d sz=%d rcvd=%x\n", pModInfo->moduleId, blockNum, ddbBlockSize, pModInfo->blkRcvd));
809 pModInfo->blkRcvd |= 1 << blockNum;
814 builderConstruct( idp, pModule->pModuleBuilder, blockNum,
815 ddbBlockSize, pDDBMsgPayload, &hBuiltModuleData );
817 if (hBuiltModuleData)
820 builderDestroy( idp, &pModule->pModuleBuilder );
821 if (pModInfo->crslMagic == UC_MAGIC &&
822 pModInfo->u.ssup.moduleCrc != 0)
824 U32BIT crc = CDSM_UtilCalculateCRC(moduleDataPtr(hBuiltModuleData),pModInfo->moduleSize);
825 if (crc != pModInfo->u.ssup.moduleCrc)
827 ERRLOG(DD_MOD,
"DATA ERROR: crc MIS-MATCH: %u, %u", crc, pModInfo->u.ssup.moduleCrc)
828 err = CLDSM_ERR_END_OF_DATA;
831 if (!err && pModInfo->compressed)
833 dsmAssert((pModule->hModuleData == NULL));
834 dsmAssert((pModule->hCompModuleData == NULL));
835 pModule->hCompModuleData = hBuiltModuleData;
836 if (pModule->llcLoadRequests)
838 err = DSC_ModuleDecompress( idp, pModule );
843 dsmAssert((pModule->hModuleData == NULL));
844 pModule->hModuleData = hBuiltModuleData;
846 if (err == CLDSM_ERR_END_OF_DATA)
851 pModule->status = MS_PENDING_DDB;
858 DSC_ModuleAbortLoadRequests( idp, pModule );
863 pModule->status = MS_CACHED;
865 RemoveAnyDuplicate( idp, pModule );
866 if (pModInfo->crslMagic == UC_MAGIC)
868 ModuleUpdateSsu( idp, pModule );
870 else if (pModInfo->crslMagic == OC_MAGIC)
873 err = lmUpdateModule( idp, pModule );
879 sectionTimerUpdate(idp, pModule->pDdbSf, FALSE, FALSE);
899 listId = LListId( pModuleList );
900 pModuleFromList = (
P_Module)LLHead( pModuleList );
904 while (pModuleFromList)
907 if (pModuleFromList->moduleInfo.moduleId == moduleId)
912 pModuleFromList = LLNext( pModuleFromList, listId );
914 dsmDP3((
"exit DSC_ModuleListFindById: %p\n", pModuleFromList));
915 return pModuleFromList;
944 err = CLDSM_ERR_MEM_HEAP_FULL;
949 err = moduleDataCreate( idp, moduleSize, &hModuleData );
952 DSC_CmMemRelease( idp, pModuleBuilder );
953 pModuleBuilder = NULL;
957 pModuleBuilder->blockSize = blockSize;
958 pModuleBuilder->downloadSize = moduleSize;
961 pModuleBuilder->numBlocks =
962 (U16BIT)((moduleSize + blockSize - 1) / blockSize);
964 pModuleBuilder->blocksRqd = pModuleBuilder->numBlocks;
966 if (pModuleBuilder->numBlocks > MAX_BLOCKS_IN_MODULE)
969 err = CLDSM_ERR_MODULE_TOO_LARGE;
970 moduleDataDestroy( idp, &hModuleData );
971 DSC_CmMemRelease( idp, pModuleBuilder );
972 pModuleBuilder = NULL;
977 pModuleBuilder->hModuleData = hModuleData;
980 loop = (pModuleBuilder->numBlocks + 7) >> 3;
983 pModuleBuilder->blockRcvdRegister[loop] = 0x00;
990 *ppModuleBuilder = pModuleBuilder;
992 DEBUG_CHK( err == CLDSM_OK,
993 dsmDP1((
"ERROR: builderCreate: %u\n", err)));
994 dsmDP3((
"exit builderCreate -> rtn: %u\n", err));
1051 MEMPTR_SEQ_OPEN( MEM_CONTEXT, moduleDataPtr(pModuleBuilder->hModuleData), offset,
1052 pModuleBuilder->downloadSize - offset, FALSE, mpModuleData );
1054 MEMPTR_WRITE( pDDBData, mpModuleData, ddbDataSize );
1056 MEMPTR_SEQ_CLOSE( MEM_CONTEXT, pModuleBuilder->hModuleData,
1060 pModuleBuilder->blockRcvdRegister[regByteNum] |= regBitPos;
1061 pModuleBuilder->blocksRqd--;
1063 if (pModuleBuilder->blocksRqd == 0)
1068 *phModuleData = pModuleBuilder->hModuleData;
1071 pModuleBuilder->hModuleData = NULL;
1078 dsmDP1((
"DATA ERROR: builderConstruct (Current blockNum > Total numBlocks): %u, %u\n",
1079 blockNum, pModuleBuilder->numBlocks));
1080 dsmDP1((
"OR: (offset + ddbDataSize > pModuleBuilder->downloadSize): %u, %u, %u\n",
1081 offset, ddbDataSize, pModuleBuilder->downloadSize));
1083 dsmDP3((
"exit builderConstruct\n"));
1089 dsmAssert((pModule != NULL));
1091 if (pModule->llcLoadRequests != NULL)
1097 err = LLCreate( idp, pModule, MODULE_LOAD_REQUEST_LIST, &pModule->llcLoadRequests );
1101 LLInsertHead( pModule->llcLoadRequests, hLoadRqst );
1104 case SF_PRIORITY_HIGH:
1106 pModule->highPriorityCount++;
1109 case SF_PRIORITY_DIRECT:
1111 pModule->directPriorityCount++;
1120 BOOLEAN DSC_ModuleRemoveLoadRequest(
P_DsmCoreInst idp, H_Object hLoadRqst )
1125 pModule = (
P_Module)LLParent( hLoadRqst, MODULE_LOAD_REQUEST_LIST );
1126 isEmpty = LLRemove( hLoadRqst, MODULE_LOAD_REQUEST_LIST );
1127 if (memValidate(pModule))
1131 case SF_PRIORITY_HIGH:
1133 dsmAssert((pModule->highPriorityCount > 0));
1134 pModule->highPriorityCount--;
1137 case SF_PRIORITY_DIRECT:
1139 dsmAssert((pModule->directPriorityCount > 0));
1140 pModule->directPriorityCount--;
1149 LLDestroy( idp, &pModule->llcLoadRequests );
1158 dsmAssert((idp != NULL));
1159 dsmAssert((pModule != NULL));
1161 if (pModule->llcLoadRequests)
1163 pLoadRqst = LLRemoveHead( pModule->llcLoadRequests );
1166 switch (DSC_LoadRsqtPriority(pLoadRqst))
1168 case SF_PRIORITY_HIGH:
1170 dsmAssert((pModule->highPriorityCount > 0));
1171 pModule->highPriorityCount--;
1174 case SF_PRIORITY_DIRECT:
1176 dsmAssert((pModule->directPriorityCount > 0));
1177 pModule->directPriorityCount--;
1186 pLoadRqst = LLRemoveHead( pModule->llcLoadRequests );
1190 LLDestroy( idp, &pModule->llcLoadRequests );
1194 E_SFPriority DSC_ModulePriority(
P_Module pModule )
1196 return (pModule->directPriorityCount) ? SF_PRIORITY_DIRECT :
1197 (pModule->highPriorityCount) ? SF_PRIORITY_HIGH : SF_PRIORITY_LOW;
Header to the dataCarousel module - functions/methods for creating/destroying and managing attributes...
U32BIT STB_OSGetClockMilliseconds(void)
Get Current Computer Clock Time.
General include file for clDsm library internal definitions.
void DSC_LoadRsqtAbort(P_DsmCoreInst idp, P_RootLoadRqst pLoadRqst)
Force abort (on error) any type of load request Finalise the load request (notify client) and destroy...
Header to the loadMgr module.
Header to the sectionTimer module.
Header to the cacheMgr module.
Header to the moduleDecompress module.
void DSC_ModuleDelete(P_DsmCoreInst idp, P_Module pModule)
Destroy the module and destroy parent DC if now empty.
void DSC_ModuleDeleteDcTidyUp(P_DsmCoreInst idp, P_Module pModule)
Delete module and destroy parent DC if now empty.
void DSC_ModuleAcquireStop(P_DsmCoreInst idp, P_Module pModule)
Stop aquisition of module.
E_DscError DSC_ModuleAcquireStart(P_DsmCoreInst idp, P_Module pModule, E_SFPriority sfPriority)
Start aquisition of module.
E_DscError DSC_ModuleAcquireRestart(P_DsmCoreInst idp, P_Module pModule)
Restart aquisition of module.
Header to the 'module' module - Functions/methods for creating/destroying and managing attributes of ...
eader to the clDsmUtils module.
Header to the moduleData module.
Function prototypes for operating system.