2020-09-30 16:53:49 +02:00

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__