WinRT: added a skeleton SDL backend for C++11-based threads
This commit is contained in:
parent
c10e89fd58
commit
e4c6ec5708
15 changed files with 675 additions and 7 deletions
|
@ -89,11 +89,11 @@
|
||||||
<ClCompile Include="..\..\src\stdlib\SDL_qsort.c" />
|
<ClCompile Include="..\..\src\stdlib\SDL_qsort.c" />
|
||||||
<ClCompile Include="..\..\src\stdlib\SDL_stdlib.c" />
|
<ClCompile Include="..\..\src\stdlib\SDL_stdlib.c" />
|
||||||
<ClCompile Include="..\..\src\stdlib\SDL_string.c" />
|
<ClCompile Include="..\..\src\stdlib\SDL_string.c" />
|
||||||
<ClCompile Include="..\..\src\thread\generic\SDL_syscond.c" />
|
|
||||||
<ClCompile Include="..\..\src\thread\generic\SDL_sysmutex.c" />
|
|
||||||
<ClCompile Include="..\..\src\thread\generic\SDL_syssem.c" />
|
<ClCompile Include="..\..\src\thread\generic\SDL_syssem.c" />
|
||||||
<ClCompile Include="..\..\src\thread\generic\SDL_systhread.c" />
|
|
||||||
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
<ClCompile Include="..\..\src\thread\SDL_thread.c" />
|
||||||
|
<ClCompile Include="..\..\src\thread\stdcpp\SDL_syscond.c" />
|
||||||
|
<ClCompile Include="..\..\src\thread\stdcpp\SDL_sysmutex.c" />
|
||||||
|
<ClCompile Include="..\..\src\thread\stdcpp\SDL_systhread.c" />
|
||||||
<ClCompile Include="..\..\src\timer\dummy\SDL_systimer.c" />
|
<ClCompile Include="..\..\src\timer\dummy\SDL_systimer.c" />
|
||||||
<ClCompile Include="..\..\src\timer\SDL_timer.c" />
|
<ClCompile Include="..\..\src\timer\SDL_timer.c" />
|
||||||
<ClCompile Include="..\..\src\video\dummy\SDL_nullevents.c" />
|
<ClCompile Include="..\..\src\video\dummy\SDL_nullevents.c" />
|
||||||
|
@ -253,10 +253,10 @@
|
||||||
<ClInclude Include="..\..\src\SDL_error_c.h" />
|
<ClInclude Include="..\..\src\SDL_error_c.h" />
|
||||||
<ClInclude Include="..\..\src\SDL_fatal.h" />
|
<ClInclude Include="..\..\src\SDL_fatal.h" />
|
||||||
<ClInclude Include="..\..\src\SDL_hints_c.h" />
|
<ClInclude Include="..\..\src\SDL_hints_c.h" />
|
||||||
<ClInclude Include="..\..\src\thread\generic\SDL_sysmutex_c.h" />
|
|
||||||
<ClInclude Include="..\..\src\thread\generic\SDL_systhread_c.h" />
|
|
||||||
<ClInclude Include="..\..\src\thread\SDL_systhread.h" />
|
<ClInclude Include="..\..\src\thread\SDL_systhread.h" />
|
||||||
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
<ClInclude Include="..\..\src\thread\SDL_thread_c.h" />
|
||||||
|
<ClInclude Include="..\..\src\thread\stdcpp\SDL_sysmutex_c.h" />
|
||||||
|
<ClInclude Include="..\..\src\thread\stdcpp\SDL_systhread_c.h" />
|
||||||
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
<ClInclude Include="..\..\src\timer\SDL_timer_c.h" />
|
||||||
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
<ClInclude Include="..\..\src\video\dummy\SDL_nullevents_c.h" />
|
||||||
<ClInclude Include="..\..\src\video\dummy\SDL_nullframebuffer_c.h" />
|
<ClInclude Include="..\..\src\video\dummy\SDL_nullframebuffer_c.h" />
|
||||||
|
|
BIN
VisualC/tests/testthread/WinRT/Assets/Logo.png
Normal file
BIN
VisualC/tests/testthread/WinRT/Assets/Logo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 801 B |
BIN
VisualC/tests/testthread/WinRT/Assets/SmallLogo.png
Normal file
BIN
VisualC/tests/testthread/WinRT/Assets/SmallLogo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 329 B |
BIN
VisualC/tests/testthread/WinRT/Assets/SplashScreen.png
Normal file
BIN
VisualC/tests/testthread/WinRT/Assets/SplashScreen.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
BIN
VisualC/tests/testthread/WinRT/Assets/StoreLogo.png
Normal file
BIN
VisualC/tests/testthread/WinRT/Assets/StoreLogo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 429 B |
42
VisualC/tests/testthread/WinRT/Package.appxmanifest
Normal file
42
VisualC/tests/testthread/WinRT/Package.appxmanifest
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
|
||||||
|
|
||||||
|
<Identity Name="ca3178f1-b2b2-43bf-97dd-28ee1b7d32c5"
|
||||||
|
Publisher="CN=David"
|
||||||
|
Version="1.0.0.0" />
|
||||||
|
|
||||||
|
<Properties>
|
||||||
|
<DisplayName>testthread_VS2012_WinRT</DisplayName>
|
||||||
|
<PublisherDisplayName>David</PublisherDisplayName>
|
||||||
|
<Logo>Assets\StoreLogo.png</Logo>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Prerequisites>
|
||||||
|
<OSMinVersion>6.2.1</OSMinVersion>
|
||||||
|
<OSMaxVersionTested>6.2.1</OSMaxVersionTested>
|
||||||
|
</Prerequisites>
|
||||||
|
|
||||||
|
<Resources>
|
||||||
|
<Resource Language="x-generate"/>
|
||||||
|
</Resources>
|
||||||
|
|
||||||
|
<Applications>
|
||||||
|
<Application Id="App"
|
||||||
|
Executable="$targetnametoken$.exe"
|
||||||
|
EntryPoint="testthread_VS2012_WinRT.App">
|
||||||
|
<VisualElements
|
||||||
|
DisplayName="testthread_VS2012_WinRT"
|
||||||
|
Logo="Assets\Logo.png"
|
||||||
|
SmallLogo="Assets\SmallLogo.png"
|
||||||
|
Description="testthread_VS2012_WinRT"
|
||||||
|
ForegroundText="light"
|
||||||
|
BackgroundColor="#464646">
|
||||||
|
<DefaultTile ShowName="allLogos" />
|
||||||
|
<SplashScreen Image="Assets\SplashScreen.png" />
|
||||||
|
</VisualElements>
|
||||||
|
</Application>
|
||||||
|
</Applications>
|
||||||
|
<Capabilities>
|
||||||
|
<Capability Name="internetClient" />
|
||||||
|
</Capabilities>
|
||||||
|
</Package>
|
159
VisualC/tests/testthread/WinRT/testthread_VS2012_WinRT.vcxproj
Normal file
159
VisualC/tests/testthread/WinRT/testthread_VS2012_WinRT.vcxproj
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|ARM">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>ARM</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|ARM">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>ARM</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{a8705bee-d01d-46a4-b2ab-feedfb5fdd11}</ProjectGuid>
|
||||||
|
<RootNamespace>testthread_VS2012_WinRT</RootNamespace>
|
||||||
|
<DefaultLanguage>en-US</DefaultLanguage>
|
||||||
|
<MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>
|
||||||
|
<AppContainerApplication>true</AppContainerApplication>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v110</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v110</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v110</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<PlatformToolset>v110</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|ARM'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<PlatformToolset>v110</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<PlatformToolset>v110</PlatformToolset>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<PackageCertificateKeyFile>testthread_VS2012_WinRT_TemporaryKey.pfx</PackageCertificateKeyFile>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup>
|
||||||
|
<Link>
|
||||||
|
<AdditionalDependencies>d2d1.lib; d3d11.lib; dxgi.lib; ole32.lib; windowscodecs.lib; dwrite.lib; %(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
|
<PrecompiledHeaderOutputFile>$(IntDir)pch.pch</PrecompiledHeaderOutputFile>
|
||||||
|
<AdditionalIncludeDirectories>$(ProjectDir);$(IntermediateOutputPath);$(ProjectDir)..\..\..\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<DisableSpecificWarnings>4453</DisableSpecificWarnings>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Release'">
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">NotUsing</PrecompiledHeader>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">false</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</CompileAsWinRT>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)'=='Debug'">
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
|
||||||
|
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">NotUsing</PrecompiledHeader>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</CompileAsWinRT>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Image Include="Assets\Logo.png" />
|
||||||
|
<Image Include="Assets\SmallLogo.png" />
|
||||||
|
<Image Include="Assets\StoreLogo.png" />
|
||||||
|
<Image Include="Assets\SplashScreen.png" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<AppxManifest Include="Package.appxmanifest">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</AppxManifest>
|
||||||
|
<None Include="testthread_VS2012_WinRT_TemporaryKey.pfx" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\..\..\src\main\windowsrt\SDL_winrt_main.cpp">
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">true</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</CompileAsWinRT>
|
||||||
|
<CompileAsWinRT Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</CompileAsWinRT>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\..\..\test\testthread.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\..\SDL\SDL_VS2012_WinRT.vcxproj">
|
||||||
|
<Project>{aeaea3a2-d4e6-45b1-8ec6-53d84287fc14}</Project>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
Binary file not shown.
|
@ -158,9 +158,9 @@ typedef unsigned int uintptr_t;
|
||||||
#define SDL_LOADSO_WINDOWS 1
|
#define SDL_LOADSO_WINDOWS 1
|
||||||
|
|
||||||
/* Enable various threading systems */
|
/* Enable various threading systems */
|
||||||
// TODO, WinRT: get threads working on WinRT
|
//#define SDL_THREADS_DISABLED 1
|
||||||
#define SDL_THREADS_DISABLED 1
|
|
||||||
//#define SDL_THREAD_WINDOWS 1
|
//#define SDL_THREAD_WINDOWS 1
|
||||||
|
#define SDL_THREAD_STDCPP 1
|
||||||
|
|
||||||
/* Enable various timer systems */
|
/* Enable various timer systems */
|
||||||
// TODO, WinRT: look into getting SDL's pre-WinRT timers working.
|
// TODO, WinRT: look into getting SDL's pre-WinRT timers working.
|
||||||
|
|
|
@ -36,6 +36,8 @@
|
||||||
#include "windows/SDL_systhread_c.h"
|
#include "windows/SDL_systhread_c.h"
|
||||||
#elif SDL_THREAD_NDS
|
#elif SDL_THREAD_NDS
|
||||||
#include "nds/SDL_systhread_c.h"
|
#include "nds/SDL_systhread_c.h"
|
||||||
|
#elif SDL_THREAD_STDCPP
|
||||||
|
#include "stdcpp/SDL_systhread_c.h"
|
||||||
#else
|
#else
|
||||||
#error Need thread implementation for this platform
|
#error Need thread implementation for this platform
|
||||||
#include "generic/SDL_systhread_c.h"
|
#include "generic/SDL_systhread_c.h"
|
||||||
|
|
223
src/thread/stdcpp/SDL_syscond.c
Normal file
223
src/thread/stdcpp/SDL_syscond.c
Normal file
|
@ -0,0 +1,223 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
|
||||||
|
/* An implementation of condition variables using semaphores and mutexes */
|
||||||
|
/*
|
||||||
|
This implementation borrows heavily from the BeOS condition variable
|
||||||
|
implementation, written by Christopher Tate and Owen Smith. Thanks!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SDL_thread.h"
|
||||||
|
|
||||||
|
struct SDL_cond
|
||||||
|
{
|
||||||
|
SDL_mutex *lock;
|
||||||
|
int waiting;
|
||||||
|
int signals;
|
||||||
|
SDL_sem *wait_sem;
|
||||||
|
SDL_sem *wait_done;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Create a condition variable */
|
||||||
|
SDL_cond *
|
||||||
|
SDL_CreateCond(void)
|
||||||
|
{
|
||||||
|
SDL_cond *cond;
|
||||||
|
|
||||||
|
cond = (SDL_cond *) SDL_malloc(sizeof(SDL_cond));
|
||||||
|
if (cond) {
|
||||||
|
cond->lock = SDL_CreateMutex();
|
||||||
|
cond->wait_sem = SDL_CreateSemaphore(0);
|
||||||
|
cond->wait_done = SDL_CreateSemaphore(0);
|
||||||
|
cond->waiting = cond->signals = 0;
|
||||||
|
if (!cond->lock || !cond->wait_sem || !cond->wait_done) {
|
||||||
|
SDL_DestroyCond(cond);
|
||||||
|
cond = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
}
|
||||||
|
return (cond);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Destroy a condition variable */
|
||||||
|
void
|
||||||
|
SDL_DestroyCond(SDL_cond * cond)
|
||||||
|
{
|
||||||
|
if (cond) {
|
||||||
|
if (cond->wait_sem) {
|
||||||
|
SDL_DestroySemaphore(cond->wait_sem);
|
||||||
|
}
|
||||||
|
if (cond->wait_done) {
|
||||||
|
SDL_DestroySemaphore(cond->wait_done);
|
||||||
|
}
|
||||||
|
if (cond->lock) {
|
||||||
|
SDL_DestroyMutex(cond->lock);
|
||||||
|
}
|
||||||
|
SDL_free(cond);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restart one of the threads that are waiting on the condition variable */
|
||||||
|
int
|
||||||
|
SDL_CondSignal(SDL_cond * cond)
|
||||||
|
{
|
||||||
|
if (!cond) {
|
||||||
|
SDL_SetError("Passed a NULL condition variable");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If there are waiting threads not already signalled, then
|
||||||
|
signal the condition and wait for the thread to respond.
|
||||||
|
*/
|
||||||
|
SDL_LockMutex(cond->lock);
|
||||||
|
if (cond->waiting > cond->signals) {
|
||||||
|
++cond->signals;
|
||||||
|
SDL_SemPost(cond->wait_sem);
|
||||||
|
SDL_UnlockMutex(cond->lock);
|
||||||
|
SDL_SemWait(cond->wait_done);
|
||||||
|
} else {
|
||||||
|
SDL_UnlockMutex(cond->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Restart all threads that are waiting on the condition variable */
|
||||||
|
int
|
||||||
|
SDL_CondBroadcast(SDL_cond * cond)
|
||||||
|
{
|
||||||
|
if (!cond) {
|
||||||
|
SDL_SetError("Passed a NULL condition variable");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If there are waiting threads not already signalled, then
|
||||||
|
signal the condition and wait for the thread to respond.
|
||||||
|
*/
|
||||||
|
SDL_LockMutex(cond->lock);
|
||||||
|
if (cond->waiting > cond->signals) {
|
||||||
|
int i, num_waiting;
|
||||||
|
|
||||||
|
num_waiting = (cond->waiting - cond->signals);
|
||||||
|
cond->signals = cond->waiting;
|
||||||
|
for (i = 0; i < num_waiting; ++i) {
|
||||||
|
SDL_SemPost(cond->wait_sem);
|
||||||
|
}
|
||||||
|
/* Now all released threads are blocked here, waiting for us.
|
||||||
|
Collect them all (and win fabulous prizes!) :-)
|
||||||
|
*/
|
||||||
|
SDL_UnlockMutex(cond->lock);
|
||||||
|
for (i = 0; i < num_waiting; ++i) {
|
||||||
|
SDL_SemWait(cond->wait_done);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SDL_UnlockMutex(cond->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait on the condition variable for at most 'ms' milliseconds.
|
||||||
|
The mutex must be locked before entering this function!
|
||||||
|
The mutex is unlocked during the wait, and locked again after the wait.
|
||||||
|
|
||||||
|
Typical use:
|
||||||
|
|
||||||
|
Thread A:
|
||||||
|
SDL_LockMutex(lock);
|
||||||
|
while ( ! condition ) {
|
||||||
|
SDL_CondWait(cond, lock);
|
||||||
|
}
|
||||||
|
SDL_UnlockMutex(lock);
|
||||||
|
|
||||||
|
Thread B:
|
||||||
|
SDL_LockMutex(lock);
|
||||||
|
...
|
||||||
|
condition = true;
|
||||||
|
...
|
||||||
|
SDL_CondSignal(cond);
|
||||||
|
SDL_UnlockMutex(lock);
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
if (!cond) {
|
||||||
|
SDL_SetError("Passed a NULL condition variable");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Obtain the protection mutex, and increment the number of waiters.
|
||||||
|
This allows the signal mechanism to only perform a signal if there
|
||||||
|
are waiting threads.
|
||||||
|
*/
|
||||||
|
SDL_LockMutex(cond->lock);
|
||||||
|
++cond->waiting;
|
||||||
|
SDL_UnlockMutex(cond->lock);
|
||||||
|
|
||||||
|
/* Unlock the mutex, as is required by condition variable semantics */
|
||||||
|
SDL_UnlockMutex(mutex);
|
||||||
|
|
||||||
|
/* Wait for a signal */
|
||||||
|
if (ms == SDL_MUTEX_MAXWAIT) {
|
||||||
|
retval = SDL_SemWait(cond->wait_sem);
|
||||||
|
} else {
|
||||||
|
retval = SDL_SemWaitTimeout(cond->wait_sem, ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Let the signaler know we have completed the wait, otherwise
|
||||||
|
the signaler can race ahead and get the condition semaphore
|
||||||
|
if we are stopped between the mutex unlock and semaphore wait,
|
||||||
|
giving a deadlock. See the following URL for details:
|
||||||
|
http://www-classic.be.com/aboutbe/benewsletter/volume_III/Issue40.html
|
||||||
|
*/
|
||||||
|
SDL_LockMutex(cond->lock);
|
||||||
|
if (cond->signals > 0) {
|
||||||
|
/* If we timed out, we need to eat a condition signal */
|
||||||
|
if (retval > 0) {
|
||||||
|
SDL_SemWait(cond->wait_sem);
|
||||||
|
}
|
||||||
|
/* We always notify the signal thread that we are done */
|
||||||
|
SDL_SemPost(cond->wait_done);
|
||||||
|
|
||||||
|
/* Signal handshake complete */
|
||||||
|
--cond->signals;
|
||||||
|
}
|
||||||
|
--cond->waiting;
|
||||||
|
SDL_UnlockMutex(cond->lock);
|
||||||
|
|
||||||
|
/* Lock the mutex, as is required by condition variable semantics */
|
||||||
|
SDL_LockMutex(mutex);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait on the condition variable forever */
|
||||||
|
int
|
||||||
|
SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex)
|
||||||
|
{
|
||||||
|
return SDL_CondWaitTimeout(cond, mutex, SDL_MUTEX_MAXWAIT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
135
src/thread/stdcpp/SDL_sysmutex.c
Normal file
135
src/thread/stdcpp/SDL_sysmutex.c
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
|
||||||
|
/* An implementation of mutexes using semaphores */
|
||||||
|
|
||||||
|
#include "SDL_thread.h"
|
||||||
|
#include "SDL_systhread_c.h"
|
||||||
|
|
||||||
|
|
||||||
|
struct SDL_mutex
|
||||||
|
{
|
||||||
|
int recursive;
|
||||||
|
SDL_threadID owner;
|
||||||
|
SDL_sem *sem;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Create a mutex */
|
||||||
|
SDL_mutex *
|
||||||
|
SDL_CreateMutex(void)
|
||||||
|
{
|
||||||
|
SDL_mutex *mutex;
|
||||||
|
|
||||||
|
/* Allocate mutex memory */
|
||||||
|
mutex = (SDL_mutex *) SDL_malloc(sizeof(*mutex));
|
||||||
|
if (mutex) {
|
||||||
|
/* Create the mutex semaphore, with initial value 1 */
|
||||||
|
mutex->sem = SDL_CreateSemaphore(1);
|
||||||
|
mutex->recursive = 0;
|
||||||
|
mutex->owner = 0;
|
||||||
|
if (!mutex->sem) {
|
||||||
|
SDL_free(mutex);
|
||||||
|
mutex = NULL;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SDL_OutOfMemory();
|
||||||
|
}
|
||||||
|
return mutex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free the mutex */
|
||||||
|
void
|
||||||
|
SDL_DestroyMutex(SDL_mutex * mutex)
|
||||||
|
{
|
||||||
|
if (mutex) {
|
||||||
|
if (mutex->sem) {
|
||||||
|
SDL_DestroySemaphore(mutex->sem);
|
||||||
|
}
|
||||||
|
SDL_free(mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Lock the semaphore */
|
||||||
|
int
|
||||||
|
SDL_mutexP(SDL_mutex * mutex)
|
||||||
|
{
|
||||||
|
#if SDL_THREADS_DISABLED
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
SDL_threadID this_thread;
|
||||||
|
|
||||||
|
if (mutex == NULL) {
|
||||||
|
SDL_SetError("Passed a NULL mutex");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
this_thread = SDL_ThreadID();
|
||||||
|
if (mutex->owner == this_thread) {
|
||||||
|
++mutex->recursive;
|
||||||
|
} else {
|
||||||
|
/* The order of operations is important.
|
||||||
|
We set the locking thread id after we obtain the lock
|
||||||
|
so unlocks from other threads will fail.
|
||||||
|
*/
|
||||||
|
SDL_SemWait(mutex->sem);
|
||||||
|
mutex->owner = this_thread;
|
||||||
|
mutex->recursive = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#endif /* SDL_THREADS_DISABLED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unlock the mutex */
|
||||||
|
int
|
||||||
|
SDL_mutexV(SDL_mutex * mutex)
|
||||||
|
{
|
||||||
|
#if SDL_THREADS_DISABLED
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
if (mutex == NULL) {
|
||||||
|
SDL_SetError("Passed a NULL mutex");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we don't own the mutex, we can't unlock it */
|
||||||
|
if (SDL_ThreadID() != mutex->owner) {
|
||||||
|
SDL_SetError("mutex not owned by this thread");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mutex->recursive) {
|
||||||
|
--mutex->recursive;
|
||||||
|
} else {
|
||||||
|
/* The order of operations is important.
|
||||||
|
First reset the owner so another thread doesn't lock
|
||||||
|
the mutex and set the ownership before we reset it,
|
||||||
|
then release the lock semaphore.
|
||||||
|
*/
|
||||||
|
mutex->owner = 0;
|
||||||
|
SDL_SemPost(mutex->sem);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
#endif /* SDL_THREADS_DISABLED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
22
src/thread/stdcpp/SDL_sysmutex_c.h
Normal file
22
src/thread/stdcpp/SDL_sysmutex_c.h
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
59
src/thread/stdcpp/SDL_systhread.c
Normal file
59
src/thread/stdcpp/SDL_systhread.c
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
|
||||||
|
/* Thread management routines for SDL */
|
||||||
|
|
||||||
|
#include "SDL_thread.h"
|
||||||
|
#include "../SDL_systhread.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
SDL_SYS_CreateThread(SDL_Thread * thread, void *args)
|
||||||
|
{
|
||||||
|
SDL_SetError("Threads are not supported on this platform");
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SDL_SYS_SetupThread(const char *name)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_threadID
|
||||||
|
SDL_ThreadID(void)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
SDL_SYS_SetThreadPriority(SDL_ThreadPriority priority)
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SDL_SYS_WaitThread(SDL_Thread * thread)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
26
src/thread/stdcpp/SDL_systhread_c.h
Normal file
26
src/thread/stdcpp/SDL_systhread_c.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
Simple DirectMedia Layer
|
||||||
|
Copyright (C) 1997-2012 Sam Lantinga <slouken@libsdl.org>
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any damages
|
||||||
|
arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it
|
||||||
|
freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must not
|
||||||
|
claim that you wrote the original software. If you use this software
|
||||||
|
in a product, an acknowledgment in the product documentation would be
|
||||||
|
appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*/
|
||||||
|
#include "SDL_config.h"
|
||||||
|
|
||||||
|
/* For a thread handle, use a void pointer to a std::thread */
|
||||||
|
typedef void * SYS_ThreadHandle;
|
||||||
|
|
||||||
|
/* vi: set ts=4 sw=4 expandtab: */
|
Loading…
Add table
Add a link
Reference in a new issue