Skip to content
This repository has been archived by the owner on Dec 30, 2022. It is now read-only.

Commit

Permalink
Fix issue with deadlock on process quit. Add tests specifically for t…
Browse files Browse the repository at this point in the history
…hat deadlock.
  • Loading branch information
Nikola Yanakiev committed May 14, 2019
1 parent 96ecf0a commit 5cac355
Show file tree
Hide file tree
Showing 10 changed files with 135 additions and 16 deletions.
46 changes: 46 additions & 0 deletions samp-discord-plugin-test/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#include <Windows.h>
#include <iostream>
#include <memory>

// Maximum processes to spawn
constexpr int numProcesses = MAXIMUM_WAIT_OBJECTS;
// Enough sleep time for Discord to update the status
constexpr unsigned long sleepTime = 5000;

// This test was made specifically to catch the "exit on DLL unload" issue
// It works by forking the process n times and each process loading the ASI then sleeping and exiting
int main(int argc, const char* argv[])
{
if (argc == 1) {
STARTUPINFO si{sizeof(si)};
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
auto processes = std::make_unique<HANDLE[]>(numProcesses);
for (size_t i = 0; i < numProcesses; ++i) {
PROCESS_INFORMATION pi{};
CHAR args[] = "-d -n test";
if (!CreateProcess(argv[0], args, nullptr, nullptr, false, 0, nullptr, nullptr, &si, &pi)) {
std::cerr << "Could not fork process" << std::endl;
return 1;
}
processes.get()[i] = pi.hProcess;
}
if (WaitForMultipleObjects(numProcesses, processes.get(), true, sleepTime+1000) != WAIT_TIMEOUT) {
std::cout << "Test passed" << std::endl;
return 0;
}
else {
std::cerr << "Test failed" << std::endl;
for (size_t i = 0; i < numProcesses; ++i) {
TerminateProcess(processes.get()[i], 0);
}
return 1;
}
}
else {
HINSTANCE lib = LoadLibrary("samp-discord-plugin.asi");
Sleep(sleepTime);
return 0;
}
}
54 changes: 54 additions & 0 deletions samp-discord-plugin-test/samp-discord-plugin-test.vcxproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>15.0</VCProjectVersion>
<ProjectGuid>{78D6FD5E-F278-407A-B8AA-C5C5942D748A}</ProjectGuid>
<RootNamespace>sampdiscordplugintest</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v140_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</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>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<SubSystem>Console</SubSystem>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
14 changes: 14 additions & 0 deletions samp-discord-plugin-test/samp-discord-plugin-test.vcxproj.filters
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?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;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
7 changes: 7 additions & 0 deletions samp-discord-plugin.sln
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,20 @@ VisualStudioVersion = 15.0.27130.2036
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "samp-discord-plugin", "samp-discord-plugin\samp-discord-plugin.vcxproj", "{C74CB37E-74FB-4906-A291-0B30A111DEB5}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "samp-discord-plugin-test", "samp-discord-plugin-test\samp-discord-plugin-test.vcxproj", "{78D6FD5E-F278-407A-B8AA-C5C5942D748A}"
ProjectSection(ProjectDependencies) = postProject
{C74CB37E-74FB-4906-A291-0B30A111DEB5} = {C74CB37E-74FB-4906-A291-0B30A111DEB5}
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C74CB37E-74FB-4906-A291-0B30A111DEB5}.Release|x86.ActiveCfg = Release|Win32
{C74CB37E-74FB-4906-A291-0B30A111DEB5}.Release|x86.Build.0 = Release|Win32
{78D6FD5E-F278-407A-B8AA-C5C5942D748A}.Release|x86.ActiveCfg = Release|Win32
{78D6FD5E-F278-407A-B8AA-C5C5942D748A}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
6 changes: 1 addition & 5 deletions samp-discord-plugin/discord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,7 @@ namespace Discord
handlers.spectateGame = spectateGame;
handlers.joinRequest = joinRequest;
Discord_Initialize("416719211960991756", &handlers, 1, nullptr);
}

void shutdown()
{
Discord_Shutdown();
Discord_ClearPresence();
}

void update(const time_t time, const char* state, const char* details, const char* image, const char* imageDetails, const char* infoDetails)
Expand Down
3 changes: 1 addition & 2 deletions samp-discord-plugin/discord.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
#pragma once

#include "discord-rpc\discord-rpc.h"
#include "discord-rpc\discord_rpc.h"
#include <ctime>
#include <string>

namespace Discord
{
void initialize();
void shutdown();
void update(const time_t time, const char* state, const char* details, const char* image, const char* imageDetails, const char* infoDetails);
inline void update(const time_t time, const std::string& state, const std::string& details, const std::string& image, const std::string& imageDetails, const std::string& infoDetails)
{
Expand Down
10 changes: 6 additions & 4 deletions samp-discord-plugin/dllmain.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include <process.h>
#include <process.h>
#include "client.h"
#include "discord.h"
#include "query.h"
Expand All @@ -9,6 +9,7 @@ static void process(void*)
SAMP::ServerData data;
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
Discord::initialize();
if (SAMP::readServerData(GetCommandLine(), data)) {
std::string logo = "logo";
{
Expand All @@ -30,7 +31,6 @@ static void process(void*)
if (data.connect == SAMP::SAMP_CONNECT_SERVER) {
SAMP::Query query(data.address, std::stoi(data.port));
while (true) {
Discord::initialize();
SAMP::Query::Information information;
if (query.info(information)) {
auto fullAddress = data.address + ':' + data.port;
Expand All @@ -51,7 +51,10 @@ static void process(void*)
}
}
else if (data.connect == SAMP::SAMP_CONNECT_DEBUG) {
Discord::update(start, "localhost", "Debug server", "tumbleweed", "Playing debug mode in English", "Most likely 1 player online as it's debug mode");
while (true) {
Discord::update(start, "localhost", "Debug server", "tumbleweed", "Playing debug mode in English", "Most likely 1 player online as it's debug mode");
Sleep(15000);
}
}
}
}
Expand All @@ -66,7 +69,6 @@ BOOL APIENTRY DllMain(HMODULE module, DWORD reason, LPVOID reserved)
break;
}
case DLL_PROCESS_DETACH: {
Discord::shutdown();
WSACleanup();
break;
}
Expand Down
5 changes: 3 additions & 2 deletions samp-discord-plugin/samp-discord-plugin.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>$(ProjectDir)\discord-rpc\discord-rpc.lib;%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>false</GenerateDebugInformation>
<GenerateDebugInformation>true</GenerateDebugInformation>
<FullProgramDatabaseFile>true</FullProgramDatabaseFile>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
Expand All @@ -60,7 +61,7 @@
<ClCompile Include="query.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="discord-rpc\discord-rpc.h" />
<ClInclude Include="discord-rpc\discord_rpc.h" />
<ClInclude Include="discord.h" />
<ClInclude Include="client.h" />
<ClInclude Include="http.h" />
Expand Down
6 changes: 3 additions & 3 deletions samp-discord-plugin/samp-discord-plugin.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,6 @@
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="discord-rpc\discord-rpc.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="discord.h">
<Filter>Header Files</Filter>
</ClInclude>
Expand All @@ -43,5 +40,8 @@
<ClInclude Include="http.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="discord-rpc\discord_rpc.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>

0 comments on commit 5cac355

Please sign in to comment.