[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 _xvheaplock()
 Lock an allocated block of segment heap memory
------------------------------------------------------------------------------
 C Prototype

     #include "vm.api"
     FARP _xvheaplock(
                       HANDLE hSegment,
                       USHORT uiOffset
                     )

 Arguments

     hSegment is the VM segment handle returned by _xvheapnew().

     uiOffset is the offset of the allocated memory block returned by
     _xvheapalloc().

 Returns

     _xvheaplock() returns a far pointer to the allocated memory block, or a
     NULL pointer, if either argument is invalid.

 Description

     _xvheaplock() locks the entire segment heap, guaranteeing that the
     allocated memory block is located in conventional memory and will not be
     moved or swapped out by the VMM system.  The pointer returned is valid
     until all blocks of memory within the segment are unlocked using
     _xvheapunlock().

     Warning!  Do not leave a memory block locked unnecessarily.  Because
     all locked segments reside in conventional memory, the more of them you
     lock, the greater the chance of exhausting conventional memory.
     Therefore, always unlock a memory block with _xvheapunlock() when you
     are not actively accessing it.  Typically, this will mean locking and
     unlocking the same memory block several times within one function call.

     You must eventually unlock memory blocks locked by _xvheaplock() using
     _xvheapunlock().

 Notes

     .  Error conditions:  If there is not enough VM swap space available
        for the segment to be loaded into conventional memory, the system
        raises an internal error and halts.

 Examples

     .  This example creates a segment heap with _xvheapnew() and
        allocates a memory block in the segment heap.  The block is then
        locked and the string is copied into it.  Later, the memory block is
        unlocked, the memory freed, and the heap destroyed:

        // CA-Clipper include files
        #include "extend.api"
        #include "vm.api"

        // Microsoft C include files
        #include "string.h"

        // Prototype
        Boolean VMHeapExample(char * spSrc);

        #define HEAP_SIZE   4096

        Boolean VMHeapExample(char * spSrc)
        {
           HANDLE hSegment;
           unsigned uiStringOffset;
           unsigned uiBufflen;
           char * spString;
           Boolean bResult = FALSE;

           if (hSegment = _xvheapnew(HEAP_SIZE))
              {
              uiBufflen = strlen(spSrc) + 1;
              uiStringOffset = _xvheapalloc(hSegment, uiBufflen);
              if (uiStringOffset)
                 {
                 spString = _xvheaplock(hSegment, uiStringOffset);
                 if (spString != NULL)
                    {
                    strcpy(spString, spSrc);

                    .
                    . <statements>
                    .

                    bResult = TRUE;

                    _xvheapunlock(hSegment, uiStringOffset);
                    }
                 _xvheapfree(hSegment, uiStringOffset);
                 }
              _xvheapdestroy(hSegment);
              }

           return (bResult);

        }

 Files  Library is CLIPPER.LIB, header file is Vm.api.


See Also: _xvheapalloc() _xvheapnew() _xvheapunlock() _xvlockcount()
This page created by ng2html v1.05, the Norton guide to HTML conversion utility. Written by Dave Pearson