Introduce a api-ms-win-core-synch-l1-2-0 shim for Windows 7 (#10559)
The code in this file was adapted from the STL on the 2021-07-05. It backports the following Windows 8 functions to Windows 7: * WaitOnAddress * WakeByAddressSingle * WakeByAddressAll These functions are used within `til`. This commit will allow `til` to be used in the conhost source code. Validation * [x] correct .dll loads on Windows 7 * [x] correct .dll loads on Windows 10 * [x] link line for PublicTerminalCore prefers this fake apiset over kernel32
This commit is contained in:
parent
83c6bce73d
commit
305e3df8fa
|
@ -397,6 +397,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests_Control", "src\ca
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsTerminal.UIA.Tests", "src\cascadia\WindowsTerminal_UIATests\WindowsTerminal.UIA.Tests.csproj", "{F19DACD5-0C6E-40DC-B6E4-767A3200542C}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsTerminal.UIA.Tests", "src\cascadia\WindowsTerminal_UIATests\WindowsTerminal.UIA.Tests.csproj", "{F19DACD5-0C6E-40DC-B6E4-767A3200542C}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "api-ms-win-core-synch-l1-2-0", "src\api-ms-win-core-synch-l1-2-0\api-ms-win-core-synch-l1-2-0.vcxproj", "{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
AuditMode|Any CPU = AuditMode|Any CPU
|
AuditMode|Any CPU = AuditMode|Any CPU
|
||||||
|
@ -3292,6 +3294,50 @@ Global
|
||||||
{F19DACD5-0C6E-40DC-B6E4-767A3200542C}.Release|x64.Build.0 = Release|x64
|
{F19DACD5-0C6E-40DC-B6E4-767A3200542C}.Release|x64.Build.0 = Release|x64
|
||||||
{F19DACD5-0C6E-40DC-B6E4-767A3200542C}.Release|x86.ActiveCfg = Release|Win32
|
{F19DACD5-0C6E-40DC-B6E4-767A3200542C}.Release|x86.ActiveCfg = Release|Win32
|
||||||
{F19DACD5-0C6E-40DC-B6E4-767A3200542C}.Release|x86.Build.0 = Release|Win32
|
{F19DACD5-0C6E-40DC-B6E4-767A3200542C}.Release|x86.Build.0 = Release|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|Any CPU.ActiveCfg = AuditMode|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|ARM.ActiveCfg = AuditMode|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|ARM64.ActiveCfg = AuditMode|ARM64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|ARM64.Build.0 = AuditMode|ARM64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|DotNet_x64Test.ActiveCfg = AuditMode|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|DotNet_x86Test.ActiveCfg = AuditMode|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|x64.ActiveCfg = AuditMode|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|x64.Build.0 = AuditMode|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|x86.ActiveCfg = AuditMode|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.AuditMode|x86.Build.0 = AuditMode|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|Any CPU.ActiveCfg = Debug|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|ARM.ActiveCfg = Debug|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|ARM64.ActiveCfg = Debug|ARM64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|ARM64.Build.0 = Debug|ARM64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|DotNet_x64Test.ActiveCfg = Debug|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|DotNet_x64Test.Build.0 = Debug|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|DotNet_x86Test.ActiveCfg = Debug|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|DotNet_x86Test.Build.0 = Debug|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|Any CPU.ActiveCfg = Fuzzing|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|ARM.ActiveCfg = Fuzzing|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|ARM64.ActiveCfg = Fuzzing|ARM64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|ARM64.Build.0 = Fuzzing|ARM64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|DotNet_x64Test.ActiveCfg = Fuzzing|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|DotNet_x86Test.ActiveCfg = Fuzzing|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|x64.ActiveCfg = Fuzzing|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|x64.Build.0 = Fuzzing|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|x86.ActiveCfg = Fuzzing|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Fuzzing|x86.Build.0 = Fuzzing|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|Any CPU.ActiveCfg = Release|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|ARM.ActiveCfg = Release|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|ARM64.ActiveCfg = Release|ARM64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|ARM64.Build.0 = Release|ARM64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|DotNet_x64Test.ActiveCfg = Release|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|DotNet_x64Test.Build.0 = Release|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|DotNet_x86Test.ActiveCfg = Release|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|DotNet_x86Test.Build.0 = Release|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|x64.Build.0 = Release|x64
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}.Release|x86.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -3390,6 +3436,7 @@ Global
|
||||||
{05D9052F-D78F-478F-968A-2DE38A6DB996} = {E8F24881-5E37-4362-B191-A3BA0ED7F4EB}
|
{05D9052F-D78F-478F-968A-2DE38A6DB996} = {E8F24881-5E37-4362-B191-A3BA0ED7F4EB}
|
||||||
{C323DAEE-B307-4C7B-ACE5-7293CBEFCB5B} = {BDB237B6-1D1D-400F-84CC-40A58FA59C8E}
|
{C323DAEE-B307-4C7B-ACE5-7293CBEFCB5B} = {BDB237B6-1D1D-400F-84CC-40A58FA59C8E}
|
||||||
{F19DACD5-0C6E-40DC-B6E4-767A3200542C} = {BDB237B6-1D1D-400F-84CC-40A58FA59C8E}
|
{F19DACD5-0C6E-40DC-B6E4-767A3200542C} = {BDB237B6-1D1D-400F-84CC-40A58FA59C8E}
|
||||||
|
{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5} = {89CDCC5C-9F53-4054-97A4-639D99F169CD}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {3140B1B7-C8EE-43D1-A772-D82A7061A271}
|
SolutionGuid = {3140B1B7-C8EE-43D1-A772-D82A7061A271}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{9cf74355-f018-4c19-81ad-9dc6b7f2c6f5}</ProjectGuid>
|
||||||
|
<RootNamespace>apimswincoresynchl120</RootNamespace>
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(SolutionDir)src\common.build.pre.props" />
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="main.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="definitions.def" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(SolutionDir)src\common.build.post.props" />
|
||||||
|
<ItemDefinitionGroup>
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>kernel32.lib</AdditionalDependencies>
|
||||||
|
<ModuleDefinitionFile>definitions.def</ModuleDefinitionFile>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,30 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="main.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Natvis Include="$(SolutionDir)tools\ConsoleTypes.natvis" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="definitions.def">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
19
src/api-ms-win-core-synch-l1-2-0/definitions.def
Normal file
19
src/api-ms-win-core-synch-l1-2-0/definitions.def
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
LIBRARY
|
||||||
|
EXPORTS
|
||||||
|
DeleteSynchronizationBarrier = kernel32.DeleteSynchronizationBarrier
|
||||||
|
EnterSynchronizationBarrier = kernel32.EnterSynchronizationBarrier
|
||||||
|
InitOnceBeginInitialize = kernel32.InitOnceBeginInitialize
|
||||||
|
InitOnceComplete = kernel32.InitOnceComplete
|
||||||
|
InitOnceExecuteOnce = kernel32.InitOnceExecuteOnce
|
||||||
|
InitOnceInitialize = kernel32.InitOnceInitialize
|
||||||
|
InitializeConditionVariable = kernel32.InitializeConditionVariable
|
||||||
|
InitializeSynchronizationBarrier = kernel32.InitializeSynchronizationBarrier
|
||||||
|
SignalObjectAndWait = kernel32.SignalObjectAndWait
|
||||||
|
Sleep = kernel32.Sleep
|
||||||
|
SleepConditionVariableCS = kernel32.SleepConditionVariableCS
|
||||||
|
SleepConditionVariableSRW = kernel32.SleepConditionVariableSRW
|
||||||
|
WaitOnAddress
|
||||||
|
WakeAllConditionVariable = kernel32.WakeAllConditionVariable
|
||||||
|
WakeByAddressAll
|
||||||
|
WakeByAddressSingle
|
||||||
|
WakeConditionVariable = kernel32.WakeConditionVariable
|
189
src/api-ms-win-core-synch-l1-2-0/main.cpp
Normal file
189
src/api-ms-win-core-synch-l1-2-0/main.cpp
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
// Copyright (c) Microsoft Corporation.
|
||||||
|
// Licensed under the MIT license.
|
||||||
|
|
||||||
|
//
|
||||||
|
// The code in this file was adapted from the STL on the 2021-07-05. Commit:
|
||||||
|
// https://github.com/microsoft/STL/blob/e745bad3b1d05b5b19ec652d68abb37865ffa454/stl/src/atomic_wait.cpp
|
||||||
|
//
|
||||||
|
// It backports the following Windows 8 functions to Windows 7:
|
||||||
|
// * WaitOnAddress
|
||||||
|
// * WakeByAddressSingle
|
||||||
|
// * WakeByAddressAll
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <new>
|
||||||
|
|
||||||
|
#include <winsdkver.h>
|
||||||
|
#define _WIN32_WINNT 0x0601
|
||||||
|
#include <sdkddkver.h>
|
||||||
|
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#define NOMINMAX
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <intrin.h>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
class [[nodiscard]] SRWLockGuard
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit SRWLockGuard(SRWLOCK & lock) noexcept :
|
||||||
|
_lock(&lock)
|
||||||
|
{
|
||||||
|
AcquireSRWLockExclusive(_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
~SRWLockGuard()
|
||||||
|
{
|
||||||
|
ReleaseSRWLockExclusive(_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
SRWLockGuard(const SRWLockGuard&) = delete;
|
||||||
|
SRWLockGuard& operator=(const SRWLockGuard&) = delete;
|
||||||
|
|
||||||
|
SRWLockGuard(SRWLockGuard &&) = delete;
|
||||||
|
SRWLockGuard& operator=(SRWLockGuard&&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
SRWLOCK* _lock;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct WaitContext
|
||||||
|
{
|
||||||
|
const volatile void* address;
|
||||||
|
WaitContext* next;
|
||||||
|
WaitContext* prev;
|
||||||
|
CONDITION_VARIABLE cv;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct [[nodiscard]] GuardedWaitContext : WaitContext
|
||||||
|
{
|
||||||
|
GuardedWaitContext(const volatile void* storage, WaitContext* head) noexcept :
|
||||||
|
WaitContext{ storage, head, head->prev, CONDITION_VARIABLE_INIT }
|
||||||
|
{
|
||||||
|
prev->next = this;
|
||||||
|
next->prev = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
~GuardedWaitContext()
|
||||||
|
{
|
||||||
|
const auto n = next;
|
||||||
|
const auto p = prev;
|
||||||
|
next->prev = p;
|
||||||
|
prev->next = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
GuardedWaitContext(const GuardedWaitContext&) = delete;
|
||||||
|
GuardedWaitContext& operator=(const GuardedWaitContext&) = delete;
|
||||||
|
|
||||||
|
GuardedWaitContext(GuardedWaitContext &&) = delete;
|
||||||
|
GuardedWaitContext& operator=(GuardedWaitContext&&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
#pragma warning(push)
|
||||||
|
#pragma warning(disable : 4324) // structure was padded due to alignment specifier
|
||||||
|
struct alignas(std::hardware_destructive_interference_size) WaitTableEntry
|
||||||
|
{
|
||||||
|
SRWLOCK lock = SRWLOCK_INIT;
|
||||||
|
WaitContext head = { nullptr, &head, &head, CONDITION_VARIABLE_INIT };
|
||||||
|
};
|
||||||
|
#pragma warning(pop)
|
||||||
|
|
||||||
|
[[nodiscard]] WaitTableEntry& GetWaitTableEntry(const volatile void* const storage) noexcept
|
||||||
|
{
|
||||||
|
// A prime number for the hash table size was chosen to prevent collisions.
|
||||||
|
constexpr size_t size = 251;
|
||||||
|
constexpr std::hash<uintptr_t> hasher;
|
||||||
|
|
||||||
|
static WaitTableEntry table[size];
|
||||||
|
#pragma warning(suppress : 26446) // Prefer to use gsl::at() instead of unchecked subscript operator
|
||||||
|
#pragma warning(suppress : 26482) // Only index into arrays using constant expressions
|
||||||
|
#pragma warning(suppress : 26490) // Don't use reinterpret_cast
|
||||||
|
return table[hasher(reinterpret_cast<uintptr_t>(storage)) % size];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning(suppress : 26429) // Symbol 'comparand' is never tested for nullness, it can be marked as not_null
|
||||||
|
bool AreEqual(const volatile void* storage, const void* comparand, size_t size) noexcept
|
||||||
|
{
|
||||||
|
switch (size)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
return __iso_volatile_load8(static_cast<const volatile __int8*>(storage)) == *static_cast<const __int8*>(comparand);
|
||||||
|
case 2:
|
||||||
|
return __iso_volatile_load16(static_cast<const volatile __int16*>(storage)) == *static_cast<const __int16*>(comparand);
|
||||||
|
case 4:
|
||||||
|
return __iso_volatile_load32(static_cast<const volatile __int32*>(storage)) == *static_cast<const __int32*>(comparand);
|
||||||
|
case 8:
|
||||||
|
return __iso_volatile_load64(static_cast<const volatile __int64*>(storage)) == *static_cast<const __int64*>(comparand);
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // unnamed namespace
|
||||||
|
|
||||||
|
extern "C" BOOL WINAPI WaitOnAddress(_In_reads_bytes_(AddressSize) volatile VOID* Address, _In_reads_bytes_(AddressSize) PVOID CompareAddress, _In_ SIZE_T AddressSize, _In_opt_ DWORD dwMilliseconds)
|
||||||
|
{
|
||||||
|
auto& entry = GetWaitTableEntry(Address);
|
||||||
|
|
||||||
|
SRWLockGuard guard{ entry.lock };
|
||||||
|
GuardedWaitContext context{ Address, &entry.head };
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
// NOTE: under lock to prevent lost wakes
|
||||||
|
if (!AreEqual(Address, CompareAddress, AddressSize))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SleepConditionVariableSRW(&context.cv, &entry.lock, dwMilliseconds, 0))
|
||||||
|
{
|
||||||
|
#ifndef NDEBUG
|
||||||
|
if (GetLastError() != ERROR_TIMEOUT)
|
||||||
|
{
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dwMilliseconds != INFINITE)
|
||||||
|
{
|
||||||
|
// spurious wake to recheck the clock
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" VOID WINAPI WakeByAddressSingle(_In_ PVOID Address)
|
||||||
|
{
|
||||||
|
auto& entry = GetWaitTableEntry(Address);
|
||||||
|
SRWLockGuard guard(entry.lock);
|
||||||
|
|
||||||
|
for (auto context = entry.head.next; context != &entry.head; context = context->next)
|
||||||
|
{
|
||||||
|
if (context->address == Address)
|
||||||
|
{
|
||||||
|
// Can't move wake outside SRWLOCKed section: SRWLOCK also protects the context itself
|
||||||
|
WakeAllConditionVariable(&context->cv);
|
||||||
|
// This break; is the difference between WakeByAddressSingle and WakeByAddressAll
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" VOID WINAPI WakeByAddressAll(_In_ PVOID Address)
|
||||||
|
{
|
||||||
|
auto& entry = GetWaitTableEntry(Address);
|
||||||
|
SRWLockGuard guard(entry.lock);
|
||||||
|
|
||||||
|
for (auto context = entry.head.next; context != &entry.head; context = context->next)
|
||||||
|
{
|
||||||
|
if (context->address == Address)
|
||||||
|
{
|
||||||
|
// Can't move wake outside SRWLOCKed section: SRWLOCK also protects the context itself
|
||||||
|
WakeAllConditionVariable(&context->cv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,7 +8,6 @@
|
||||||
<ProjectName>PublicTerminalCore</ProjectName>
|
<ProjectName>PublicTerminalCore</ProjectName>
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
|
|
||||||
<Import Project="$(SolutionDir)src\common.build.pre.props" />
|
<Import Project="$(SolutionDir)src\common.build.pre.props" />
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="pch.cpp">
|
<ClCompile Include="pch.cpp">
|
||||||
|
@ -21,27 +20,24 @@
|
||||||
<ClInclude Include="pch.h" />
|
<ClInclude Include="pch.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\terminal\input\lib\terminalinput.vcxproj">
|
<ProjectReference Include="$(SolutionDir)src\terminal\input\lib\terminalinput.vcxproj">
|
||||||
<Project>{1cf55140-ef6a-4736-a403-957e4f7430bb}</Project>
|
<Project>{1cf55140-ef6a-4736-a403-957e4f7430bb}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\TerminalCore\lib\TerminalCore-lib.vcxproj">
|
<ProjectReference Include="$(SolutionDir)src\cascadia\TerminalCore\lib\TerminalCore-lib.vcxproj">
|
||||||
<Project>{ca5cad1a-abcd-429c-b551-8562ec954746}</Project>
|
<Project>{ca5cad1a-abcd-429c-b551-8562ec954746}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="$(OpenConsoleDir)src\types\lib\types.vcxproj">
|
<ProjectReference Include="$(SolutionDir)src\types\lib\types.vcxproj">
|
||||||
<Project>{18D09A24-8240-42D6-8CB6-236EEE820263}</Project>
|
<Project>{18D09A24-8240-42D6-8CB6-236EEE820263}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="$(OpenConsoleDir)src\buffer\out\lib\bufferout.vcxproj">
|
<ProjectReference Include="$(SolutionDir)src\renderer\base\lib\base.vcxproj">
|
||||||
<Project>{0cf235bd-2da0-407e-90ee-c467e8bbc714}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="$(OpenConsoleDir)src\renderer\base\lib\base.vcxproj">
|
|
||||||
<Project>{af0a096a-8b3a-4949-81ef-7df8f0fee91f}</Project>
|
<Project>{af0a096a-8b3a-4949-81ef-7df8f0fee91f}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="$(OpenConsoleDir)src\terminal\parser\lib\parser.vcxproj">
|
<ProjectReference Include="$(SolutionDir)src\renderer\dx\lib\dx.vcxproj">
|
||||||
<Project>{3ae13314-1939-4dfa-9c14-38ca0834050c}</Project>
|
|
||||||
</ProjectReference>
|
|
||||||
<ProjectReference Include="$(OpenConsoleDir)src\renderer\dx\lib\dx.vcxproj">
|
|
||||||
<Project>{48d21369-3d7b-4431-9967-24e81292cf62}</Project>
|
<Project>{48d21369-3d7b-4431-9967-24e81292cf62}</Project>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="$(SolutionDir)src\api-ms-win-core-synch-l1-2-0\api-ms-win-core-synch-l1-2-0.vcxproj">
|
||||||
|
<Project>{9CF74355-F018-4C19-81AD-9DC6B7F2C6F5}</Project>
|
||||||
|
</ProjectReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemDefinitionGroup>
|
<ItemDefinitionGroup>
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
|
|
Loading…
Reference in a new issue