146 lines
3.9 KiB
C++
146 lines
3.9 KiB
C++
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Copyright (C) 2000, Microsoft Corporation
|
|
//
|
|
// File: DfsReferralData.hxx
|
|
//
|
|
// Contents: the DFS Referral dataclass
|
|
//
|
|
// Classes: DfsReferralData
|
|
//
|
|
// History: Dec. 8 2000, Author: udayh
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef __DFS_REFERRAL_DATA__
|
|
#define __DFS_REFERRAL_DATA__
|
|
|
|
#include "DfsGeneric.hxx"
|
|
#include "DfsReplica.hxx"
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Class: DfsReferralData
|
|
//
|
|
// Synopsis: This class implements the DfsReferralData class
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
|
|
#define MAX_DFS_REFERRAL_LOAD_WAIT 60000
|
|
|
|
|
|
#define DFS_ROOT_REFERRAL 0x1
|
|
|
|
class DfsReferralData: public DfsGeneric
|
|
{
|
|
private:
|
|
|
|
HANDLE _WaitHandle; // Event on which threads wait
|
|
ULONG _TickCount; // Last use tick count.
|
|
|
|
protected:
|
|
ULONG _Flags; // Flags
|
|
public:
|
|
ULONG ReplicaCount; // how many replicas?
|
|
DfsReplica *pReplicas; // list of replicas.
|
|
// DfsDev: PolicyList;
|
|
DFSSTATUS LoadStatus; // Status of load.
|
|
ULONG Timeout;
|
|
|
|
public:
|
|
|
|
//
|
|
// Function DfsReferralData: Constructor for this class.
|
|
// Creates the event on which other threads should wait while load is
|
|
// in progress.
|
|
//
|
|
DfsReferralData( DFSSTATUS *pStatus, DfsObjectTypeEnumeration Type = DFS_OBJECT_TYPE_REFERRAL_DATA) :
|
|
DfsGeneric(Type)
|
|
{
|
|
pReplicas = NULL;
|
|
ReplicaCount = 0;
|
|
LoadStatus = STATUS_SUCCESS;
|
|
|
|
_Flags = 0;
|
|
*pStatus = STATUS_SUCCESS;
|
|
//
|
|
// create an event that we will be set and reset manually,
|
|
// with an initial state set to false (event is not signalled)
|
|
//
|
|
_WaitHandle = CreateEvent( NULL, //must be null.
|
|
TRUE, // manual reset
|
|
FALSE, // initial state
|
|
NULL ); // event not named
|
|
if ( _WaitHandle == NULL )
|
|
{
|
|
*pStatus = ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Function ~DfsReferralData: Destructor.
|
|
//
|
|
~DfsReferralData()
|
|
{
|
|
|
|
//
|
|
// note that if any of our derived classes do their own
|
|
// destructor processing of preplicas, they should set it to
|
|
// null, to avoid double frees.
|
|
// The FolderReferralData does this.
|
|
//
|
|
if (pReplicas != NULL)
|
|
{
|
|
delete [] pReplicas;
|
|
}
|
|
|
|
if ( _WaitHandle != NULL )
|
|
{
|
|
CloseHandle(_WaitHandle);
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Function Wait: This function waits on the event to be signalled.
|
|
// If the load state indicates load is in progress, the thread calls
|
|
// wait, to wait for the load to complete.
|
|
// When the load is complete, the thread that is doing the load calls
|
|
// signal to signal the event so that all waiting threads are
|
|
// unblocked.
|
|
// We set a max wait to prevent some thread from blocking for ever.
|
|
//
|
|
DFSSTATUS
|
|
Wait()
|
|
{
|
|
DFSSTATUS Status;
|
|
|
|
Status = WaitForSingleObject( _WaitHandle,
|
|
MAX_DFS_REFERRAL_LOAD_WAIT );
|
|
if ( Status == ERROR_SUCCESS )
|
|
{
|
|
Status = LoadStatus;
|
|
}
|
|
return Status;
|
|
}
|
|
|
|
|
|
//
|
|
// Function Signal: Set the event to a signalled state so that
|
|
// all waiting threads will be woken up.
|
|
//
|
|
VOID
|
|
Signal()
|
|
{
|
|
SetEvent( _WaitHandle );
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
#endif // __DFS_REFERRAL_DATA__
|