windows-nt/Source/XPSP1/NT/enduser/netmeeting/t120/mst123/memory2.h
2020-09-26 16:20:57 +08:00

233 lines
6 KiB
C++

/*
* memory.h
*
* Copyright (c) 1993 - 1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the interface file for the Memory class. Instances of this
* class are used to pass data around the system.
*
* Each instance of this class maintains two pointers. The first is a
* pointer to the reference data (or the source data) which this object
* is responsible for representing. The second is a pointer to a copy
* buffer, which is a piece of allocated memory that a Memory object
* can copy the data into if necessary.
*
* When a Memory object is created, both of these addresses are passed
* in to it. It does not, however, copy the data from the reference
* buffer to the copy buffer just yet. If anyone asks the address of the
* buffer, it will simply return the reference pointer. However, the
* first time the buffer is locked, the data will be copied from the
* reference buffer to the copy buffer for safe keeping. In essence,
* the lock function tells the Memory object that someone is interested
* in the data for longer than the reference buffer will remain valid.
*
* After the object is locked, a call to retrieve a memory pointer will
* result in the copy pointer being returned.
*
* Each time the lock function is called, a lock count is incremented.
* The copy operation only takes place the first time the buffer is
* locked, however.
*
* In addition to maintaining a lock count, this object keeps a flag
* indicating whether or not it has been freed by the allocator. This
* freeing really means that the object is enabled to be freed as soon
* as the lock count hits zero.
*
* Caveats:
* None.
*
* Author:
* James P. Galvin, Jr.
*/
#ifndef _MEMORY2_H_
#define _MEMORY2_H_
/*
* FreeStack
* This is a list container that can be used to hold memory addresses.
* This structure is used to keep information about each free stack. There
* is one free stack for each size block being maintained by each memory
* manager.
*/
typedef struct
{
ULong block_size;
ULong total_block_count;
ULong current_block_count;
ULong block_stack_offset;
} FreeStack;
typedef FreeStack * PFreeStack;
/*
* This type is used to represent a block number in the memory manager. This
* is essentially an index used to uniquely identify each block being
* maintained by an instance of this class.
*/
typedef ULong BlockNumber;
typedef BlockNumber * PBlockNumber;
#define INVALID_BLOCK_NUMBER 0xffffffffL
/*
* This type is used to determine when a memory object should be destroyed.
* When a memory object is created, this field is set by the owner. The owner
* can then ask for the value of this field at any time to help determine when
* the object should be destroyed. Essentially, this field indicates whether
* the global lock count for the memory this object represents should be used
* to determine when this object should be destroyed.
*/
typedef enum
{
MEMORY_LOCK_NORMAL,
MEMORY_LOCK_IGNORED
} MemoryLockMode;
/*
* This is the class definition for the Memory class.
*/
class Memory;
typedef Memory * PMemory;
class Memory
{
public:
Memory (PUChar reference_ptr,
ULong length,
PUChar copy_ptr,
BlockNumber block_number,
MemoryLockMode memory_lock_mode);
virtual ~Memory () { };
PUChar GetPointer ()
{
return (Copy_Ptr);
}
ULong GetLength ()
{
return (Length);
}
BlockNumber GetBlockNumber ()
{
return (Block_Number);
}
MemoryLockMode GetMemoryLockMode ()
{
return (Memory_Lock_Mode);
}
private:
ULong Length;
PUChar Copy_Ptr;
BlockNumber Block_Number;
MemoryLockMode Memory_Lock_Mode;
};
/*
* Memory (
* PUChar reference_ptr,
* ULong length,
* PUChar copy_ptr,
* PFreeStack free_stack,
* BlockNumber block_number)
*
* Functional Description:
* This is the constructor for the Memory class. All it does is
* initialize the instance variable with the passed in values.
*
* Formal Parameters:
* reference_ptr (i)
* This is a pointer to the data that is to represented by this
* Memory object.
* length (i)
* This is the length of the reference buffer.
* copy_ptr (i)
* This is the address of an allocated buffer that the Memory object
* can use to preserve the contents of the reference buffer if a lock
* operation occurs.
* free_stack (i)
* This is a pointer to a list container that the allocated memory
* block came from. This field is not used internally, and is only
* held here in order to improve the performance of the memory
* manager that is using Memory objects.
* block_number (i)
* This is the block number for the memory block that is represented
* by this object. This field is not used internally, and is only
* held here in order to improve the performance of the memory
* manager that is using Memory objects.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* ~Memory ()
*
* Functional Description:
* This is the destructor for the Memory class. It does nothing at this
* time. Note that it is the responsibility of the memory manager that
* is using Memory objects to free up the memory.
*
* Formal Parameters:
* None.
*
* Return Value:
* None.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* ULong GetLength ()
*
* Functional Description:
* This function retrieves the length of the data being represented by
* this object.
*
* Formal Parameters:
* None.
*
* Return Value:
* The length of the data.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
/*
* BlockNumber GetBlockNumber ()
*
* Functional Description:
* This function retrieves the block number of the block that is being
* represented by this object. This allows the memory manager to put the
* memory block back into the stack very efficiently.
*
* Formal Parameters:
* None.
*
* Return Value:
* The block number of the internal memory block.
*
* Side Effects:
* None.
*
* Caveats:
* None.
*/
#endif