DSMCC  17.9.0
 All Data Structures Files Functions Typedefs
clDsmMemMgrBasic.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  * Copyright © 2000 Koninklijke Philips Electronics N.V
5  *
6  * This file is part of a DTVKit Software Component
7  * You are permitted to copy, modify or distribute this file subject to the terms
8  * of the DTVKit 1.0 Licence which can be found in licence.txt or at www.dtvkit.org
9  *
10  * THIS CODE AND INFORMATION ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
11  * EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES
12  * OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
13  *
14  * If you or your organisation is not a member of DTVKit then you have access
15  * to this source code outside of the terms of the licence agreement
16  * and you are expected to delete this and any associated files immediately.
17  * Further information on DTVKit, membership and terms can be found at www.dtvkit.org
18  *******************************************************************************/
26 /*---includes for this file--------------------------------------------------*/
27 #include <string.h>
28 
29 #include "cldsmcc.h"
30 #include "clDsmMemMgrAPI.h"
31 #include "dsmDbg.h"
32 
33 
34 /*------------------------------ Local macros --------------------------------*/
35 
36 #define MEM_NUM_SEQS (MEM_SEQ_OPEN_DFLT)
37 /* Check seq refs in debug only */
38 #define memCheckRef(x) dsmAssert(((x->magic == MEM_MAGIC) && (x->pStartPos != NULL)))
39 #ifdef DBG_STORE_LINE
40 #define MEM_BLOCK_HDR_SIZE 12
41 #else
42 #define MEM_BLOCK_HDR_SIZE 8
43 #endif
44 #define MEM_BLOCK_START 0x4d656d3e /* = string "Mem>" */
45 #define MEM_BLOCK_END 0x3c4d656d /* = string "<Mem" */
46 #define MEM_MAGIC 0x5365713e /* = string "Seq>" */
47 
48 
49 /*----------------------------- Exported data --------------------------------*/
50 
51 
52 /*------------------------------ Local types----------------------------------*/
53 
54 typedef struct
55 {
56  U32BIT magic; /* Magic number for debug */
57  MemHandle memArea; /* MemHandle of memArea */
58  U8BIT *pStartPos; /* Pointer to start of sequence */
59  U8BIT *pCurrentPos; /* Pointer to current position in sequence */
60  U32BIT seqLength; /* Length of sequence */
61  U32BIT currentOffset; /* Offset (in bytes) from start of sequence to
62  current position */
63  U32BIT savedOffset; /* Offset (in bytes) from start of sequence to
64  saved position */
65 } localSeqRef, *pLocalSeqRef;
66 
67 typedef struct
68 {
69  U32BIT numOpen;
70  U32BIT numAllocd;
71  S32BIT numSeqsOpen;
72  localSeqRef memSeqs[MEM_NUM_SEQS];
73 } MemContext_t, *pMemContext_t;
74 
75 
76 /*-------------------------------local statics--------------------------------*/
77 
78 static MemContext_t localMemContext;
79 
80 
81 /*---------------------local prototypes/forward declarations------------------*/
82 
83 
84 /*-----------------------------exported functions-----------------------------*/
85 
86 /* /////////////////////////////////////////////////////////////////////////////
87 // memStart
88 //
90 E_DsmMemErr memStart(
91  /*I*/ U16BIT memBlockSizeMin, U32BIT memHeapSizeMin, U16BIT memSeqOpenMin,
92  void *memSetup,
93  /*O*/ void **memContext )
94 {
95  S32BIT loop;
96  pLocalSeqRef pMemSeq = NULL;
97 
98  dsmDP4(("memStart()\n"));
99 
100  dsmAssert((memContext != NULL));
101 
102  *memContext = NULL;
103  localMemContext.numOpen = 0;
104  localMemContext.numAllocd = 0;
105  localMemContext.numSeqsOpen = 0;
106 
107  for (loop = MEM_NUM_SEQS - 1; loop; loop--)
108  {
109  pMemSeq = &localMemContext.memSeqs[loop];
110 
111  pMemSeq->magic = MEM_MAGIC;
112  pMemSeq->memArea = NULL;
113  pMemSeq->pStartPos = NULL;
114  pMemSeq->pCurrentPos = NULL;
115  pMemSeq->seqLength = 0;
116  pMemSeq->currentOffset = 0;
117  pMemSeq->savedOffset = 0;
118  }
119 
120  return MEM_NO_ERR;
121 }
122 
123 /* /////////////////////////////////////////////////////////////////////////////
124 // memStop
125 //
127 E_DsmMemErr memStop( void *context )
128 {
129  dsmDP4(("memStop()\n"));
130 
131  dsmAssert((localMemContext.numOpen == 0));
132  dsmAssert((localMemContext.numAllocd == 0));
133  dsmAssert((localMemContext.numSeqsOpen == 0));
134 
135  return MEM_NO_ERR;
136 }
137 
138 /* /////////////////////////////////////////////////////////////////////////////
139 // DSC_MmAlloc
140 //
142 MemHandle memAlloc( void *context, P_DsmSetup setup, U32BIT size, int line )
143 {
144  MemHandle memArea;
145  U32BIT sz = (size + 3) >> 2;
146  U32BIT *pMemBlock;
147 
148  /* Allocate 2 x 4 byte blocks before data so that magic number and block
149  size may be stored */
150  pMemBlock = setup->allocFunc((sz << 2) + MEM_BLOCK_HDR_SIZE + 4 );
151  if (pMemBlock)
152  {
153  #ifndef NDEBUG
154  BOOLEAN valid;
155  #endif
156 
157  *pMemBlock++ = MEM_BLOCK_START;
158  *pMemBlock++ = size;
159 #ifdef DBG_STORE_LINE
160  *pMemBlock++ = line;
161 #endif
162  memArea = (MemHandle)pMemBlock;
163  *(pMemBlock + sz) = MEM_BLOCK_END;
164 
165  DBG4(DD_GEN, "memArea=%p size=%d cnt=%d", memArea, size, ++localMemContext.numAllocd)
166 
167  #ifndef NDEBUG
168  valid = memValidate( memArea );
169  dsmAssert((valid));
170  #endif
171  }
172  else
173  {
174  memArea = NULL;
175  }
176  return memArea;
177 }
178 
179 /* /////////////////////////////////////////////////////////////////////////////
180 // memRelease
181 //
183 U32BIT memRelease( void *context, /*I*/ P_DsmSetup setup, MemHandle memArea )
184 {
185  U32BIT size, *pMem;
186 
187  dsmAssert((memArea != NULL));
188 #ifndef NDEBUG
189  {
190  BOOLEAN valid;
191  S32BIT i;
192 
193  /* Check memArea is valid */
194  valid = memValidate( memArea );
195  dsmAssert((valid));
196 
197  /* Check for mem sequence that is still open on the MemArea */
198  for (i = 0; i < MEM_NUM_SEQS; i++)
199  {
200  dsmAssert((localMemContext.memSeqs[i].memArea != memArea));
201  }
202  }
203 #endif
204  pMem = (U32BIT *)memArea;
205 #ifdef DBG_STORE_LINE
206  --pMem;
207 #endif
208  --pMem;
209  size = *pMem;
210  --pMem;
211  *pMem = 0; /* remove magic block start */
212  DBG4(DD_GEN, "memArea=%p size=%d cnt=%d", memArea, size, --localMemContext.numAllocd)
213 
214  setup->freeFunc((void *)pMem );
215 
216  return size;
217 }
218 
219 /* /////////////////////////////////////////////////////////////////////////////
220 // memValidate
221 //
223 BOOLEAN memValidate( void *memArea )
224 {
225  if (memArea != NULL)
226  {
227  U32BIT *pMemStart = (U32BIT *)memArea - (MEM_BLOCK_HDR_SIZE / 4);
228  U32BIT size = *(pMemStart + 1);
229  U32BIT *pMemEnd = (U32BIT *)memArea + ((size + 3) >> 2);
230 
231  /* Check for MEM_BLOCK_START before memArea */
232  if ((*pMemStart == MEM_BLOCK_START) && (*pMemEnd == MEM_BLOCK_END))
233  {
234  DBG4(DD_GEN, "memArea=%p size=%d", memArea, size)
235  return TRUE;
236  }
237 
238  ERRPRINT("memArea=%p size=%d", memArea, size)
239  }
240  else
241  {
242  DBG3(DD_GEN, "memArea is NULL")
243  }
244  return FALSE;
245 }
246 
247 /* /////////////////////////////////////////////////////////////////////////////
248 // memOpen
249 //
251 void memOpen( void *context, /*I*/ MemHandle memArea, /*O*/ void **memPtr )
252 {
253  dsmDP4(("\tmemOpen(): %d, %x\n", ++localMemContext.numOpen, memArea));
254 
255 #ifndef NDEBUG
256  if (memArea != NULL)
257  {
258  /* Check memArea is valid */
259  BOOLEAN valid = memValidate( memArea );
260  if (!valid)
261  {
262  dsmDP1(("memArea=%p", memArea));
263  }
264  }
265 #endif
266 
267  *memPtr = (void *) memArea;
268 }
269 
270 #ifndef NDEBUG
271 /* /////////////////////////////////////////////////////////////////////////////
272 // memNumOpen
273 //
275 U32BIT memNumOpen( void *context )
276 {
277  dsmDP4(("memNumOpen()\n"));
278 
279  return localMemContext.numOpen;
280 }
281 
282 #endif /* NDEBUG */
283 
284 
285 /* /////////////////////////////////////////////////////////////////////////////
286 // memSeqOpen
287 //
289 E_DsmMemErr memSeqOpen( void *context,
290  /*I*/ MemHandle memArea, U32BIT offset, U32BIT length, BOOLEAN asyncAccess,
291  /*O*/ MemSeqRef *memAreaRef )
292 {
293  pLocalSeqRef pMemSeq = NULL;
294  S32BIT loop;
295 
296  dsmDP4(("memSeqOpen()\n"));
297 
298  dsmAssert((memArea != NULL));
299  dsmAssert((memAreaRef != NULL));
300  if (!length)
301  {
302  DBG2(DD_GEN,"zero length")
303  }
304 
305  /* Have we reached the limit for open seqs? */
306  if (localMemContext.numSeqsOpen == MEM_NUM_SEQS)
307  {
308  dsmDP4(("INF: Memory sequence open limit reached!\n"));
309  return MEM_ERR_SEQ_OPEN_LIMIT;
310  }
311 
312  /* Put this ref's details in a blank element */
313  for (loop = MEM_NUM_SEQS - 1; loop; loop--)
314  {
315  pMemSeq = &localMemContext.memSeqs[loop];
316  if (pMemSeq->pStartPos == NULL)
317  {
318  pMemSeq->memArea = memArea;
319  pMemSeq->pStartPos = (U8BIT *)memArea + offset;
320  pMemSeq->pCurrentPos =
321  localMemContext.memSeqs[loop].pStartPos;
322  pMemSeq->seqLength = length;
323  pMemSeq->currentOffset = 0;
324  pMemSeq->savedOffset = 0;
325  break;
326  }
327  }
328 
329  localMemContext.numSeqsOpen++;
330  *memAreaRef = (MemSeqRef) pMemSeq;
331 
332  return MEM_NO_ERR;
333 }
334 
335 /* /////////////////////////////////////////////////////////////////////////////
336 // memSeqOpenClone
337 //
339 E_DsmMemErr memSeqOpenClone(
340  /*I*/ MemSeqRef memAreaRefOrig,
341  /*O*/ MemSeqRef *memAreaRefClone )
342 {
343  pLocalSeqRef pMemSeqOrig = (pLocalSeqRef) memAreaRefOrig;
344  pLocalSeqRef pMemSeqClone = NULL;
345  S32BIT loop;
346 
347  dsmDP4(("memSeqClone()\n"));
348 
349  dsmAssert((memAreaRefClone != NULL));
350 
351  /* Have we reached the limit for open seqs? */
352  if (localMemContext.numSeqsOpen == MEM_NUM_SEQS)
353  {
354  dsmDP4(("INF: Memory sequence open limit reached!\n"));
355  return MEM_ERR_SEQ_OPEN_LIMIT;
356  }
357 
358  /* Put this ref's details in a blank element */
359  for (loop = MEM_NUM_SEQS - 1; loop; loop--)
360  {
361  pMemSeqClone = &localMemContext.memSeqs[loop];
362  if (pMemSeqClone->pStartPos == NULL)
363  {
364  pMemSeqClone->memArea = pMemSeqOrig->memArea;
365  pMemSeqClone->pStartPos = pMemSeqOrig->pStartPos;
366  pMemSeqClone->pCurrentPos = pMemSeqOrig->pCurrentPos;
367  pMemSeqClone->seqLength = pMemSeqOrig->seqLength;
368  pMemSeqClone->currentOffset = pMemSeqOrig->currentOffset;
369  pMemSeqClone->savedOffset = pMemSeqOrig->savedOffset;
370  break;
371  }
372  }
373 
374  localMemContext.numSeqsOpen++;
375  *memAreaRefClone = (MemSeqRef) pMemSeqClone;
376 
377  return MEM_NO_ERR;
378 }
379 
380 /* /////////////////////////////////////////////////////////////////////////////
381 // memSeqClose
382 //
384 void memSeqClose( /*I*/ MemSeqRef memAreaRef )
385 {
386  pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
387 
388  dsmDP4(("memSeqClose()\n"));
389 
390  dsmAssert((memAreaRef != NULL));
391 
392  /* Check for valid ref */
393  memCheckRef(pMemSeq);
394 
395  pMemSeq->memArea = NULL;
396  pMemSeq->pStartPos = NULL;
397 
398  localMemContext.numSeqsOpen--;
399 }
400 
401 /* /////////////////////////////////////////////////////////////////////////////
402 // memSeqAccessContig
403 //
405 void memSeqAccessContig(
406  MemSeqRef memAreaRef, U8BIT **memPtr, U32BIT *numContigBytes )
407 {
408  pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
409 
410  dsmDP4(("memSeqAccessContig()\n"));
411  dsmAssert((memAreaRef != NULL));
412  dsmAssert((memPtr != NULL));
413  dsmAssert((numContigBytes != NULL));
414 
415 
416  /* Check for valid ref */
417  memCheckRef(pMemSeq);
418 
419  *memPtr = pMemSeq->pStartPos;
420  *numContigBytes = pMemSeq->seqLength;
421 }
422 
423 /* /////////////////////////////////////////////////////////////////////////////
424 // memSeqAccessCurrent
425 //
427 void memSeqAccessCurrent(
428  MemSeqRef memAreaRef, U8BIT **memPtr, U32BIT *numContigBytes )
429 {
430  pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
431  U32BIT bytesRemaining;
432 
433  dsmDP4(("memSeqAccessContig()\n"));
434  dsmAssert((memAreaRef != NULL));
435  dsmAssert((memPtr != NULL));
436 
437  /* Check for valid ref */
438  memCheckRef(pMemSeq);
439 
440  bytesRemaining = pMemSeq->seqLength - pMemSeq->currentOffset;
441 
442  *memPtr = pMemSeq->pCurrentPos;
443  if (*numContigBytes > bytesRemaining)
444  {
445  *numContigBytes = bytesRemaining;
446  }
447  pMemSeq->pCurrentPos += *numContigBytes;
448 }
449 
450 #ifndef NDEBUG
451 /* /////////////////////////////////////////////////////////////////////////////
452 // memSeqNumOpen
453 //
455 U32BIT memSeqNumOpen( void *context )
456 {
457  dsmDP4(("memSeqNumOpen()\n"));
458 
459  return localMemContext.numSeqsOpen;
460 }
461 
462 #endif /* NDEBUG */
463 
464 
465 /* /////////////////////////////////////////////////////////////////////////////
466 // memSeqSize
467 //
469 void memSeqSize( /*I*/ MemSeqRef memAreaRef, /*O*/ U32BIT *size )
470 {
471  pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
472 
473  dsmDP4(("memSeqSize()\n"));
474 
475  dsmAssert((size != NULL));
476 
477  /* Check for valid ref */
478  memCheckRef(pMemSeq);
479 
480  *size = pMemSeq->seqLength;
481 }
482 
483 /* /////////////////////////////////////////////////////////////////////////////
484 // memSeqValidate
485 //
487 void memSeqValidate( /*I*/ MemSeqRef memAreaRef, /*O*/ BOOLEAN *pValid )
488 {
489  pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
490 
491  dsmDP4(("memSeqValidate()\n"));
492 
493  dsmAssert((memAreaRef != NULL));
494 
495  /* Check for valid ref */
496  if ((pMemSeq < &localMemContext.memSeqs[0]) ||
497  (pMemSeq > &localMemContext.memSeqs[MEM_NUM_SEQS - 1]) ||
498  (pMemSeq->pStartPos == NULL) ||
499  (pMemSeq->magic != MEM_MAGIC))
500  {
501  dsmDP4(("INF: Memory sequence reference is invalid!\n"));
502  *pValid = FALSE;
503  }
504  else
505  {
506  *pValid = TRUE;
507  }
508 }
509 
510 /* /////////////////////////////////////////////////////////////////////////////
511 // memSeqReadByte
512 //
514 E_DsmMemErr memSeqReadByte( /*I*/ MemSeqRef src, /*O*/ U8BIT *byte )
515 {
516  pLocalSeqRef pMemSeq = (pLocalSeqRef) src;
517 
518  dsmDP4(("memSeqReadU8BIT()\n"));
519 
520  dsmAssert((src != NULL));
521  dsmAssert((byte != NULL));
522 
523  /* Check for valid ref */
524  memCheckRef(pMemSeq);
525 
526  /* Check not at end of sequence */
527  if (pMemSeq->currentOffset == pMemSeq->seqLength)
528  {
529  dsmDP4(("INF: Reached end of sequence\n"));
530  return MEM_ERR_SEQ_END_OF_DATA;
531  }
532 
533  *byte = *pMemSeq->pCurrentPos;
534  pMemSeq->pCurrentPos++;
535  pMemSeq->currentOffset++;
536 
537  return MEM_NO_ERR;
538 }
539 
540 /* /////////////////////////////////////////////////////////////////////////////
541 // memSeqWriteByte
542 //
544 E_DsmMemErr memSeqWriteByte( /*I*/ U8BIT byte, MemSeqRef dest )
545 {
546  pLocalSeqRef pMemSeq = (pLocalSeqRef) dest;
547 
548  dsmDP4(("memSeqWriteU8BIT()\n"));
549 
550  dsmAssert((dest != NULL));
551 
552  /* Check for valid ref */
553  memCheckRef(pMemSeq);
554 
555  /* Check that current position is ok */
556  if (pMemSeq->currentOffset == pMemSeq->seqLength)
557  {
558  dsmDP4(("INF: Reached end of sequence\n"));
559  return MEM_ERR_SEQ_END_OF_DATA;
560  }
561 
562  *pMemSeq->pCurrentPos = byte;
563  pMemSeq->pCurrentPos++;
564  pMemSeq->currentOffset++;
565 
566  return MEM_NO_ERR;
567 }
568 
569 /* /////////////////////////////////////////////////////////////////////////////
570 // memSeqRead
571 //
573 E_DsmMemErr memSeqRead(
574  MemSeqRef src, U8BIT *dest, U32BIT numBytes, U32BIT *numBytesActual )
575 {
576  pLocalSeqRef pMemSeq = (pLocalSeqRef) src;
577  U32BIT bytesToRead, bytesRemaining;
578  E_DsmMemErr retVal = MEM_NO_ERR;
579 
580  dsmDP4(("memSeqRead()\n"));
581 
582  dsmAssert((src != NULL));
583  dsmAssert((numBytes > 0));
584  dsmAssert((dest != NULL));
585  dsmAssert((numBytesActual != NULL));
586 
587  /* Check for valid ref */
588  memCheckRef(pMemSeq);
589 
590  bytesRemaining = pMemSeq->seqLength - pMemSeq->currentOffset;
591 
592  if (numBytes > bytesRemaining)
593  {
594  bytesToRead = bytesRemaining;
595  retVal = MEM_ERR_SEQ_END_OF_DATA;
596  }
597  else
598  {
599  bytesToRead = numBytes;
600  }
601 
602  memcpy( dest, pMemSeq->pCurrentPos, bytesToRead );
603 
604  pMemSeq->pCurrentPos += bytesToRead;
605  pMemSeq->currentOffset += bytesToRead;
606 
607  *numBytesActual = bytesToRead;
608 
609  return retVal;
610 }
611 
612 /* /////////////////////////////////////////////////////////////////////////////
613 // memSeqWrite
614 //
616 E_DsmMemErr memSeqWrite(
617  U8BIT *src, MemSeqRef dest, U32BIT numBytes, U32BIT *numBytesActual )
618 {
619  pLocalSeqRef pMemSeq = (pLocalSeqRef) dest;
620  U32BIT bytesToWrite, bytesRemaining;
621  E_DsmMemErr retVal = MEM_NO_ERR;
622 
623  dsmDP4(("memSeqWrite()\n"));
624 
625  dsmAssert((src != NULL));
626  dsmAssert((numBytes > 0));
627  dsmAssert((dest != NULL));
628  dsmAssert((numBytesActual != NULL));
629 
630  /* Check for valid ref */
631  memCheckRef(pMemSeq);
632 
633  bytesRemaining = pMemSeq->seqLength - pMemSeq->currentOffset;
634 
635  if (numBytes > bytesRemaining)
636  {
637  bytesToWrite = bytesRemaining;
638  retVal = MEM_ERR_SEQ_END_OF_DATA;
639  }
640  else
641  {
642  bytesToWrite = numBytes;
643  }
644 
645  memcpy( pMemSeq->pCurrentPos, src, bytesToWrite );
646 
647  pMemSeq->pCurrentPos += bytesToWrite;
648  pMemSeq->currentOffset += bytesToWrite;
649 
650  *numBytesActual = bytesToWrite;
651 
652  return retVal;
653 }
654 
655 /* /////////////////////////////////////////////////////////////////////////////
656 // memSeqCopy
657 //
659 E_DsmMemErr memSeqCopy(
660  MemSeqRef src, MemSeqRef dest, U32BIT numBytes, U32BIT *numBytesActual )
661 {
662  pLocalSeqRef pMemSeqSrc = (pLocalSeqRef) src;
663  pLocalSeqRef pMemSeqDest = (pLocalSeqRef) dest;
664  U32BIT bytesToCopy, bytesRemainingSrc, bytesRemainingDest;
665  E_DsmMemErr retVal = MEM_NO_ERR;
666 
667  dsmDP4(("memSeqCopy()\n"));
668 
669  dsmAssert((src != NULL));
670  dsmAssert((dest != NULL));
671  dsmAssert((numBytes > 0));
672  dsmAssert((numBytesActual != NULL));
673 
674  /* Check for valid refs */
675  memCheckRef(pMemSeqSrc);
676  memCheckRef(pMemSeqDest);
677 
678  bytesRemainingSrc = pMemSeqSrc->seqLength - pMemSeqSrc->currentOffset;
679  bytesRemainingDest = pMemSeqDest->seqLength - pMemSeqDest->currentOffset;
680 
681  if (numBytes > bytesRemainingDest)
682  {
683  bytesToCopy = bytesRemainingDest;
684  retVal = MEM_ERR_SEQ_END_OF_DATA;
685  }
686  else
687  {
688  bytesToCopy = numBytes;
689  }
690 
691  if (bytesToCopy > bytesRemainingSrc)
692  {
693  bytesToCopy = bytesRemainingSrc;
694  retVal = MEM_ERR_SEQ_END_OF_DATA;
695  }
696 
697  memcpy( pMemSeqDest->pCurrentPos, pMemSeqSrc->pCurrentPos, bytesToCopy );
698 
699  pMemSeqSrc->pCurrentPos += bytesToCopy;
700  pMemSeqSrc->currentOffset += bytesToCopy;
701  pMemSeqDest->pCurrentPos += bytesToCopy;
702  pMemSeqDest->currentOffset += bytesToCopy;
703 
704  return retVal;
705 }
706 
707 /* /////////////////////////////////////////////////////////////////////////////
708 // memSeqCompContig
709 //
711 E_DsmMemErr memSeqCompContig(
712  /*I*/ U8BIT *contig, MemSeqRef memAreaRef, U32BIT numBytes,
713  /*O*/ BOOLEAN *equal )
714 {
715  pLocalSeqRef pMemSeq = (pLocalSeqRef) memAreaRef;
716 
717  dsmDP4(("memSeqCompContig()\n"));
718 
719  dsmAssert((contig != NULL));
720  dsmAssert((memAreaRef != NULL));
721  dsmAssert((numBytes > 0));
722  dsmAssert((equal != NULL));
723 
724  memCheckRef(pMemSeq);
725 
726  /* Check that the entire compare area fits into the sequence */
727  if (pMemSeq->seqLength < pMemSeq->currentOffset + numBytes)
728  {
729  return MEM_ERR_SEQ_END_OF_DATA;
730  }
731 
732  /* Set equal to TRUE/FALSE if strings are equal/unequal */
733  *equal = ((memcmp( contig, pMemSeq->pCurrentPos, numBytes ) != 0) ? FALSE : TRUE);
734 
735  return MEM_NO_ERR;
736 }
737 
738 /* /////////////////////////////////////////////////////////////////////////////
739 // memSeqCompMgd
740 //
742 E_DsmMemErr memSeqCompMgd(
743  /*I*/ MemSeqRef memAreaRef1, MemSeqRef memAreaRef2, U32BIT numBytes,
744  /*O*/ BOOLEAN *equal )
745 {
746  pLocalSeqRef pMemSeq1 = (pLocalSeqRef) memAreaRef1;
747  pLocalSeqRef pMemSeq2 = (pLocalSeqRef) memAreaRef2;
748 
749  dsmDP4(("memSeqCompMgd()\n"));
750 
751  dsmAssert((memAreaRef1 != NULL));
752  dsmAssert((memAreaRef2 != NULL));
753  dsmAssert((numBytes > 0));
754  dsmAssert((equal != NULL));
755 
756  memCheckRef(pMemSeq1);
757  memCheckRef(pMemSeq2);
758 
759  /* Check that portions to compare fit into the sequences */
760  if (pMemSeq1->seqLength < pMemSeq1->currentOffset + numBytes)
761  {
762  return MEM_ERR_SEQ_END_OF_DATA;
763  }
764  if (pMemSeq2->seqLength < pMemSeq2->currentOffset + numBytes)
765  {
766  return MEM_ERR_SEQ_END_OF_DATA;
767  }
768 
769  /* Set equal to TRUE/FALSE if strings are equal/unequal */
770  *equal = ((memcmp(
771  pMemSeq1->pCurrentPos, pMemSeq2->pCurrentPos, numBytes ) != 0)
772  ? FALSE : TRUE);
773 
774  return MEM_NO_ERR;
775 }
776 
777 /* /////////////////////////////////////////////////////////////////////////////
778 // memSeqSetPosRel
779 //
781 E_DsmMemErr memSeqSetPosRel( /*I*/ MemSeqRef memAreaRef, S32BIT position )
782 {
783  pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
784  E_DsmMemErr retVal = MEM_NO_ERR;
785  S32BIT actualOffset;
786 
787  dsmDP4(("memSeqSetPosRel()\n"));
788 
789  dsmAssert((memAreaRef != NULL));
790 
791  /* Check for valid ref */
792  memCheckRef(pMemSeq);
793 
794  actualOffset = pMemSeq->currentOffset + position;
795 
796  if (actualOffset < 0)
797  {
798  /* Overrun the start of the sequence */
799  pMemSeq->pCurrentPos = pMemSeq->pStartPos;
800  pMemSeq->currentOffset = 0;
801  retVal = MEM_ERR_SEQ_END_OF_DATA;
802  }
803  else if ((U32BIT)actualOffset > pMemSeq->seqLength)
804  {
805  /* Overrun the end of the sequence */
806  pMemSeq->pCurrentPos = pMemSeq->pStartPos + pMemSeq->seqLength;
807  pMemSeq->currentOffset = pMemSeq->seqLength;
808  retVal = MEM_ERR_SEQ_END_OF_DATA;
809  }
810  else
811  {
812  /* Set the current cursor position */
813  pMemSeq->pCurrentPos = pMemSeq->pStartPos + actualOffset;
814  pMemSeq->currentOffset = actualOffset;
815  }
816 
817  return retVal;
818 }
819 
820 /* /////////////////////////////////////////////////////////////////////////////
821 // memSeqSetPosAbs
822 //
824 E_DsmMemErr memSeqSetPosAbs( /*I*/ MemSeqRef memAreaRef, U32BIT position )
825 {
826  pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
827  E_DsmMemErr retVal = MEM_NO_ERR;
828 
829  dsmDP4(("memSeqSetPosAbs()\n"));
830 
831  dsmAssert((memAreaRef != NULL));
832 
833  /* Check for valid ref */
834  memCheckRef(pMemSeq);
835 
836  if (position > pMemSeq->seqLength)
837  {
838  /* Overrun the end of the sequence */
839  pMemSeq->pCurrentPos = pMemSeq->pStartPos + pMemSeq->seqLength;
840  pMemSeq->currentOffset = pMemSeq->seqLength;
841  retVal = MEM_ERR_SEQ_END_OF_DATA;
842  }
843  else
844  {
845  /* Set the current cursor position */
846  pMemSeq->pCurrentPos = pMemSeq->pStartPos + position;
847  pMemSeq->currentOffset = position;
848  }
849 
850  return retVal;
851 }
852 
853 /* /////////////////////////////////////////////////////////////////////////////
854 // memSeqReadPos
855 //
857 extern void memSeqReadPos( MemSeqRef memAreaRef, U32BIT *position )
858 {
859  pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
860 
861  dsmDP4(("memSeqReadPos()\n"));
862 
863  dsmAssert((memAreaRef != NULL));
864 
865  /* Check for valid ref */
866  memCheckRef(pMemSeq);
867 
868  *position = pMemSeq->currentOffset;
869 }
870 
871 /*----------------------------------------------------------------------------*/
DSM-CC dynamic memory manager API.
Main API to DSM-CC core layer (provided functions and required callbacks).
Internal Platform dependent definitions, for debug.