home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windoware
/
WINDOWARE_1_6.iso
/
winutil
/
mlocal
/
mlocal.txt
< prev
next >
Wrap
Text File
|
1991-03-16
|
10KB
|
302 lines
Legal Stuff...
SOFTWARE LICENSE
You can use the routines in MLOCAL.ZIP royalty free if you
pay me $59.95. If you don't pay me, you can't use them.
"Use" means as you would "use" any other Copyrighted
software of this nature.
If there is a bug or any other problem with the routines
contained in MLOCAL.ZIP, and it damages you legally (or
otherwise) in any way its your problem not mine. You get
the source so you are liable!
If you find a bug let me know about it and I'll fix it and
upload a new version.
Send to: Dan Quigley
17219 NE 32nd Street
Redmond, WA 98052
USA
For support or bug reports call: (206) 885-9694
Fun Stuff...
MULTIPLE LOCAL HEAPS
The routines in MLOCAL.ZIP work on the principle that
Windows local heap management routines use the current
selector or (real mode segment) in the DS register, as the
"base" segment for its objects. You will note that most all
the routines change the DS register just prior to the
"normal" LocalXXXX call.
The only difference these routines have from their Windows
KERNEL counterparts is that they use sizeof(DWORD) handles
and the MultLocalLock() routine returns a far pointer. You
can expect the same behavior normally associated with the
Windows functions.
Applications that use MDI will find these routines
especially useful as they allow a separate "local" heap for
each MDI child. I have included an example of how this can
be done (see MLTEST.C).
For those of you that want optimal performance, You can use
the function SetDStoHeap(). This functions does just what
its name implies. There are several caveats to using this:
1) Since you have changed your DS, you no longer have
access to any global variables. (you can make far pointers
to the variables you need access to and pass them into your
function)
2) While your DS is changed, the same rules apply to DLLs
DS!=SS. So don't expect the C runtime functions that assume
this to work. (see the SDK docs).
3) You will have to make you own NEAR pointers. DO NOT
expect the C compiler to do this for you. You will GP fault
at best.
FARLOCAL MEMORY
Included with the Multiple Local Heap routines are several
"FarLocal" that make use of some of the Multiple heap
routines. These hybrid functions allow applications to
allocate memory in the "spirit" of C runtime.
Each global allocation (using GlobalAlloc) you make in
Windows pmode, allocates at least one selector. The
80286/386/486 processors limit the size of descriptor
table(s) to 64k, thus allowing 8k selectors. (in enhanced
mode, all windows apps (including drivers) run in a single
pmode VM). This can be a "limitation" to some application's
memory schemes, that use GlobalAlloc as its main source of
memory and make hundreds of allocations.
These FarLocal routines allow you to allocate as many
protect mode "global" objects as memory allows. As usual,
you can't get something for nothing, so the limitation of
FarLocal memory is that each memory object must be less than
64k.
FarLocal routines use a VERY simple memory management
paradigm. It is not the most efficient if your application
manipulates memory objects frequently. My suggestion if you
need this ability, is either re-write the FarLocal memory
manager or use standard global memory (GlobalAlloc) for
those objects that get manipulated alot. The latter is much
less work.
LISTMGR.ASM
As an added bonus I have included a copy of my linked list
manager. This is coded for the 386/486 ONLY, and is intended
as a useful example of how you can use the FarLocal
routines. You can use these routines under the same license
as above. I do not intend to rewrite these for use on
another processor in the near future. So if you need that
functionality, the source is included so have at it.
To assemble LISTMGR.ASM without the debug list dump routines
undefine the appropriate flag. (see source file)
Since it makes use of 32 bit registers, this code is fast
as linked list managers go.
MLTEST
MLTEST is a quick and dirty demo of how you can implement
the functions in this package. I make several nasty
assumptions on the equipment you have. (sorry)
In order to see the listmgr dumps you will have to have
a terminal or a PC running a terminal program attached
to the AUX: device. (or use a driver that redirects output
to your monochrome monitor.) You can also see output if
you are using CVW. (it redirects output to AUX)
To see the allocations of FarLocal memory you will need
to have a monochrome adaptor and monitor attached.
Multiple local heap demo runs as a MDI window app and
all output is to MDI child windows.
KUDOS
Enjoy, Thanks for patronizing me. Oh yes, Windows is a trademark
of Microsoft.
Dan
DOCUMENTATION:
Multiple Local Heaps:
The documentation for the following routines is exactly the
same as is found in the Windows SDK Reference Manual. Except
for the addition of an hHeap parameter and the following:
HANDLE MultLocalInit(wInitialSize)
This function allocates and initializes a "local" heap from
the Windows Global memory manager. You must call this
function prior to calling any of the Multiple Local Heap
Routines. The handle returned from this function is used to
identify each heap and is a necessary parameter to the
remaining Multiple local heap functions.
Heaps will grow/shrink dynamically as need be. Each heap can
grow to a maximum of 64k bytes.
Parameter Type/Description
------------------------------------------------------------
hInitalSize WORD Specifies the initial size of the heap.
The value must be greater than 256 bytes and
less than 64k bytes.
Return Value: The return value identifies the newly
allocated heap if the function is successful. Otherwise it
is NULL.
HANDLE SetDStoHeap(hHeap)
This function sets the current DS to that of the hHeap. This
allows use of NEAR pointers for Multiple Local heap objects.
(see caveats above)
Parameter Type/Description
------------------------------------------------------------
hHeap HANDLE Identifies the heap.
Return Value: The return value is the previous DS selector.
Usage: hOldDS = SetDStoHeap(hHeap);
/* near pointer code */
SetDStoHeap(hOldDS);
With the addition of the hHeap parameter (which is returned
by MultLocalInit, the documentation to the following
functions can be found in the Microsoft Windows SDK
Reference Manual (Volume 1)
Function Page
----------------------------------------------------------
HANDLE MultLocalAlloc(hHeap, wFlags, wBytes) 4-285
WORD MultLocalCompact(hHeap, wBytes) 4-286
HANDLE MultLocalDiscard(hHeap,hMem) 4-287
WORD MultLocalFlags(hHeap, hMem) 4-287
HANDLE MultLocalFree(hHeap, hMem) 4-288
HANDLE MultLocalHandle(hHeap, lpMem) 4-288
LPSTR MultLocalLock(hHeap, hMem) 4-289
HANDLE MultLocalReAlloc(hHeap, hMem, wBytes, wFlags) 4-290
HANDLE MultLocalShrink(hHeap,wSize) 4-291
WORD MultLocalSize(hHeap, hMem) 4-292
BOOL MultLocalUnlock(hHeap, hMem) 4-292
FarLocal Routines:
FHANDLE FarLocalAlloc(wFlags, wBytes)
This function allocates the number of bytes of memory
specified by the wBytes parameter from the farlocal heap.
The memory block can either be fixed or moveable, as
specified by the wFlags parameter.
Parameter Type/Description
------------------------------------------------------------
wFlags WORD See LocalAlloc page 4-285 in the
Microsoft Windows SDK Reference Volume 1.
wBytes WORD Specifies the total number of bytes
to be allocated.
Return Value: The return value identifies the newly
allocated farlocal memory block if the function is
successful. Otherwise it is NULL.
FHANDLE FarLocalFree(fhMem)
This function frees the memory block identified by the fhMem
parameter and invalidates the handle of the memory block.
Parameter Type/Description
------------------------------------------------------------
fhMem FHANDLE Identifies the memory block
Return Value: The return value specifies the outcome of the
function. It is NULL if successful. Otherwise it is equal to
fhMem.
LPSTR FarLocalLock(fhMem)
This function locks the farlocal memory block specified by
the fhMem parameter. The block is locked into memory at the
given address and its reference count is incremented. Locked
memory cannot be moved or discarded. The block remains
locked in memory until its reference count is decremented to
zero using the FarLocalUnlock function.
Parameter Type/Description
------------------------------------------------------------
fhMem FHANDLE Identifies the memory block to
be locked.
Return Value: The return value points to the first byte of
memory in the memory block if the function is successful.
Otherwise it is NULL
BOOL FarLocalUnlock(fhMem)
This function unlocks the farlocal memory block specified by
the fhMem parameter. The blocks reference count is
decremented.
Parameter Type/Description
------------------------------------------------------------
fhMem FHANDLE Identifies the memory block to
be unlocked.
Return Value: BOOL The return value is zero if the blocks
reference count was decreased to zero. Otherwise it is
nonzero.