|
|
/*-----------------------------------------------------------------------------
Copyright (c) 1995-1998 Microsoft Corporation
Module Name : ptable.hxx
Abstract: Header file for WAMINFO object.
Author: Lei Jin ( LeiJin ) 13-Oct-1998
Environment: User Mode - Win32
Project: W3 services DLL
-----------------------------------------------------------------------------*/ #ifndef __W3SVC_PTABLE_HXX__
#define __W3SVC_PTABLE_HXX__
#include <lkrhash.h>
// Define const and macro.
//
#define uSizeCLSIDStr 39
#define RELEASE(p) {if ( p ) { p->Release(); p = NULL; }}
#define FREEBSTR(p) {if (p) {SysFreeString( p ); p = NULL;}}
// Define application modes currently supported
//
enum EAppMode { eAppInProc, eAppOOPIsolated, eAppOOPPool };
// forward declarition
class CWamInfo;
/////////////////////////////////////////////////////////////////////
// CPorcessEntry
// A record that contains per process info, such as process id, process handle, etc.
//
/////////////////////////////////////////////////////////////////////
class CProcessEntry { public: CProcessEntry( DWORD dwProcessId, HANDLE hProcessHandle, LPCWSTR pszPackageId );
~CProcessEntry();
DWORD QueryProcessId() const; HANDLE QueryProcessHandle() const; WCHAR* QueryPackageId() const; bool IsCrashed() const; BOOL IsRecycling() const; bool IsLinkedWithWamInfo() const; bool FindWamInfo(CWamInfo** ppWamInfo); void NotifyCrashed(); bool Recycle();
void AddRef(); void Release();
bool AddWamInfoToProcessEntry(CWamInfo* pWamInfo); bool RemoveWamInfoFromProcessEntry ( CWamInfo* pWamInfo, bool* fDelete );
public: LIST_ENTRY m_ListHeadOfWamInfo; DWORD m_dwShutdownTimeLimit; DWORD m_dwShutdownStartTime; CWamInfo * m_pShuttingDownCWamInfo;
private: DWORD m_dwSignature; DWORD m_dwProcessId; HANDLE m_hProcessHandle; long m_cRefs; WCHAR m_wszPackageId[40]; // 40 >> uSizeCLSIDStr.
bool m_fCrashed; BOOL m_fRecycling; };
// Query Process Id.
inline DWORD CProcessEntry::QueryProcessId() const { return m_dwProcessId; }
// Query COM+ application id(GUID).
inline WCHAR* CProcessEntry::QueryPackageId() const { return (WCHAR*)m_wszPackageId; }
// Query Process handle.
inline HANDLE CProcessEntry::QueryProcessHandle() const { return m_hProcessHandle; }
// Check to see fCrashed flag is set.
inline bool CProcessEntry::IsCrashed() const { return m_fCrashed; }
// Check to see if process is recycling
inline BOOL CProcessEntry::IsRecycling() const { return m_fRecycling; } inline void CProcessEntry::AddRef() { InterlockedIncrement(&m_cRefs); }
// Check to see any linked with any WamInfo.
inline bool CProcessEntry::IsLinkedWithWamInfo() const { return IsListEmpty(&m_ListHeadOfWamInfo); }
// Set m_fCrashed flag to TRUE.
inline void CProcessEntry::NotifyCrashed() { InterlockedExchange((PLONG)&m_fCrashed, (LONG)TRUE); }
////////////////////////////////////////////////////////////////////
// CProcessEntryHash
// A hash table for CProcessEntry. Implemented using LK-hashing.
// Key is DWORD type, process id.
//
///////////////////////////////////////////////////////////////////
class CProcessEntryHash : public CTypedHashTable<CProcessEntryHash, CProcessEntry, DWORD> { public: static DWORD ExtractKey(const CProcessEntry* pEntry);
static DWORD CalcKeyHash(DWORD dwKey);
static bool EqualKeys(DWORD dwKey1, DWORD dwKey2);
static void AddRefRecord(CProcessEntry* pEntry, int nIncr);
CProcessEntryHash ( double maxload, // Bound on average chain length,
size_t initsize, // Initial size of Hash Table
size_t num_subtbls // #subordinate hash tables.
) : CTypedHashTable<CProcessEntryHash, CProcessEntry, DWORD> ("PTable", maxload, initsize, num_subtbls) {} };
inline DWORD CProcessEntryHash::ExtractKey(const CProcessEntry* pEntry) { return pEntry->QueryProcessId(); }
inline DWORD CProcessEntryHash::CalcKeyHash(DWORD dwKey) { return dwKey; }
inline bool CProcessEntryHash::EqualKeys(DWORD dwKey1, DWORD dwKey2) { return (dwKey1 == dwKey2); }
inline void CProcessEntryHash::AddRefRecord(CProcessEntry* pEntry, int nIncr) { if (nIncr == 1) { pEntry->AddRef(); } else { pEntry->Release(); } }
interface ICOMAdminCatalog2; ////////////////////////////////////////////////////////////////
// CProcessTable
// Global data structure that manages the hash table.
////////////////////////////////////////////////////////////////
class CProcessTable { public:
CProcessTable(); ~CProcessTable();
void Lock(); void UnLock();
CProcessEntry* AddWamInfoToProcessTable ( CWamInfo *pWamInfo, LPCWSTR szPackageId, DWORD pid ); bool RemoveWamInfoFromProcessTable ( CWamInfo *pWamInfo ); bool FindWamInfo ( CProcessEntry* pProcessEntry, CWamInfo** ppWamInfo );
bool RecycleWamInfo ( CWamInfo * pWamInfo ); bool Init(); bool UnInit();
private: HRESULT ShutdownProcess ( DWORD dwProcEntryPid );
DWORD m_dwCnt; DWORD m_pCurrentProcessId; CProcessEntryHash m_HashTable; ICOMAdminCatalog2* m_pCatalog; CRITICAL_SECTION m_csPTable;
};
inline void CProcessTable::Lock() { EnterCriticalSection(&m_csPTable); }
inline void CProcessTable::UnLock() { LeaveCriticalSection(&m_csPTable); } #endif __W3SVC_WAMINFO_HXX__
|