windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/w3/server/wamexec.hxx
2020-09-26 16:20:57 +08:00

344 lines
9.6 KiB
C++

/*-----------------------------------------------------------------------------
Copyright (c) 1995-1997 Microsoft Corporation
Module Name :
wamexec.hxx
Abstract:
This module executes a wam request
Author:
David Kaplan ( DaveK ) 11-Mar-1997
Environment:
User Mode - Win32
Project:
W3 services DLL
-----------------------------------------------------------------------------*/
#ifndef __W3SVC_WAMEXEC_HXX__
#define __W3SVC_WAMEXEC_HXX__
#ifndef __W3SVC_WAMINFO_HXX__
#include "waminfo.hxx"
#endif
#include "ptable.hxx"
/*-----------------------------------------------------------------------------
* Forward references
-----------------------------------------------------------------------------*/
class MB;
/*-----------------------------------------------------------------------------
class WAM_DICTATOR
Class definition for the WAM_DICTATOR object.
Members:
m_pMetabase
m_Hash
m_DyingListHead
m_cRef
m_hW3SVCProcess
m_fCleanupInProcess
m_fShutdownInProgress
m_csWamCreation
m_csDyingList
-----------------------------------------------------------------------------*/
class WAM_DICTATOR
{
private:
MB* m_pMetabase; // Metabase Object
LONG m_cRef; // Reference count
BOOL m_fCleanupInProgress;
BOOL m_fShutdownInProgress;
HANDLE m_hW3Svc; // Handle of the W3Svc process
DWORD m_dwScheduledId; // ScheduledWorkItem() 's cookie.
// Access and changed of this value should be
// within a Critical Section.
CRITICAL_SECTION m_csWamCreation;
CRITICAL_SECTION m_csDyingList;
STR m_strRootAppPath;
LIST_ENTRY m_DyingListHead; // dying list
public:
CProcessTable m_PTable;
private:
DWORD m_pidInetInfo;
SV_CACHE_MAP m_ServerVariableMap;
CReaderWriterLock3 m_HashTableLock;
CWamInfoHash m_HashTable;
public:
WAM_DICTATOR();
~WAM_DICTATOR();
HRESULT InitWamDictator();
HRESULT StartShutdown();
HRESULT UninitWamDictator();
LONG Reference();
LONG Dereference();
const SV_CACHE_MAP &
QueryServerVariableMap( VOID ) const
{
return m_ServerVariableMap;
}
HRESULT ProcessWamRequest
(
HTTP_REQUEST * pHttpRequest,
EXEC_DESCRIPTOR * pExec,
const STR * pstrPath,
BOOL * pfHandled,
BOOL * pfFinished
);
// Sink Function.
HRESULT WamRegSink
(
LPCSTR szAppPath,
const DWORD dwCommand,
DWORD* pdwResult
);
// Diagnostics methods
BOOL DumpWamDictatorInfo
(
OUT CHAR * pchBuffer,
IN OUT LPDWORD lpcchBuffer
);
// Query handle to W3SVC
HANDLE HW3SvcProcess();
static VOID WINAPI CleanupScheduled(VOID *pContext); // Clean up WamInfo on the DyingList.
HRESULT CleanUpDyingList(VOID);
MB *PMetabase(VOID);
STR *QueryDefaultAppPath(VOID); // always return a pointer to STR("/LM/W3SVC").
inline
DWORD QueryInetInfoPid(VOID)
{
return m_pidInetInfo;
}
HRESULT UnLoadWamInfo
(
STR *pstrWamPath,
BOOL fCPUPause,
BOOL *pfAppCpuUnloaded = NULL
);
VOID CPUResumeWamInfo
(
STR *pstrWamPath
);
VOID CPUUpdateWamInfo
(
STR *pstrAppPath
);
static VOID StopApplicationsByInstance
(
VOID *pContext // W3_SERVER_INSTANCE *pInstance
);
VOID HashReadLock(VOID);
VOID HashReadUnlock(VOID);
VOID HashWriteLock(VOID);
VOID HashWriteUnlock(VOID);
BOOL DeleteWamInfoFromHashTable
(
CWamInfo * pWamInfo
);
BOOL FIsShutdown();
private:
// ------------------------------------------------------------
// Private Functions of CWamInfo
// ------------------------------------------------------------
HRESULT GetWamInfo
(
const STR* pstrMetabasePath,
const HTTP_REQUEST* pHttpRequest,
CWamInfo ** ppWamInfo
);
HRESULT CreateWamInfo
(
const STR & strAppRootPath,
CWamInfo ** ppWamInfo,
PW3_SERVER_INSTANCE pwsiInstance
);
INT FindWamInfo
(
const STR * pstrMetabasePath,
CWamInfo ** ppWamInfo
);
BOOL AddWamInfo
(
CWamInfo* pWamInfo
);
HRESULT ShutdownWamInfo
(
CWamInfo* pWamInfo,
INT cIgnoreRefs
);
LK_PREDICATE DeleteIfTimeOut
(
CWamInfo* pWamInfo,
void* pvState
);
HRESULT MDGetAppVariables
(
LPCSTR szMetabasePath,
BOOL* pfAllowAppToRun,
CLSID* pclsidWam,
BOOL* pfInProcess,
BOOL* pfInPool,
BOOL* pfEnableTryExcept,
DWORD *pdwOOPCrashThreshold,
BOOL* pfJobEnabled,
WCHAR* wszPackageID,
DWORD* pdwPeriodicRestartRequests,
DWORD* pdwPeriodicRestartTime,
MULTISZ*pmszPeriodicRestartSchedule,
DWORD* pdwShutdownTimeLimit
);
HRESULT InsertDyingList
(
CWamInfo* pWamInfo,
BOOL fNeedReference = TRUE
);
void CreateWam_Lock(void);
void CreateWam_UnLock(void);
void ScheduledId_Lock();
void ScheduledId_UnLock();
void DyingList_Lock(void);
void DyingList_UnLock(void);
static LK_PREDICATE DeleteInShutdown
(
CWamInfo* pWamInfo,
void* pvState
);
}; // class WAM_DICTATOR
dllexp extern WAM_DICTATOR *g_pWamDictator; // global wam dictator
inline HANDLE WAM_DICTATOR::HW3SvcProcess() { return( m_hW3Svc ); }
inline BOOL WAM_DICTATOR::FIsShutdown() {return m_fShutdownInProgress; }
inline VOID WAM_DICTATOR::CleanupScheduled(VOID *pContext)
{
g_pWamDictator->CleanUpDyingList();
}
inline LK_PREDICATE WAM_DICTATOR::DeleteIfTimeOut
(
CWamInfo* pWamInfo,
void* pvState
)
{
return LKP_PERFORM;
}
inline void WAM_DICTATOR::CreateWam_Lock(void) {EnterCriticalSection(&m_csWamCreation);}
inline void WAM_DICTATOR::CreateWam_UnLock(void) {LeaveCriticalSection(&m_csWamCreation);}
inline void WAM_DICTATOR::ScheduledId_Lock(void) {CreateWam_Lock();};
inline void WAM_DICTATOR::ScheduledId_UnLock(void) {CreateWam_UnLock();};
inline void WAM_DICTATOR::DyingList_Lock(void) {EnterCriticalSection(&m_csDyingList);}
inline void WAM_DICTATOR::DyingList_UnLock(void) {LeaveCriticalSection(&m_csDyingList);}
inline MB *WAM_DICTATOR::PMetabase(void) {return m_pMetabase;}
inline STR *WAM_DICTATOR::QueryDefaultAppPath(void) {return &m_strRootAppPath;}
inline VOID WAM_DICTATOR::HashReadLock(VOID) {m_HashTableLock.ReadLock();}
inline VOID WAM_DICTATOR::HashReadUnlock(VOID) {m_HashTableLock.ReadUnlock();}
inline VOID WAM_DICTATOR::HashWriteLock(VOID) {m_HashTableLock.WriteLock();}
inline VOID WAM_DICTATOR::HashWriteUnlock(VOID) {m_HashTableLock.WriteUnlock();}
/*-----------------------------------------------------------------------------
WAM_DICTATOR::Reference
Increment WAM_DICTATOR reference count.
WARNING: return value of InterlockedIncrement is only -1, 0, 1, and is not Reference. should not use
the return value.
Return:
LONG
-----------------------------------------------------------------------------*/
inline LONG WAM_DICTATOR::Reference()
{
return InterlockedIncrement(&m_cRef);
}
/*-----------------------------------------------------------------------------
WAM_DICTATOR::Dereference
Dereference WAM_DICTATOR
Warning: Should not use the return value.
Return:
LONG
-----------------------------------------------------------------------------*/
inline LONG WAM_DICTATOR::Dereference()
{
DBG_ASSERT(m_cRef > 0);
return InterlockedDecrement(&m_cRef);
}
#define HASH_TABLE_REF 1
#define DYING_LIST_REF 1
#define FIND_KEY_REF 1
/*-----------------------------------------------------------------------------
* Globals
-----------------------------------------------------------------------------*/
extern "C" dllexp BOOL
WamDictatorDumpInfo
(
OUT CHAR * pch,
IN OUT LPDWORD lpcchBuff
);
VOID
RecycleCallback(
VOID * pvContext
);
#endif // __W3SVC_WAMEXEC_HXX__
/************************ End of File ***********************/