windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/infocomm/cache/tsinit.cxx

386 lines
8.4 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1995 Microsoft Corporation
Module Name :
tsinit.cxx
Abstract:
This module contains the tsunami initialization code.
Author:
Murali R. Krishnan ( MuraliK ) 16-Jan-1995
--*/
#include "TsunamiP.Hxx"
#include <dbgutil.h>
#include <inetsvcs.h>
#pragma hdrstop
#include <iistypes.hxx>
#include <iisver.h>
#include <iiscnfg.h>
#include <imd.h>
#include <mb.hxx>
HANDLE g_hQuit = NULL;
HANDLE g_hNewItem = NULL;
BOOL g_fW3OnlyNoAuth = FALSE;
extern LONG g_nTsunamiThreads;
//
// Disables Tsunami Caching
//
BOOL DisableTsunamiCaching = FALSE;
//
// DisableSPUD
//
BOOL DisableSPUD = FALSE;
//
// Allows us to mask the invalid flags
//
DWORD TsValidCreateFileOptions = TS_IIS_VALID_FLAGS;
//
// flags to set on CreateFile
//
DWORD TsCreateFileShareMode = (FILE_SHARE_READ |
FILE_SHARE_WRITE |
FILE_SHARE_DELETE);
BOOL TsNoDirOpenSupport = FALSE;
DWORD TsCreateFileFlags = (FILE_FLAG_SEQUENTIAL_SCAN |
FILE_FLAG_OVERLAPPED |
FILE_FLAG_BACKUP_SEMANTICS );
BOOL
Tsunami_Initialize(
VOID
)
/*++
Description:
Initializes the tsunami package
Note: This routine assumes the caller is handling multiple initializers
and will only call this routine once in a thread safe manner
--*/
{
HKEY hKey;
DWORD dwType;
DWORD nBytes;
DWORD dwValue;
DWORD dwMaxFile;
DWORD err;
#if TSUNAMI_REF_DEBUG
RefTraceLog = CreateRefTraceLog(
256, // LogSize
0 // ExtraBytesInHeader
);
#endif // TSUNAMI_REF_DEBUG
//
// Initialize global events
//
g_hQuit = IIS_CREATE_EVENT(
"g_hQuit",
&g_hQuit,
TRUE,
FALSE
);
g_hNewItem = IIS_CREATE_EVENT(
"g_hNewItem",
&g_hNewItem,
FALSE,
FALSE
);
if ( (g_hQuit == NULL) || (g_hNewItem == NULL) ) {
goto Failure;
}
//
// Set defaults
//
MEMORYSTATUS ms;
ms.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus( &ms );
//
// default is 1K files per 32MB of physical memory after the 1st 8MB,
// minimum INETA_MIN_DEF_FILE_HANDLE
//
if ( ms.dwTotalPhys > 8 * 1024 * 1024 )
{
dwMaxFile = (ms.dwTotalPhys - 8 * 1024 * 1024) / ( 32 * 1024 );
if ( dwMaxFile < INETA_MIN_DEF_FILE_HANDLE )
{
dwMaxFile = INETA_MIN_DEF_FILE_HANDLE;
}
}
else
{
dwMaxFile = INETA_MIN_DEF_FILE_HANDLE;
}
//
// If this is not a NTS, disable tsunami caching by default
//
DisableSPUD = !AtqSpudInitialized();
if ( !TsIsNtServer() ) {
DisableTsunamiCaching = TRUE;
DisableSPUD = TRUE;
}
DisableSPUD = TRUE;
if ( DisableSPUD ) {
DbgPrint("DisableCacheOplocks set to TRUE by default.\n");
} else {
DbgPrint("DisableCacheOplocks set to FALSE by default.\n");
}
//
// no overlapped i/o in win95.
//
if ( TsIsWindows95() ) {
TsCreateFileFlags = FILE_FLAG_SEQUENTIAL_SCAN;
TsCreateFileShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
TsNoDirOpenSupport = TRUE;
// |FILE_FLAG_BACKUP_SEMANTICS;
}
//
// Read the registry key to see whether tsunami caching is enabled
//
err = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
INETA_PARAMETERS_KEY,
0,
KEY_READ,
&hKey
);
if ( err == ERROR_SUCCESS ) {
//
// This cannot be overridded in win95
//
if ( !TsIsWindows95() ) {
nBytes = sizeof(dwValue);
err = RegQueryValueEx(
hKey,
INETA_DISABLE_TSUNAMI_CACHING,
NULL,
&dwType,
(LPBYTE)&dwValue,
&nBytes
);
if ( (err == ERROR_SUCCESS) && (dwType == REG_DWORD) ) {
DisableTsunamiCaching = (BOOL)dwValue;
}
nBytes = sizeof(dwValue);
err = RegQueryValueEx(
hKey,
INETA_DISABLE_TSUNAMI_SPUD,
NULL,
&dwType,
(LPBYTE)&dwValue,
&nBytes
);
if ( (err == ERROR_SUCCESS) && (dwType == REG_DWORD) ) {
DisableSPUD = (BOOL)dwValue;
if ( DisableSPUD ) {
DbgPrint("DisableCacheOplocks set to TRUE in Registry.\n");
} else {
DbgPrint("DisableCacheOplocks set to FALSE in Registry.\n");
}
DbgPrint("The Registry Setting will override the default.\n");
}
}
if ( g_fW3OnlyNoAuth )
{
//
// TODO: investigate is security descriptor caching
// can be used in the non-SYSTEM account case.
//
g_fCacheSecDesc = FALSE;
}
else
{
//
// read the enable cache sec desc flag
//
nBytes = sizeof(dwValue);
err = RegQueryValueEx(
hKey,
INETA_CACHE_USE_ACCESS_CHECK,
NULL,
&dwType,
(LPBYTE)&dwValue,
&nBytes
);
if ( (err == ERROR_SUCCESS) && (dwType == REG_DWORD) ) {
g_fCacheSecDesc = !!dwValue;
}
else {
g_fCacheSecDesc = INETA_DEF_CACHE_USE_ACCESS_CHECK;
}
}
//
// Read the maximum # of files in cache
//
nBytes = sizeof(dwValue);
if ( RegQueryValueEx(
hKey,
INETA_MAX_OPEN_FILE,
NULL,
&dwType,
(LPBYTE) &dwValue,
&nBytes
) == ERROR_SUCCESS && dwType == REG_DWORD )
{
dwMaxFile = dwValue;
}
RegCloseKey( hKey );
}
//
// if tsunami caching is disabled, set the flags accordingly
//
if ( DisableTsunamiCaching ) {
g_fDisableCaching = TRUE;
TsValidCreateFileOptions = TS_PWS_VALID_FLAGS;
g_fCacheSecDesc = FALSE;
}
//
// Initialize the directory change manager
//
if ( !DcmInitialize( ) ) {
goto Failure;
}
//
// Initialize the tsunami cache manager
//
if ( !Cache_Initialize( dwMaxFile )) {
goto Failure;
}
if ( !MetaCache_Initialize() ) {
goto Failure;
}
return( TRUE );
Failure:
IIS_PRINTF( ( buff, "Tsunami_Initialize() Failed. Error = %d\n",
GetLastError()));
if ( g_hQuit )
{
CloseHandle( g_hQuit );
g_hQuit = NULL;
}
if ( g_hNewItem )
{
CloseHandle( g_hNewItem );
g_hNewItem = NULL;
}
return FALSE;
} // Tsunami_Initialize
VOID
Tsunami_Terminate(
VOID
)
/*++
Description:
Cleans up the Tsunami package
--*/
{
DWORD dwResult;
if ( !SetEvent( g_hQuit ) ) {
IIS_PRINTF((buff,
"No Quit event posted for Tsunami. No Cleanup\n"));
return;
}
//
// Flush all items from the cache
//
TsCacheFlush( 0 );
//
// Synchronize with our thread so we don't leave here before the
// thread has finished cleaning up
//
if ( g_hChangeWaitThread != NULL ) {
DBG_REQUIRE( WaitForSingleObject( g_hChangeWaitThread, 20000 ) == WAIT_OBJECT_0 );
CloseHandle( g_hChangeWaitThread);
}
CloseHandle( g_hQuit );
CloseHandle( g_hNewItem );
DeleteCriticalSection( &csVirtualRoots );
MetaCache_Terminate();
#if TSUNAMI_REF_DEBUG
if( RefTraceLog != NULL ) {
DestroyRefTraceLog( RefTraceLog );
RefTraceLog = NULL;
}
#endif // TSUNAMI_REF_DEBUG
} // Tsunami_Terminate