Use lock wrapper in shim (#936)
This commit is contained in:
parent
bac1b1e8b6
commit
0a97bf9ae8
|
|
@ -44,6 +44,7 @@
|
|||
*.hs text=auto
|
||||
*.rc text=auto
|
||||
|
||||
*.vcxproj text=auto
|
||||
*.csproj text=auto
|
||||
*.vbproj text=auto
|
||||
*.fsproj text=auto
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<PVOID>(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<PVOID>(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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -46,10 +46,6 @@ Return value:
|
|||
|
||||
--*/
|
||||
{
|
||||
/* FORWARDING_HANDLER::StaticTerminate();
|
||||
|
||||
WEBSOCKET_HANDLER::StaticTerminate();*/
|
||||
|
||||
ALLOC_CACHE_HANDLER::StaticTerminate();
|
||||
delete this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -200,7 +200,8 @@
|
|||
<ClInclude Include="irequesthandler.h" />
|
||||
<ClInclude Include="requesthandler.h" />
|
||||
<ClInclude Include="resources.h" />
|
||||
<ClInclude Include="SRWLockWrapper.h" />
|
||||
<ClInclude Include="SRWExclusiveLock.h" />
|
||||
<ClInclude Include="SRWSharedLock.h" />
|
||||
<ClInclude Include="stdafx.h" />
|
||||
<ClInclude Include="sttimer.h" />
|
||||
<ClInclude Include="utility.h" />
|
||||
|
|
@ -211,7 +212,8 @@
|
|||
<ClCompile Include="GlobalVersionUtility.cpp" />
|
||||
<ClCompile Include="hostfxr_utility.cpp" />
|
||||
<ClCompile Include="hostfxroptions.cpp" />
|
||||
<ClCompile Include="SRWLockWrapper.cpp" />
|
||||
<ClCompile Include="SRWExclusiveLock.cpp" />
|
||||
<ClCompile Include="SRWSharedLock.cpp" />
|
||||
<ClCompile Include="utility.cxx" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -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<SRWLOCK*>(&m_lock));
|
||||
}
|
||||
|
||||
SRWLockWrapper::~SRWLockWrapper()
|
||||
SRWExclusiveLock::~SRWExclusiveLock()
|
||||
{
|
||||
ReleaseSRWLockExclusive(const_cast<SRWLOCK*>(&m_lock));
|
||||
}
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -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<SRWLOCK*>(&m_lock));
|
||||
}
|
||||
|
||||
SRWSharedLock::~SRWSharedLock()
|
||||
{
|
||||
ReleaseSRWLockShared(const_cast<SRWLOCK*>(&m_lock));
|
||||
}
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue