home *** CD-ROM | disk | FTP | other *** search
- #include "..\MEMORY\MEMORY.HPP"
- #include <alloc.h>
-
- // ------------------------------------------------------------------
- // File: CONV.CPP
- // Path: ...\REHACK\MEMORY\CONV.CPP
- // Version: 0.01
- // Author: Pat Reilly
- // CIS Id: 71333,2764
- // Created On: 6/28/93
- // Modified On:
- // Description: ConvMemory class for REHACK. See MEMORY.TXT for
- // more details.
- // Tabs: 4
- // ------------------------------------------------------------------
-
- long ConvMemory::memPoolSize = 0L;
-
- ConvMemory::ConvMemory()
- {
- vp = 0;
- }
-
- ConvMemory::ConvMemory(word sz)
- {
- vp = 0;
- allocate(sz);
- }
-
- bool ConvMemory::allocate(word sz)
- {
- // Fail if already have mem allocated or if sz == 0.
- if( vp != 0 || sz == 0 )
- return false;
-
- // Cannot dip into the safety pool. Ensure there's enough memory.
- long l = maxAvail();
- if( l-(long)sz < memPoolSize )
- return false;
-
- vp = new char [sz];
- if( vp != 0 )
- memsize = sz;
- else
- memsize = 0;
- return bool(vp!= 0);
- }
-
- void ConvMemory::free()
- {
- // Don't free if the lockflag is still set.
- if(lockflag)
- return;
-
- delete vp;
- vp = 0;
- }
-
- void FAR* ConvMemory::lock()
- {
- if( vp )
- lockflag++;
- return vp;
- }
-
- void ConvMemory::unlock()
- {
- if(lockflag)
- lockflag--;
- }
-
- long ConvMemory::memAvail()
- {
- // Get total amt available, taking fragmentation into account.
- long l = coreleft();
- struct heapinfo heap;
-
- switch( heapcheck() )
- {
- case _HEAPEMPTY:
- break;
-
- case _HEAPCORRUPT:
- l = 0;
- break;
-
- case _HEAPOK:
- heap.ptr = NULL;
- while(heapwalk(&heap) != _HEAPEND)
- if(!heap.in_use)
- l += heap.size;
- break;
- }
- return l;
- }
-
- long ConvMemory::maxAvail()
- {
- // Search in fragmented heap, as well as top of heap.
- long l = coreleft();
- struct heapinfo heap;
-
- switch( heapcheck() )
- {
- case _HEAPEMPTY:
- break;
-
- case _HEAPCORRUPT:
- l = 0;
- break;
-
- case _HEAPOK:
- heap.ptr = NULL;
- while(heapwalk(&heap) != _HEAPEND)
- if( !heap.in_use && heap.size > l )
- l = heap.size;
- break;
- }
- return l;
- }
-