DSMCC  17.9.0
 All Data Structures Files Functions Typedefs
sfm_cache.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright © 2014 The DTVKit Open Software Foundation Ltd (www.dtvkit.org)
3  * Copyright © 2004 Ocean Blue Software Ltd
4  *
5  * This file is part of a DTVKit Software Component
6  * You are permitted to copy, modify or distribute this file subject to the terms
7  * of the DTVKit 1.0 Licence which can be found in licence.txt or at www.dtvkit.org
8  *
9  * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
10  * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
11  * OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
12  *
13  * If you or your organisation is not a member of DTVKit then you have access
14  * to this source code outside of the terms of the licence agreement
15  * and you are expected to delete this and any associated files immediately.
16  * Further information on DTVKit, membership and terms can be found at www.dtvkit.org
17  *******************************************************************************/
24 /*---includes for this file--------------------------------------------------*/
25 #include <string.h>
26 
27 #include "sfm_main.h"
28 #include "sfm_cache.h"
29 #include "sfm_filter.h"
30 #include "sbm.h"
31 
32 /*---- Constant definitions for this file-------------------------------------*/
33 
34 #define TABLE_BITS 6
35 #define TABLE_SIZE (1 << TABLE_BITS)
36 #define NUM_FILTERS 64
37 #define NUM_NODES 128
38 #define INVALID_VERSION 0xFF
39 #define STALE_VERSION 0xFE
40 #define STALE_BIT 0x80
41 #define REPORTING 0x40
42 
43 #define ALLOCSIZE(s) ((s >> 1) & 7) + 1
44 
45 /*---- Local typedef structs for this file------------------------------------*/
46 
47 typedef struct s_NodeBlock *H_NodeBlock;
48 typedef struct s_FiltBlock *H_FiltBlock;
49 
50 typedef struct s_CacheNode
51 {
52  H_CacheNode next; // next node
53  U8BIT *sbuf; // section data pointer
54  U8BIT bknum; // block number
55  U8BIT report;
56 } S_CacheNode;
57 
58 typedef struct s_CacheFilter
59 {
60  H_CacheNode node; // first node
61  H_CacheFilter next; // next filter
62  U16BIT tide; // Table ID Extension
63  U16BIT dsmref; // index into H_DsmResource array (from dmxResFirst)
64  U8BIT vers; // current table version
65  U8BIT ctndx; // Index into cache table array
66 } S_CacheFilter;
67 
68 
69 typedef struct s_CacheTable
70 {
71  H_CacheFilter filters[TABLE_SIZE];
72  U8BIT changed[TABLE_SIZE];
73 } S_CacheTable;
74 
75 typedef struct s_NodeBlock
76 {
77  H_NodeBlock next;
78 } S_NodeBlock;
79 
80 typedef struct s_FiltBlock
81 {
82  H_FiltBlock next;
83 } S_FiltBlock;
84 
85 
86 typedef struct s_SfmCache
87 {
88  H_SfmInstance sfm;
89  H_SbmInstance sbm;
90  H_CacheTable ctables;
91  H_FiltBlock memFilters;
92  H_NodeBlock memNodes;
93  H_CacheFilter filtHead;
94  H_CacheFilter filtTail;
95  H_CacheNode nodeHead;
96  H_CacheNode nodeTail;
97  U32BIT counter;
98 #ifndef NDEBUG
99  U32BIT allocated;
100 #endif
101 } S_SfmCache;
102 
103 
104 /*---- Local (static) variable declarations for this file---------------------*/
105 /* (internal variables declared static to make them local) */
106 
107 /*---- LOCAL function definitions for this file ------------------------------*/
108 /* (internal functions declared static to make them local) */
109 
110 
117 static U16BIT HashIndex(U32BIT key, U16BIT bits)
118 {
119  key = (key << 15) - key - 1;
120  key = key ^ (key >> 12);
121  key = key + (key << 2);
122  key = key ^ (key >> 4);
123  key = (key + (key << 3)) + (key << 11);
124  key = key ^ (key >> 16);
125  return key & ((1 << bits) - 1);
126 }
127 
128 static BOOLEAN AllocFiltBlock( H_SfmCache cache )
129 {
130  H_FiltBlock memFilters;
131  H_CacheFilter filter;
132  U32BIT size;
133  BOOLEAN result;
134  H_SfmInstance sfm;
135  sfm = cache->sfm;
136  size = sizeof(S_FiltBlock) + (NUM_FILTERS * sizeof(S_CacheFilter));
137  memFilters = sfm->setup.memAlloc( size );
138  if (memFilters == NULL)
139  {
140  result = FALSE;
141  }
142  else
143  {
144  memset(memFilters, 0, size);
145  filter = (H_CacheFilter)(memFilters + 1);
146  if (cache->filtHead == NULL)
147  {
148  cache->filtHead = filter;
149  }
150  else
151  {
152  ASSERT( cache->filtTail != NULL )
153  cache->filtTail->next = filter;
154  }
155  for (size = NUM_FILTERS - 1; size--; filter++)
156  {
157  filter->next = (filter + 1);
158  }
159  filter->next = NULL;
160  cache->filtTail = filter;
161  memFilters->next = cache->memFilters;
162  cache->memFilters = memFilters;
163  result = TRUE;
164  }
165  return result;
166 }
167 
168 static void FreeFiltBlocks( H_SfmInstance sfm, H_FiltBlock memFilters )
169 {
170  H_FiltBlock memNext;
171  while (memFilters != NULL)
172  {
173  memNext = memFilters->next;
174  sfm->setup.memFree( memFilters );
175  memFilters = memNext;
176  }
177 }
178 
179 static BOOLEAN AllocNodeBlock( H_SfmCache cache )
180 {
181  H_NodeBlock memNodes;
182  H_CacheNode node;
183  U32BIT size;
184  BOOLEAN result;
185  H_SfmInstance sfm;
186  sfm = cache->sfm;
187  size = sizeof(S_NodeBlock) + (NUM_NODES * sizeof(S_CacheNode));
188  memNodes = sfm->setup.memAlloc( size );
189  if (memNodes == NULL)
190  {
191  result = FALSE;
192  }
193  else
194  {
195  memset(memNodes, 0, size);
196  node = (H_CacheNode)(memNodes + 1);
197  if (cache->nodeHead == NULL)
198  {
199  cache->nodeHead = node;
200  }
201  else
202  {
203  ASSERT( cache->nodeTail != NULL )
204  cache->nodeTail->next = node;
205  }
206  for (size = NUM_NODES - 1; size--; node++)
207  {
208  node->next = (node + 1);
209  }
210  node->next = NULL;
211  cache->nodeTail = node;
212  memNodes->next = cache->memNodes;
213  cache->memNodes = memNodes;
214  result = TRUE;
215  }
216  return result;
217 }
218 
219 static void FreeNodeBlocks( H_SfmInstance sfm, H_NodeBlock memNodes )
220 {
221  H_NodeBlock memNext;
222  while (memNodes != NULL)
223  {
224  memNext = memNodes->next;
225  sfm->setup.memFree( memNodes );
226  memNodes = memNext;
227  }
228 }
229 
230 static H_CacheNode AddCacheNode( H_SfmCache cache, H_CacheFilter cfilter, U8BIT *buff )
231 {
232  H_CacheNode cnode;
233  // lock mutex
234  if (cache->nodeHead == NULL && !AllocNodeBlock( cache ))
235  {
236  cnode = NULL;
237  }
238  else
239  {
240  cnode = cache->nodeHead;
241  cache->nodeHead = cache->nodeHead->next;
242  cnode->sbuf = buff;
243  cnode->next = cfilter->node;
244  cfilter->node = cnode;
245  }
246  // unlock mutex
247  return cnode;
248 }
249 
250 static void FreeCacheFilt( H_SfmCache cache, H_CacheFilter filter )
251 {
252  filter->vers = INVALID_VERSION;
253  if (cache->filtHead == NULL)
254  {
255  cache->filtHead = filter;
256  }
257  else
258  {
259  ASSERT( cache->filtTail != NULL )
260  cache->filtTail->next = filter;
261  }
262  filter->next = NULL;
263  cache->filtTail = filter;
264 }
265 
266 static void FreeCacheNode( H_SfmCache cache, H_CacheNode node )
267 {
268 #ifndef NDEBUG
269  U32BIT size = ALLOCSIZE(node->sbuf[1]);
270  if (cache->allocated >= size)
271  {
272  cache->allocated -= size;
273  }
274 #endif
275  SBM_ReleaseBuffer( cache->sbm, node->sbuf );
276  if (cache->nodeHead == NULL)
277  {
278  cache->nodeHead = node;
279  }
280  else
281  {
282  ASSERT( cache->nodeTail != NULL )
283  cache->nodeTail->next = node;
284  }
285  node->next = NULL;
286  cache->nodeTail = node;
287 }
288 
296 static BOOLEAN CacheValidNode( H_SfmCache cache, void *ptr )
297 {
298  H_NodeBlock memNodes;
299  PU8BIT pval, mval;
300  U32BIT size;
301  BOOLEAN result;
302 
303  pval = (PU8BIT)ptr;
304  result = FALSE;
305  size = sizeof(S_NodeBlock) + (NUM_NODES * sizeof(S_CacheNode));
306  memNodes = cache->memNodes;
307  while (memNodes != NULL)
308  {
309  mval = (PU8BIT)memNodes;
310  if (pval > mval && pval < mval + size)
311  {
312  result = TRUE;
313  break;
314  }
315  memNodes = memNodes->next;
316  }
317  return result;
318 }
319 
320 static void CacheClearNodes( H_SfmCache cache, H_CacheFilter cfilter )
321 {
322  H_CacheNode cnode, cnext;
323  if (cfilter->node != NULL)
324  {
325  cnode = cfilter->node;
326  do
327  {
328  cnext = cnode->next;
329  FreeCacheNode( cache, cnode );
330  cnode = cnext;
331  }
332  while (cnode != NULL);
333 
334  cfilter->node = NULL;
335  }
336 }
337 
338 static void CacheClearFilters( H_SfmCache cache, H_CacheTable ctable )
339 {
340  H_CacheFilter cfilter;
341  U16BIT ndx;
342  // lock mutex ?
343  for (ndx = 0; ndx != TABLE_SIZE; ndx++)
344  {
345  cfilter = ctable->filters[ndx];
346  while (cfilter != NULL)
347  {
348  CacheClearNodes( cache, cfilter );
349  cfilter = cfilter->next;
350  }
351  }
352 }
353 
354 static void CtablePurgeExpired( H_SfmCache cache, H_CacheTable ctable )
355 {
356  H_CacheFilter cfilter, *pCfilter;
357  U16BIT ndx;
358 
359  // lock mutex ?
360  for (ndx = TABLE_SIZE; ndx--; )
361  {
362  if (ctable->changed[ndx] & STALE_BIT)
363  {
364  ctable->changed[ndx] &= ~(STALE_BIT);
365  pCfilter = &(ctable->filters[ndx]);
366  while (*pCfilter != NULL)
367  {
368  cfilter = *pCfilter;
369  if (cfilter->vers == STALE_VERSION)
370  {
371  CacheClearNodes( cache, cfilter );
372  *pCfilter = cfilter->next;
373  FreeCacheFilt( cache, cfilter );
374  }
375  else
376  {
377  pCfilter = &(cfilter->next);
378  }
379  }
380  }
381  }
382 }
383 
384 static void CachePurgeExpired( H_SfmInstance sfm )
385 {
386  H_SfmCache cache;
387  H_CacheTable ctable;
388  U16BIT ndx;
389 
390  // Purge cache of stale data
391  cache = sfm->cache;
392  ctable = cache->ctables;
393  // lock mutex ?
394  DBGLOG(DF_CACHE, "Purging stale nodes")
395  for (ndx = (sfm->setup.maxPidFilters << 1); ndx--; ctable++)
396  {
397  CtablePurgeExpired( cache, ctable );
398  }
399  // TODO: Purge cache of old unused data, but NOT nodes that are being reported to dsmcc
400  // (i.e. cnode->report != REPORTING)
401 }
402 
410 static void ReportSections( H_SfmInstance sfm, H_CacheFilter cfilter,
411  E_SFM_STATUS status )
412 {
413  H_CacheNode cnode;
414  cnode = cfilter->node;
415  while (cnode != NULL)
416  {
417  cnode->report = REPORTING;
418  DBGLOG(DF_CACHE, "CACHE HIT: sz=0x%x t=0x%x e=0x%x, %d, %d status=%d",
419  (((int)(cnode->sbuf[1] & 0x0f) << 8) | cnode->sbuf[2]) + 3, *cnode->sbuf,
420  ((cnode->sbuf[3] << 8) | cnode->sbuf[4]), cnode->sbuf[6] + 1, cnode->sbuf[7] + 1, status)
421  sfm->setup.cacheMatch( sfm, cnode->sbuf, cfilter, status );
422  cnode = cnode->next;
423  }
424 }
425 
432 static H_CacheFilter FindFilter( H_SfmInstance sfm, H_CacheTable ctable, U16BIT tide )
433 {
434  H_CacheFilter cfilter;
435  U16BIT index;
436  index = HashIndex(tide, TABLE_BITS);
437  // lock mutex ?
438  cfilter = ctable->filters[index];
439  while (cfilter != NULL)
440  {
441  if (cfilter->tide == tide &&
442  cfilter->vers != STALE_VERSION)
443  {
444  break;
445  }
446  cfilter = cfilter->next;
447  }
448  return cfilter;
449 }
450 
451 static void CacheMatch( H_SfmInstance sfm, U8BIT *pSection,
452  void *hBuffer, E_SFM_STATUS status )
453 {
454  FUNCTION_START(CacheMatch)
455  SFMCacheProcessSection( sfm, pSection, hBuffer );
456  FUNCTION_FINISH(CacheMatch)
457 }
458 
459 /*---- GLOBAL function definitions for this file -----------------------------*/
460 
461 H_SfmCache SFMCacheCreate( H_SfmInstance sfm )
462 {
463  H_SfmCache cache;
464  U32BIT size;
465  H_SbmInstance sbm;
466  S_SbmSetup setup;
467 
468  setup.memAlloc = sfm->setup.memAlloc;
469  setup.memFree = sfm->setup.memFree;
470  setup.lock = sfm->setup.mutexLock;
471  setup.unlock = sfm->setup.mutexUnlock;
472  setup.mtx_sem = sfm->setup.bufferMutex;
473  setup.bufferSize = sfm->setup.sectionBuffCacheSize;
474  sbm = SBM_CreateInstance( &setup );
475  if (sbm == NULL)
476  {
477  ERRLOG("mem fail")
478  sfm->setup.sectionBuffCacheSize = 0;
479  cache = NULL;
480  }
481  else
482  {
483  size = sizeof(S_SfmCache) +
484  (sfm->setup.maxPidFilters * sizeof(S_CacheTable) * 2);
485  cache = sfm->setup.memAlloc( size );
486  if (cache == NULL)
487  {
488  ERRLOG("mem fail")
489  sfm->setup.sectionBuffCacheSize = 0;
490  SBM_DestroyInstance( sbm, &setup.mtx_sem );
491  }
492  else
493  {
494  memset(cache, 0, size);
495  cache->sfm = sfm;
496  cache->sbm = sbm;
497  if (AllocNodeBlock( cache ))
498  {
499  cache->ctables = (H_CacheTable)(cache + 1);
500  if (sfm->setup.cacheMatch == NULL)
501  {
502  sfm->setup.cacheMatch = CacheMatch;
503  }
504  cache->counter = sfm->setup.maxPidFilters * 2;
505  #ifndef NDEBUG
506  cache->allocated = 0;
507  #endif
508  }
509  else
510  {
511  ERRLOG("mem fail")
512  sfm->setup.memFree( cache );
513  SBM_DestroyInstance( sbm, &setup.mtx_sem );
514  cache = NULL;
515  }
516  }
517  }
518  return cache;
519 }
520 
521 void SFMCacheDestroy( H_SfmInstance sfm, void **pBufMtx )
522 {
523  H_SfmCache cache;
524  SFM_CacheClear( sfm );
525  if (sfm->cache)
526  {
527  cache = sfm->cache;
528  FreeNodeBlocks( sfm, cache->memNodes );
529  FreeFiltBlocks( sfm, cache->memFilters );
530  SBM_DestroyInstance( cache->sbm, pBufMtx );
531  sfm->setup.memFree( cache );
532  sfm->cache = NULL;
533  }
534 }
535 
542 {
543  H_SfmCache cache;
544  H_CacheTable ctable;
545  U16BIT ndx;
546 
547  cache = sfm->cache;
548  if (cache != NULL)
549  {
550  ctable = cache->ctables;
551  // lock mutex ?
552  for (ndx = (sfm->setup.maxPidFilters << 1); ndx--; ctable++)
553  {
554  CacheClearFilters( cache, ctable );
555  }
556  }
557 }
558 
559 H_CacheTable SFMCacheGetTable( H_SfmCache cache )
560 {
561  H_CacheTable ctable;
562  if (cache->counter == 0)
563  {
564  ctable = NULL;
565  }
566  else
567  {
568  cache->counter--;
569  ctable = cache->ctables + cache->counter;
570  }
571  return ctable;
572 }
573 
581 H_CacheFilter SFMCacheRetrieveFilter( H_SfmInstance sfm, H_CacheTable ctable,
582  U16BIT teid, U8BIT vers )
583 {
584  H_SfmCache cache = sfm->cache;
585  H_CacheFilter cfilter, *pFilter;
586  U16BIT index;
587  index = HashIndex(teid, TABLE_BITS);
588  pFilter = ctable->filters + index;
589  // lock mutex
590  cfilter = *pFilter;
591  while (cfilter != NULL)
592  {
593  if (cfilter->tide == teid)
594  {
595  if (cfilter->vers == vers)
596  {
597  break;
598  }
599  DBGLOG(DF_CACHE, "version changed TEid=0x%x old=%d new=%d", teid, cfilter->vers, vers)
600  // version changed - mark as stale
601  cfilter->vers = STALE_VERSION;
602  ctable->changed[index] |= STALE_BIT;
603  }
604  cfilter = cfilter->next;
605  }
606  if (cfilter == NULL)
607  {
608  if (cache->filtHead != NULL || AllocFiltBlock( cache ))
609  {
610  cfilter = cache->filtHead;
611  cache->filtHead = cfilter->next;
612  cfilter->next = NULL;
613  cfilter->tide = teid;
614  cfilter->vers = vers;
615  cfilter->node = NULL;
616  cfilter->ctndx = ctable - cache->ctables;
617  cfilter->next = *pFilter;
618  *pFilter = cfilter;
619  }
620  else
621  {
622  ERRLOG("mem fail")
623  }
624  }
625  // unlock mutex
626  return cfilter;
627 }
628 
638 void SFMCacheAddBlock( H_SfmInstance sfm, U8BIT size1, U8BIT bknum, void **phBuffer )
639 {
640  H_SfmCache cache = sfm->cache;
641  H_CacheFilter cfilter;
642  H_CacheNode cnode;
643  U8BIT *buff;
644 
645  cfilter = *phBuffer;
646  if (cfilter != NULL)
647  {
648  // check whether already had section
649  for (cnode = cfilter->node; cnode; cnode = cnode->next)
650  {
651  if (cnode->bknum == bknum)
652  {
653  break;
654  }
655  }
656  if (cnode != NULL)
657  {
658  // found current version of block already cached
659  cnode = NULL;
660  }
661  else
662  {
663  buff = SBM_AllocateBuffer( cache->sbm, size1 );
664  if (buff == NULL)
665  {
666  DBGLOG(DF_CACHE, "Cache cannot store sz1=%d allocated=%d (512 byte blks)", ALLOCSIZE(size1), cache->allocated)
667  cnode = NULL;
668  }
669  else
670  {
671  cnode = AddCacheNode( cache, cfilter, buff );
672  if (cnode == NULL)
673  {
674  ERRLOG("mem fail")
675  SBM_ReleaseBuffer(cache->sbm, buff);
676  }
677  else
678  {
679  cnode->bknum = bknum;
680  cnode->report = 0;
681  #ifndef NDEBUG
682  cache->allocated += ALLOCSIZE(size1);
683  #endif
684  }
685  }
686  }
687  *phBuffer = cnode;
688  }
689 }
690 
702 U8BIT* SFM_CacheBuffer( H_SfmInstance sfm, void *hBuffer )
703 {
704  U8BIT *buff;
705  if (!CacheValidNode( sfm->cache, hBuffer ))
706  {
707  ERRLOG("Invalid pointer!")
708  buff = NULL;
709  }
710  else
711  {
712  buff = ((H_CacheNode)hBuffer)->sbuf;
713  }
714  return buff;
715 }
716 
725 void SFM_CacheReleaseBuffer( H_SfmInstance sfm, U8BIT *pSection, void *hBuffer )
726 {
727  H_CacheFilter cfilter = (H_CacheFilter)hBuffer;
728  H_CacheNode *ppNode, cnode;
729  ppNode = &cfilter->node;
730  while (*ppNode != NULL)
731  {
732  cnode = *ppNode;
733  if (cnode->sbuf == pSection)
734  {
735  if (cnode->bknum != pSection[6])
736  {
737  ERRLOG("Mis-matched of buffer data with node (0x%x,0x%x)", cnode->bknum, pSection[6])
738  }
739  else
740  {
741  *ppNode = cnode->next;
742  FreeCacheNode( sfm->cache, cnode );
743  }
744  break;
745  }
746  ppNode = &(cnode->next);
747  }
748 }
749 
757 BOOLEAN SFMCacheValidHandle( H_SfmInstance sfm, void *ptr )
758 {
759  H_FiltBlock memFilters;
760  PU8BIT pval, mval;
761  U32BIT size;
762  BOOLEAN result;
763 
764  pval = (PU8BIT)ptr;
765  result = FALSE;
766  size = sizeof(S_FiltBlock) + (NUM_FILTERS * sizeof(S_CacheFilter));
767  memFilters = sfm->cache->memFilters;
768  while (memFilters != NULL)
769  {
770  mval = (PU8BIT)memFilters;
771  if (pval > mval && pval < mval + size)
772  {
773  result = TRUE;
774  break;
775  }
776  memFilters = memFilters->next;
777  }
778  return result;
779 }
780 
790 void SFMCacheProcessSection( H_SfmInstance sfm, U8BIT *pSection, H_CacheFilter cfilter )
791 {
792  H_CacheNode *ppNode, cnode;
793  ppNode = &cfilter->node;
794  while (*ppNode != NULL)
795  {
796  cnode = *ppNode;
797  if (cnode->sbuf == pSection)
798  {
799  if (cnode->bknum != pSection[6])
800  {
801  ERRLOG("Mis-matched of buffer data with node (0x%x,0x%x)", cnode->bknum, pSection[6])
802  }
803  else
804  {
805  SFMFilterProcessSection( sfm, pSection, SFMFilterDsmResource(sfm, cfilter->dsmref));
806  *ppNode = cnode->next;
807  FreeCacheNode( sfm->cache, cnode );
808  }
809  break;
810  }
811  ppNode = &(cnode->next);
812  }
813 }
814 
822 void SFMCacheSearch( H_SfmInstance sfm, H_CacheTable ctable, S_TableExt tex,
823  U16BIT dsmref, E_SFM_STATUS status )
824 {
825  H_CacheFilter cfilter;
826  switch (tex.mask)
827  {
828  case 0xFFFE:
829  cfilter = FindFilter( sfm, ctable, tex.id ^ 0x0001 );
830  if (cfilter != NULL)
831  {
832  cfilter->dsmref = dsmref;
833  ReportSections( sfm, cfilter, status );
834  }
835  case 0xFFFF:
836  cfilter = FindFilter( sfm, ctable, tex.id );
837  if (cfilter != NULL)
838  {
839  cfilter->dsmref = dsmref;
840  ReportSections( sfm, cfilter, status );
841  }
842  break;
843 
844  default:
845  // this wild card could match lots of them !
846  {
847  U16BIT ndx;
848  tex.id &= tex.mask;
849  // lock mutex ?
850  for (ndx = 0; ndx != TABLE_SIZE; ndx++)
851  {
852  cfilter = ctable->filters[ndx];
853  while (cfilter != NULL)
854  {
855  if ((cfilter->tide & tex.mask) == tex.id &&
856  cfilter->vers != STALE_VERSION)
857  {
858  cfilter->dsmref = dsmref;
859  ReportSections( sfm, cfilter, status );
860  }
861  cfilter = cfilter->next;
862  }
863  }
864  }
865  break;
866  }
867  CachePurgeExpired( sfm );
868 }
869 
U8BIT * SFM_CacheBuffer(H_SfmInstance sfm, void *hBuffer)
Get section data buffer pointer in SFM's cache for the handle. This should only be called after SFM_R...
Definition: sfm_cache.c:702
H_CacheFilter SFMCacheRetrieveFilter(H_SfmInstance sfm, H_CacheTable ctable, U16BIT teid, U8BIT vers)
Search cache for section data.
Definition: sfm_cache.c:581
void SFMFilterProcessSection(H_SfmInstance sfm, U8BIT *pSection, H_DsmResource pDsmRes)
Get DSM-CC filter request and pass section buffer to DSM-CC with it's filter handle This should only ...
Definition: sfm_filter.c:1274
U8BIT * SBM_AllocateBuffer(H_SbmInstance sbm, U8BIT size1)
Allocate buffer for a DVB section.
Definition: sbm.c:369
void SFMCacheAddBlock(H_SfmInstance sfm, U8BIT size1, U8BIT bknum, void **phBuffer)
Allocates space in cache for section data If allocation is made, *phBuffer has holds cache location...
Definition: sfm_cache.c:638
H_SbmInstance SBM_CreateInstance(S_SbmSetup *pSetup)
Create Section Buffer Manager instance, using setup structure.
Definition: sbm.c:457
Section Filter Manasger (SFM): cache definitions.
Section Filter Manager (SFM): filters.
void SFMCacheProcessSection(H_SfmInstance sfm, U8BIT *pSection, H_CacheFilter cfilter)
Tells SFM Cache to update DSM-CC with cached buffer (reported to F_CacheMatch callback funtion...
Definition: sfm_cache.c:790
Section Filter Manager (SFM): main definitions.
void SBM_DestroyInstance(H_SbmInstance sbm, void **pBufMtx)
Destroy Section Filter Manager instance, and return mutexes so that they may be destroyed by client...
Definition: sbm.c:517
void SBM_ReleaseBuffer(H_SbmInstance sbm, U8BIT *buffer)
Release DVB section buffer allocated with SBM_AllocateBuffer.
Definition: sbm.c:432
void SFMCacheSearch(H_SfmInstance sfm, H_CacheTable ctable, S_TableExt tex, U16BIT dsmref, E_SFM_STATUS status)
Search cache for section data.
Definition: sfm_cache.c:822
Section Buffer Manager (for use by Section Filter Manager and client) Provides mechanism to allocate ...
Definition: sbm.h:37
BOOLEAN SFMCacheValidHandle(H_SfmInstance sfm, void *ptr)
Definition: sfm_cache.c:757
void SFM_CacheReleaseBuffer(H_SfmInstance sfm, U8BIT *pSection, void *hBuffer)
Release Cache buffer allocated by SFM_CacheBuffer.
Definition: sfm_cache.c:725
void SFM_CacheClear(H_SfmInstance sfm)
Clear all SFM cached section data.
Definition: sfm_cache.c:541