36 #define MEM_NUM_SEQS (MEM_SEQ_OPEN_DFLT)
38 #define memCheckRef(x) dsmAssert(((x->magic == MEM_MAGIC) && (x->pStartPos != NULL)))
40 #define MEM_BLOCK_HDR_SIZE 12
42 #define MEM_BLOCK_HDR_SIZE 8
44 #define MEM_BLOCK_START 0x4d656d3e
45 #define MEM_BLOCK_END 0x3c4d656d
46 #define MEM_MAGIC 0x5365713e
65 } localSeqRef, *pLocalSeqRef;
72 localSeqRef memSeqs[MEM_NUM_SEQS];
73 } MemContext_t, *pMemContext_t;
78 static MemContext_t localMemContext;
91 U16BIT memBlockSizeMin, U32BIT memHeapSizeMin, U16BIT memSeqOpenMin,
96 pLocalSeqRef pMemSeq = NULL;
98 dsmDP4((
"memStart()\n"));
100 dsmAssert((memContext != NULL));
103 localMemContext.numOpen = 0;
104 localMemContext.numAllocd = 0;
105 localMemContext.numSeqsOpen = 0;
107 for (loop = MEM_NUM_SEQS - 1; loop; loop--)
109 pMemSeq = &localMemContext.memSeqs[loop];
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;
150 pMemBlock = setup->allocFunc((sz << 2) + MEM_BLOCK_HDR_SIZE + 4 );
157 *pMemBlock++ = MEM_BLOCK_START;
159 #ifdef DBG_STORE_LINE
162 memArea = (MemHandle)pMemBlock;
163 *(pMemBlock + sz) = MEM_BLOCK_END;
165 DBG4(DD_GEN,
"memArea=%p size=%d cnt=%d", memArea, size, ++localMemContext.numAllocd)
168 valid = memValidate( memArea );
187 dsmAssert((memArea != NULL));
194 valid = memValidate( memArea );
198 for (i = 0; i < MEM_NUM_SEQS; i++)
200 dsmAssert((localMemContext.memSeqs[i].memArea != memArea));
204 pMem = (U32BIT *)memArea;
205 #ifdef DBG_STORE_LINE
212 DBG4(DD_GEN,
"memArea=%p size=%d cnt=%d", memArea, size, --localMemContext.numAllocd)
214 setup->freeFunc((
void *)pMem );
232 if ((*pMemStart == MEM_BLOCK_START) && (*pMemEnd == MEM_BLOCK_END))
234 DBG4(DD_GEN,
"memArea=%p size=%d", memArea, size)
238 ERRPRINT("memArea=%p size=%d", memArea, size)
242 DBG3(DD_GEN,
"memArea is NULL")
251 MemHandle memArea,
void **memPtr )
253 dsmDP4((
"\tmemOpen(): %d, %x\n", ++localMemContext.numOpen, memArea));
259 BOOLEAN valid = memValidate( memArea );
262 dsmDP1((
"memArea=%p", memArea));
267 *memPtr = (
void *) memArea;
290 MemHandle memArea, U32BIT offset, U32BIT length, BOOLEAN asyncAccess,
291 MemSeqRef *memAreaRef )
293 pLocalSeqRef pMemSeq = NULL;
296 dsmDP4((
"memSeqOpen()\n"));
298 dsmAssert((memArea != NULL));
299 dsmAssert((memAreaRef != NULL));
302 DBG2(DD_GEN,
"zero length")
306 if (localMemContext.numSeqsOpen == MEM_NUM_SEQS)
308 dsmDP4((
"INF: Memory sequence open limit reached!\n"));
309 return MEM_ERR_SEQ_OPEN_LIMIT;
313 for (loop = MEM_NUM_SEQS - 1; loop; loop--)
315 pMemSeq = &localMemContext.memSeqs[loop];
316 if (pMemSeq->pStartPos == NULL)
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;
329 localMemContext.numSeqsOpen++;
330 *memAreaRef = (MemSeqRef) pMemSeq;
340 MemSeqRef memAreaRefOrig,
341 MemSeqRef *memAreaRefClone )
343 pLocalSeqRef pMemSeqOrig = (pLocalSeqRef) memAreaRefOrig;
344 pLocalSeqRef pMemSeqClone = NULL;
347 dsmDP4((
"memSeqClone()\n"));
349 dsmAssert((memAreaRefClone != NULL));
352 if (localMemContext.numSeqsOpen == MEM_NUM_SEQS)
354 dsmDP4((
"INF: Memory sequence open limit reached!\n"));
355 return MEM_ERR_SEQ_OPEN_LIMIT;
359 for (loop = MEM_NUM_SEQS - 1; loop; loop--)
361 pMemSeqClone = &localMemContext.memSeqs[loop];
362 if (pMemSeqClone->pStartPos == NULL)
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;
374 localMemContext.numSeqsOpen++;
375 *memAreaRefClone = (MemSeqRef) pMemSeqClone;
384 MemSeqRef memAreaRef )
386 pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
388 dsmDP4((
"memSeqClose()\n"));
390 dsmAssert((memAreaRef != NULL));
393 memCheckRef(pMemSeq);
395 pMemSeq->memArea = NULL;
396 pMemSeq->pStartPos = NULL;
398 localMemContext.numSeqsOpen--;
417 memCheckRef(pMemSeq);
419 *memPtr = pMemSeq->pStartPos;
420 *numContigBytes = pMemSeq->seqLength;
438 memCheckRef(pMemSeq);
440 bytesRemaining = pMemSeq->seqLength - pMemSeq->currentOffset;
442 *memPtr = pMemSeq->pCurrentPos;
443 if (*numContigBytes > bytesRemaining)
445 *numContigBytes = bytesRemaining;
447 pMemSeq->pCurrentPos += *numContigBytes;
469 MemSeqRef memAreaRef, U32BIT *size )
471 pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
473 dsmDP4((
"memSeqSize()\n"));
475 dsmAssert((size != NULL));
478 memCheckRef(pMemSeq);
480 *size = pMemSeq->seqLength;
487 MemSeqRef memAreaRef, BOOLEAN *pValid )
489 pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
491 dsmDP4((
"memSeqValidate()\n"));
493 dsmAssert((memAreaRef != NULL));
496 if ((pMemSeq < &localMemContext.memSeqs[0]) ||
497 (pMemSeq > &localMemContext.memSeqs[MEM_NUM_SEQS - 1]) ||
498 (pMemSeq->pStartPos == NULL) ||
499 (pMemSeq->magic != MEM_MAGIC))
501 dsmDP4((
"INF: Memory sequence reference is invalid!\n"));
514 MemSeqRef src, U8BIT *byte )
516 pLocalSeqRef pMemSeq = (pLocalSeqRef) src;
518 dsmDP4((
"memSeqReadU8BIT()\n"));
520 dsmAssert((src != NULL));
521 dsmAssert((byte != NULL));
524 memCheckRef(pMemSeq);
527 if (pMemSeq->currentOffset == pMemSeq->seqLength)
529 dsmDP4((
"INF: Reached end of sequence\n"));
530 return MEM_ERR_SEQ_END_OF_DATA;
533 *byte = *pMemSeq->pCurrentPos;
534 pMemSeq->pCurrentPos++;
535 pMemSeq->currentOffset++;
544 U8BIT byte, MemSeqRef dest )
546 pLocalSeqRef pMemSeq = (pLocalSeqRef) dest;
548 dsmDP4((
"memSeqWriteU8BIT()\n"));
550 dsmAssert((dest != NULL));
553 memCheckRef(pMemSeq);
556 if (pMemSeq->currentOffset == pMemSeq->seqLength)
558 dsmDP4((
"INF: Reached end of sequence\n"));
559 return MEM_ERR_SEQ_END_OF_DATA;
562 *pMemSeq->pCurrentPos = byte;
563 pMemSeq->pCurrentPos++;
564 pMemSeq->currentOffset++;
588 memCheckRef(pMemSeq);
590 bytesRemaining = pMemSeq->seqLength - pMemSeq->currentOffset;
592 if (numBytes > bytesRemaining)
594 bytesToRead = bytesRemaining;
595 retVal = MEM_ERR_SEQ_END_OF_DATA;
599 bytesToRead = numBytes;
602 memcpy( dest, pMemSeq->pCurrentPos, bytesToRead );
604 pMemSeq->pCurrentPos += bytesToRead;
605 pMemSeq->currentOffset += bytesToRead;
607 *numBytesActual = bytesToRead;
631 memCheckRef(pMemSeq);
633 bytesRemaining = pMemSeq->seqLength - pMemSeq->currentOffset;
635 if (numBytes > bytesRemaining)
637 bytesToWrite = bytesRemaining;
638 retVal = MEM_ERR_SEQ_END_OF_DATA;
642 bytesToWrite = numBytes;
645 memcpy( pMemSeq->pCurrentPos, src, bytesToWrite );
647 pMemSeq->pCurrentPos += bytesToWrite;
648 pMemSeq->currentOffset += bytesToWrite;
650 *numBytesActual = bytesToWrite;
675 memCheckRef(pMemSeqSrc);
676 memCheckRef(pMemSeqDest);
678 bytesRemainingSrc = pMemSeqSrc->seqLength - pMemSeqSrc->currentOffset;
679 bytesRemainingDest = pMemSeqDest->seqLength - pMemSeqDest->currentOffset;
681 if (numBytes > bytesRemainingDest)
683 bytesToCopy = bytesRemainingDest;
684 retVal = MEM_ERR_SEQ_END_OF_DATA;
688 bytesToCopy = numBytes;
691 if (bytesToCopy > bytesRemainingSrc)
693 bytesToCopy = bytesRemainingSrc;
694 retVal = MEM_ERR_SEQ_END_OF_DATA;
697 memcpy( pMemSeqDest->pCurrentPos, pMemSeqSrc->pCurrentPos, bytesToCopy );
699 pMemSeqSrc->pCurrentPos += bytesToCopy;
700 pMemSeqSrc->currentOffset += bytesToCopy;
701 pMemSeqDest->pCurrentPos += bytesToCopy;
702 pMemSeqDest->currentOffset += bytesToCopy;
712 U8BIT *contig, MemSeqRef memAreaRef, U32BIT numBytes,
715 pLocalSeqRef pMemSeq = (pLocalSeqRef) memAreaRef;
717 dsmDP4((
"memSeqCompContig()\n"));
719 dsmAssert((contig != NULL));
720 dsmAssert((memAreaRef != NULL));
721 dsmAssert((numBytes > 0));
722 dsmAssert((equal != NULL));
724 memCheckRef(pMemSeq);
727 if (pMemSeq->seqLength < pMemSeq->currentOffset + numBytes)
729 return MEM_ERR_SEQ_END_OF_DATA;
733 *equal = ((memcmp( contig, pMemSeq->pCurrentPos, numBytes ) != 0) ? FALSE : TRUE);
743 MemSeqRef memAreaRef1, MemSeqRef memAreaRef2, U32BIT numBytes,
746 pLocalSeqRef pMemSeq1 = (pLocalSeqRef) memAreaRef1;
747 pLocalSeqRef pMemSeq2 = (pLocalSeqRef) memAreaRef2;
749 dsmDP4((
"memSeqCompMgd()\n"));
751 dsmAssert((memAreaRef1 != NULL));
752 dsmAssert((memAreaRef2 != NULL));
753 dsmAssert((numBytes > 0));
754 dsmAssert((equal != NULL));
756 memCheckRef(pMemSeq1);
757 memCheckRef(pMemSeq2);
760 if (pMemSeq1->seqLength < pMemSeq1->currentOffset + numBytes)
762 return MEM_ERR_SEQ_END_OF_DATA;
764 if (pMemSeq2->seqLength < pMemSeq2->currentOffset + numBytes)
766 return MEM_ERR_SEQ_END_OF_DATA;
771 pMemSeq1->pCurrentPos, pMemSeq2->pCurrentPos, numBytes ) != 0)
781 MemSeqRef memAreaRef, S32BIT position )
783 pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
784 E_DsmMemErr retVal = MEM_NO_ERR;
787 dsmDP4((
"memSeqSetPosRel()\n"));
789 dsmAssert((memAreaRef != NULL));
792 memCheckRef(pMemSeq);
794 actualOffset = pMemSeq->currentOffset + position;
796 if (actualOffset < 0)
799 pMemSeq->pCurrentPos = pMemSeq->pStartPos;
800 pMemSeq->currentOffset = 0;
801 retVal = MEM_ERR_SEQ_END_OF_DATA;
803 else if ((U32BIT)actualOffset > pMemSeq->seqLength)
806 pMemSeq->pCurrentPos = pMemSeq->pStartPos + pMemSeq->seqLength;
807 pMemSeq->currentOffset = pMemSeq->seqLength;
808 retVal = MEM_ERR_SEQ_END_OF_DATA;
813 pMemSeq->pCurrentPos = pMemSeq->pStartPos + actualOffset;
814 pMemSeq->currentOffset = actualOffset;
824 MemSeqRef memAreaRef, U32BIT position )
826 pLocalSeqRef pMemSeq = (pLocalSeqRef)memAreaRef;
827 E_DsmMemErr retVal = MEM_NO_ERR;
829 dsmDP4((
"memSeqSetPosAbs()\n"));
831 dsmAssert((memAreaRef != NULL));
834 memCheckRef(pMemSeq);
836 if (position > pMemSeq->seqLength)
839 pMemSeq->pCurrentPos = pMemSeq->pStartPos + pMemSeq->seqLength;
840 pMemSeq->currentOffset = pMemSeq->seqLength;
841 retVal = MEM_ERR_SEQ_END_OF_DATA;
846 pMemSeq->pCurrentPos = pMemSeq->pStartPos + position;
847 pMemSeq->currentOffset = position;
866 memCheckRef(pMemSeq);
868 *position = pMemSeq->currentOffset;
DSM-CC dynamic memory manager API.
Main API to DSM-CC core layer (provided functions and required callbacks).
Internal Platform dependent definitions, for debug.