Use lock wrapper in shim (#936)

This commit is contained in:
Pavel Krymets 2018-06-19 21:40:29 -07:00 committed by GitHub
parent bac1b1e8b6
commit 0a97bf9ae8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 114 additions and 118 deletions

1
.gitattributes vendored
View File

@ -44,6 +44,7 @@
*.hs text=auto
*.rc text=auto
*.vcxproj text=auto
*.csproj text=auto
*.vbproj text=auto
*.fsproj text=auto

View File

@ -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

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -46,10 +46,6 @@ Return value:
--*/
{
/* FORWARDING_HANDLER::StaticTerminate();
WEBSOCKET_HANDLER::StaticTerminate();*/
ALLOC_CACHE_HANDLER::StaticTerminate();
delete this;
}

View File

@ -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>

View File

@ -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));
}

View File

@ -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;
};

View File

@ -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));
}

View File

@ -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;
};

View File

@ -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"

View File

@ -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)
{