Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
7.2 KiB

// Ruler
// 1 2 3 4 5 6 7 8
//345678901234567890123456789012345678901234567890123456789012345678901234567890
/********************************************************************/
/* */
/* The standard layout. */
/* */
/* The standard layout for 'cpp' files in this code is as */
/* follows: */
/* */
/* 1. Include files. */
/* 2. Constants local to the class. */
/* 3. Data structures local to the class. */
/* 4. Data initializations. */
/* 5. Static functions. */
/* 6. Class functions. */
/* */
/* The constructor is typically the first function, class */
/* member functions appear in alphabetical order with the */
/* destructor appearing at the end of the file. Any section */
/* or function this is not required is simply omitted. */
/* */
/********************************************************************/
#include "HeapPCH.hpp"
#include "Connections.hpp"
#include "Cache.hpp"
#include "Find.hpp"
#include "Heap.hpp"
#include "NewPage.hpp"
/********************************************************************/
/* */
/* Class constructor. */
/* */
/* There are a variety of connections that need to be made */
/* after all the classes are ready for use. However, we */
/* initially zero all these connection pointers until we are */
/* ready to link everything. */
/* */
/********************************************************************/
CONNECTIONS::CONNECTIONS( VOID )
{
Active = False;
Heap = NULL;
NewPage = NULL;
ParentCache = NULL;
PrivateFind = NULL;
PublicFind = NULL;
}
/********************************************************************/
/* */
/* Delete from the find lists. */
/* */
/* When we delete a page we need to remove it from the private */
/* and public find tables as needed. */
/* */
/********************************************************************/
VOID CONNECTIONS::DeleteFromFindList( PAGE *Page )
{
//
// Delete from any active public find table.
//
if ( PublicFind != NULL )
{ PublicFind -> DeleteFromFindList( Page ); }
//
// Delete from any active private find table.
//
if ( PrivateFind != NULL )
{ PrivateFind -> DeleteFromFindList( Page ); }
}
/********************************************************************/
/* */
/* Add to the find lists. */
/* */
/* When we create a page we need to insert it into the private */
/* and public find tables as needed. */
/* */
/********************************************************************/
VOID CONNECTIONS::InsertInFindList( PAGE *Page )
{
//
// Insert into any active private find table.
//
if ( PrivateFind != NULL )
{ PrivateFind -> InsertInFindList( Page ); }
//
// Insert into any active public find table.
//
if ( PublicFind != NULL )
{ PublicFind -> InsertInFindList( Page ); }
}
/********************************************************************/
/* */
/* Update the connections. */
/* */
/* When we create an allocator there is some information that */
/* is not available. Here we update the connection information */
/* so we can locate the correct instances of various other */
/* classes. */
/* */
/********************************************************************/
VOID CONNECTIONS::UpdateConnections
(
HEAP *NewHeap,
NEW_PAGE *NewPages,
CACHE *NewParentCache,
FIND *NewPrivateFind,
FIND *NewPublicFind
)
{
//
// We typically only need to update the connections once
// but in some situations multiple updates can occur. If
// this is the case we carefully check the update is
// consistent with the previous update.
//
if ( ! Active )
{
//
// We now have the information we need to update the
// connections.
//
Active = True;
Heap = NewHeap;
NewPage = NewPages;
ParentCache = NewParentCache;
PrivateFind = NewPrivateFind;
PublicFind = NewPublicFind;
}
else
{
//
// Nasty, we have already updated the connections once.
// Since we have been called again we know this node
// must be shared between two heaps. We can deal with
// this as long as selected pointers are the same.
//
if
(
(PublicFind != NewPublicFind)
||
(NewPage != NewPages)
||
(ParentCache != NewParentCache)
)
{ Failure( "Sharing violation in UpdateConnections" ); }
}
}
/********************************************************************/
/* */
/* Class destructor. */
/* */
/* Destory the connections. */
/* */
/********************************************************************/
CONNECTIONS::~CONNECTIONS( VOID )
{
PublicFind = NULL;
PrivateFind = NULL;
ParentCache = NULL;
NewPage = NULL;
Heap = NULL;
Active = False;
}