diff --git a/.gitattributes b/.gitattributes index 62fe7c511d..204c7323a3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -44,6 +44,7 @@ *.hs text=auto *.rc text=auto +*.vcxproj text=auto *.csproj text=auto *.vbproj text=auto *.fsproj text=auto diff --git a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h index f1080bfa12..c53041a664 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h +++ b/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h @@ -12,6 +12,7 @@ #include "hashfn.h" #include "aspnetcore_shim_config.h" #include "iapplication.h" +#include "SRWSharedLock.h" #define API_BUFFER_TOO_SMALL 0x80008098 @@ -119,13 +120,12 @@ public: VOID ExtractApplication(IAPPLICATION** ppApplication) { - AcquireSRWLockShared(&m_srwLock); + SRWSharedLock lock(m_srwLock); if (m_pApplication != NULL) { m_pApplication->ReferenceApplication(); } *ppApplication = m_pApplication; - ReleaseSRWLockShared(&m_srwLock); } VOID diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp b/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp index 032b61f43e..6b2649a007 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp +++ b/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp @@ -192,7 +192,6 @@ APPLICATION_INFO::EnsureApplicationCreated( ) { HRESULT hr = S_OK; - BOOL fLocked = FALSE; IAPPLICATION *pApplication = NULL; STRU struExeLocation; STACK_STRU(struFileName, 300); // >MAX_PATH @@ -205,8 +204,7 @@ APPLICATION_INFO::EnsureApplicationCreated( if (m_pApplication == NULL) { - AcquireSRWLockExclusive(&m_srwLock); - fLocked = TRUE; + SRWExclusiveLock lock(m_srwLock); if (m_pApplication != NULL) { goto Finished; @@ -243,10 +241,6 @@ APPLICATION_INFO::EnsureApplicationCreated( Finished: - if (fLocked) - { - ReleaseSRWLockExclusive(&m_srwLock); - } return hr; } @@ -254,7 +248,6 @@ HRESULT APPLICATION_INFO::FindRequestHandlerAssembly(STRU& location) { HRESULT hr = S_OK; - BOOL fLocked = FALSE; PCWSTR pstrHandlerDllName; STACK_STRU(struFileName, 256); @@ -265,8 +258,8 @@ APPLICATION_INFO::FindRequestHandlerAssembly(STRU& location) } else if (!g_fAspnetcoreRHAssemblyLoaded) { - AcquireSRWLockExclusive(&g_srwLock); - fLocked = TRUE; + SRWExclusiveLock lock(g_srwLock); + if (g_fAspnetcoreRHLoadedError) { hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; @@ -366,11 +359,6 @@ Finished: { g_fAspnetcoreRHLoadedError = TRUE; } - - if (fLocked) - { - ReleaseSRWLockExclusive(&g_srwLock); - } return hr; } @@ -561,14 +549,13 @@ Finished: VOID APPLICATION_INFO::RecycleApplication() { - IAPPLICATION* pApplication = NULL; + IAPPLICATION* pApplication; HANDLE hThread = INVALID_HANDLE_VALUE; - BOOL fLockAcquired = FALSE; if (m_pApplication != NULL) { - AcquireSRWLockExclusive(&m_srwLock); - fLockAcquired = TRUE; + SRWExclusiveLock lock(m_srwLock); + if (m_pApplication != NULL) { pApplication = m_pApplication; @@ -623,11 +610,6 @@ APPLICATION_INFO::RecycleApplication() // Closing a thread handle does not terminate the associated thread or remove the thread object. CloseHandle(hThread); } - - if (fLockAcquired) - { - ReleaseSRWLockExclusive(&m_srwLock); - } } } @@ -655,13 +637,12 @@ VOID APPLICATION_INFO::ShutDownApplication() { IAPPLICATION* pApplication = NULL; - BOOL fLockAcquired = FALSE; // pApplication can be NULL due to app_offline if (m_pApplication != NULL) { - AcquireSRWLockExclusive(&m_srwLock); - fLockAcquired = TRUE; + SRWExclusiveLock lock(m_srwLock); + if (m_pApplication != NULL) { pApplication = m_pApplication; @@ -671,10 +652,5 @@ APPLICATION_INFO::ShutDownApplication() pApplication->ShutDown(); pApplication->DereferenceApplication(); } - - if (fLockAcquired) - { - ReleaseSRWLockExclusive(&m_srwLock); - } } } diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx b/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx index cbe291a28f..ed3f1a67b0 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx +++ b/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx @@ -22,7 +22,6 @@ APPLICATION_MANAGER::GetOrCreateApplicationInfo( { HRESULT hr = S_OK; APPLICATION_INFO *pApplicationInfo = NULL; - BOOL fExclusiveLock = FALSE; BOOL fMixedHostingModelError = FALSE; BOOL fDuplicatedInProcessApp = FALSE; PCWSTR pszApplicationId = NULL; @@ -39,18 +38,18 @@ APPLICATION_MANAGER::GetOrCreateApplicationInfo( // The configuration path is unique for each application and is used for the // key in the applicationInfoHash. pszApplicationId = pHttpContext->GetApplication()->GetApplicationId(); - + // When accessing the m_pApplicationInfoHash, we need to acquire the application manager // lock to avoid races on setting state. - AcquireSRWLockShared(&m_srwLock); - if (g_fInShutdown) { - ReleaseSRWLockShared(&m_srwLock); - hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); - goto Finished; + SRWSharedLock lock(m_srwLock); + if (g_fInShutdown) + { + hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); + goto Finished; + } + m_pApplicationInfoHash->FindKey(pszApplicationId, ppApplicationInfo); } - m_pApplicationInfoHash->FindKey(pszApplicationId, ppApplicationInfo); - ReleaseSRWLockShared(&m_srwLock); if (*ppApplicationInfo == NULL) { @@ -68,8 +67,8 @@ APPLICATION_MANAGER::GetOrCreateApplicationInfo( goto Finished; } - AcquireSRWLockExclusive(&m_srwLock); - fExclusiveLock = TRUE; + SRWExclusiveLock lock(m_srwLock); + if (g_fInShutdown) { // Already in shuting down. No need to create the application @@ -122,11 +121,6 @@ APPLICATION_MANAGER::GetOrCreateApplicationInfo( Finished: - if (fExclusiveLock) - { - ReleaseSRWLockExclusive(&m_srwLock); - } - // log the error if (fDuplicatedInProcessApp) { @@ -135,7 +129,7 @@ Finished: ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP, ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP_MSG, pszApplicationId); - + } else if (fMixedHostingModelError) { @@ -224,60 +218,59 @@ APPLICATION_MANAGER::RecycleApplicationFromManager( return hr; } - AcquireSRWLockExclusive(&m_srwLock); - if (g_fInShutdown) { - ReleaseSRWLockExclusive(&m_srwLock); - return hr; - } - - // Make a shallow copy of existing hashtable as we may need to remove nodes - // This will be used for finding differences in which applications are affected by a config change. - table = new APPLICATION_INFO_HASH(); - - // few application expected, small bucket size for hash table - if (FAILED(hr = table->Initialize(17 /*prime*/))) - { - goto Finished; - } - - context.pstrPath = pszApplicationId; - - // Keep track of the preview count of applications to know whether there are applications to delete - dwPreviousCounter = m_pApplicationInfoHash->Count(); - - // We don't want to hold the application manager lock for long time as it will block all incoming requests - // Don't call application shutdown inside the lock - m_pApplicationInfoHash->Apply(APPLICATION_INFO_HASH::ReferenceCopyToTable, static_cast(table)); - DBG_ASSERT(dwPreviousCounter == table->Count()); - - // Removed the applications which are impacted by the configurtion change - m_pApplicationInfoHash->DeleteIf(FindConfigChangedApplication, (PVOID)&context); - - if (dwPreviousCounter != m_pApplicationInfoHash->Count()) - { - if (m_hostingModel == HOSTING_IN_PROCESS) + SRWExclusiveLock lock(m_srwLock); + if (g_fInShutdown) { - // When we are inprocess, we need to keep the application the - // application manager that is being deleted. This is because we will always need to recycle the worker - // process and any requests that hit this worker process must be rejected (while out of process can - // start a new dotnet process). We will immediately call Recycle after this call. - DBG_ASSERT(m_pApplicationInfoHash->Count() == 0); - delete m_pApplicationInfoHash; + return hr; + } - // We don't want to delete the table as m_pApplicationInfoHash = table - fKeepTable = TRUE; - m_pApplicationInfoHash = table; + // Make a shallow copy of existing hashtable as we may need to remove nodes + // This will be used for finding differences in which applications are affected by a config change. + table = new APPLICATION_INFO_HASH(); + + // few application expected, small bucket size for hash table + if (FAILED(hr = table->Initialize(17 /*prime*/))) + { + goto Finished; + } + + context.pstrPath = pszApplicationId; + + // Keep track of the preview count of applications to know whether there are applications to delete + dwPreviousCounter = m_pApplicationInfoHash->Count(); + + // We don't want to hold the application manager lock for long time as it will block all incoming requests + // Don't call application shutdown inside the lock + m_pApplicationInfoHash->Apply(APPLICATION_INFO_HASH::ReferenceCopyToTable, static_cast(table)); + DBG_ASSERT(dwPreviousCounter == table->Count()); + + // Removed the applications which are impacted by the configurtion change + m_pApplicationInfoHash->DeleteIf(FindConfigChangedApplication, (PVOID)&context); + + if (dwPreviousCounter != m_pApplicationInfoHash->Count()) + { + if (m_hostingModel == HOSTING_IN_PROCESS) + { + // When we are inprocess, we need to keep the application the + // application manager that is being deleted. This is because we will always need to recycle the worker + // process and any requests that hit this worker process must be rejected (while out of process can + // start a new dotnet process). We will immediately call Recycle after this call. + DBG_ASSERT(m_pApplicationInfoHash->Count() == 0); + delete m_pApplicationInfoHash; + + // We don't want to delete the table as m_pApplicationInfoHash = table + fKeepTable = TRUE; + m_pApplicationInfoHash = table; + } + } + + if (m_pApplicationInfoHash->Count() == 0) + { + m_hostingModel = HOSTING_UNKNOWN; } } - if (m_pApplicationInfoHash->Count() == 0) - { - m_hostingModel = HOSTING_UNKNOWN; - } - - ReleaseSRWLockExclusive(&m_srwLock); - // If we receive a request at this point. // OutOfProcess: we will create a new application with new configuration // InProcess: the request would have to be rejected, as we are about to call g_HttpServer->RecycleProcess @@ -364,16 +357,15 @@ APPLICATION_MANAGER::ShutDown() } DBG_ASSERT(m_pApplicationInfoHash); + // During shutdown we lock until we delete the application - AcquireSRWLockExclusive(&m_srwLock); + SRWExclusiveLock lock(m_srwLock); // Call shutdown on each application in the application manager m_pApplicationInfoHash->Apply(ShutdownApplication, NULL); m_pApplicationInfoHash->Clear(); delete m_pApplicationInfoHash; m_pApplicationInfoHash = NULL; - - ReleaseSRWLockExclusive(&m_srwLock); } } diff --git a/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx b/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx index 47d49ffcff..59a1ac9c1f 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx +++ b/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx @@ -46,10 +46,6 @@ Return value: --*/ { - /* FORWARDING_HANDLER::StaticTerminate(); - - WEBSOCKET_HANDLER::StaticTerminate();*/ - ALLOC_CACHE_HANDLER::StaticTerminate(); delete this; } diff --git a/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj b/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj index cf8f7a929d..dde46fc814 100644 --- a/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj +++ b/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj @@ -200,7 +200,8 @@ - + + @@ -211,7 +212,8 @@ - + + diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.cpp b/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp similarity index 71% rename from src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.cpp rename to src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp index 52ecf57d07..ae492f005e 100644 --- a/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.cpp +++ b/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp @@ -2,15 +2,15 @@ // Licensed under the MIT License. See License.txt in the project root for license information. #include "stdafx.h" -#include "SRWLockWrapper.h" +#include "SRWExclusiveLock.h" -SRWLockWrapper::SRWLockWrapper(const SRWLOCK& lock) +SRWExclusiveLock:: SRWExclusiveLock(const SRWLOCK& lock) : m_lock(lock) { AcquireSRWLockExclusive(const_cast(&m_lock)); } -SRWLockWrapper::~SRWLockWrapper() +SRWExclusiveLock::~SRWExclusiveLock() { ReleaseSRWLockExclusive(const_cast(&m_lock)); } diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h b/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h new file mode 100644 index 0000000000..15fcc1f673 --- /dev/null +++ b/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h @@ -0,0 +1,13 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +#pragma once + +class SRWExclusiveLock +{ +public: + SRWExclusiveLock(const SRWLOCK& lock); + ~SRWExclusiveLock(); +private: + const SRWLOCK& m_lock; +}; diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp b/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp new file mode 100644 index 0000000000..613e56984e --- /dev/null +++ b/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the MIT License. See License.txt in the project root for license information. + +#include "stdafx.h" +#include "SRWSharedLock.h" + +SRWSharedLock:: SRWSharedLock(const SRWLOCK& lock) + : m_lock(lock) +{ + AcquireSRWLockShared(const_cast(&m_lock)); +} + +SRWSharedLock::~SRWSharedLock() +{ + ReleaseSRWLockShared(const_cast(&m_lock)); +} diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.h b/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h similarity index 73% rename from src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.h rename to src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h index e8c112a2d5..b05b0090fb 100644 --- a/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.h +++ b/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h @@ -3,11 +3,11 @@ #pragma once -class SRWLockWrapper +class SRWSharedLock { public: - SRWLockWrapper(const SRWLOCK& lock); - ~SRWLockWrapper(); + SRWSharedLock(const SRWLOCK& lock); + ~SRWSharedLock(); private: const SRWLOCK& m_lock; }; diff --git a/src/AspNetCoreModuleV2/CommonLib/stdafx.h b/src/AspNetCoreModuleV2/CommonLib/stdafx.h index 43c8a1b2bf..8b6893759c 100644 --- a/src/AspNetCoreModuleV2/CommonLib/stdafx.h +++ b/src/AspNetCoreModuleV2/CommonLib/stdafx.h @@ -31,7 +31,7 @@ #include "requesthandler.h" #include "iapplication.h" #include "application.h" -#include "SRWLockWrapper.h" +#include "SRWExclusiveLock.h" #include "fx_ver.h" #include "utility.h" #include "GlobalVersionUtility.h" diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp b/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp index 3f4e40a27e..a48bde809a 100644 --- a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp +++ b/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp @@ -153,7 +153,7 @@ IN_PROCESS_APPLICATION::ShutDownInternal() } { - SRWLockWrapper lock(m_srwLock); + SRWExclusiveLock lock(m_srwLock); if (m_fShutdownCalledFromNative || m_status == APPLICATION_STATUS::STARTING || @@ -223,7 +223,7 @@ IN_PROCESS_APPLICATION::Recycle( } { - SRWLockWrapper lock(m_srwLock); + SRWExclusiveLock lock(m_srwLock); if (m_fRecycleCalled) { @@ -388,7 +388,7 @@ IN_PROCESS_APPLICATION::LoadManagedApplication { // Set up stdout redirect - SRWLockWrapper lock(m_srwLock); + SRWExclusiveLock lock(m_srwLock); if (m_pLoggerProvider == NULL) {