|
|
/*-----------------------------------------------------------------------------
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 ***********************/
|