diff --git a/examples/MutexMessageRouter/CMakeLists.txt b/examples/MutexMessageRouter/CMakeLists.txt new file mode 100644 index 00000000..3ed4b335 --- /dev/null +++ b/examples/MutexMessageRouter/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.5.0) +project(etl_mutex_router LANGUAGES CXX) + +add_executable(etl_mutex_router MutexMessageRouter.cpp) + +target_compile_definitions(etl_mutex_router PRIVATE -DETL_DEBUG) + +target_include_directories(etl_mutex_router + PRIVATE + ${PROJECT_SOURCE_DIR}/../../include) + +set_property(TARGET etl_mutex_router PROPERTY CXX_STANDARD 17) diff --git a/examples/MutexMessageRouter/MutexMessageRouter.cpp b/examples/MutexMessageRouter/MutexMessageRouter.cpp new file mode 100644 index 00000000..1d612673 --- /dev/null +++ b/examples/MutexMessageRouter/MutexMessageRouter.cpp @@ -0,0 +1,110 @@ + +#include +#include +#include +#include +#include + +#include "etl/mutex.h" +#include "etl/message.h" +#include "etl/message_router.h" + +//************************************* +struct Message1 : public etl::message<1> +{ +}; + +//************************************* +struct Message2 : public etl::message<2> +{ +}; + +//************************************* +class Router : public etl::message_router +{ +public: + + using base_t = etl::message_router; + + //***************** + // Overridden receive that protects access with mutexes + void receive(const etl::imessage& msg) override + { + access.lock(); + base_t::receive(msg); // Send it to the message_router's receive. + access.unlock(); + } + + //***************** + void on_receive(const Message1&) + { + result.append("Message1\n"); + } + + //***************** + void on_receive(const Message2&) + { + result.append("Message2\n"); + } + + //***************** + void on_receive_unknown(const etl::imessage&) + { + } + + std::string result; + +private: + + etl::mutex access; +}; + +//************************************* +etl::atomic start = false; +Router router; + +//************************************* +void thread1() +{ + using namespace std::chrono_literals; + + while (!start.load()); + + for (int i = 0; i < 10; ++i) + { + std::this_thread::sleep_for(1ms); + router.receive(Message1()); + } +} + +//************************************* +void thread2() +{ + using namespace std::chrono_literals; + + while (!start.load()); + + for (int i = 0; i < 10; ++i) + { + std::this_thread::sleep_for(1ms); + router.receive(Message2()); + } +} + +//************************************* +int main() +{ + std::thread t1(thread1); + std::thread t2(thread2); + + start.store(true); + + t1.join(); + t2.join(); + + std::cout << router.result << "\n"; + + return 0; +} + + diff --git a/examples/MutexMessageRouter/MutexMessageRouter.sln b/examples/MutexMessageRouter/MutexMessageRouter.sln new file mode 100644 index 00000000..f4e7b5d8 --- /dev/null +++ b/examples/MutexMessageRouter/MutexMessageRouter.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34009.444 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MutexMessageRouter", "MutexMessageRouter.vcxproj", "{23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}.Debug|x64.ActiveCfg = Debug|x64 + {23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}.Debug|x64.Build.0 = Debug|x64 + {23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}.Debug|x86.ActiveCfg = Debug|Win32 + {23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}.Debug|x86.Build.0 = Debug|Win32 + {23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}.Release|x64.ActiveCfg = Release|x64 + {23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}.Release|x64.Build.0 = Release|x64 + {23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}.Release|x86.ActiveCfg = Release|Win32 + {23AD62D5-C3B6-48B0-BF0D-E349FEB3F338}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8AA5CBFE-B15F-4262-97AE-C12F7266BD85} + EndGlobalSection +EndGlobal diff --git a/examples/MutexMessageRouter/MutexMessageRouter.vcxproj b/examples/MutexMessageRouter/MutexMessageRouter.vcxproj new file mode 100644 index 00000000..214a316c --- /dev/null +++ b/examples/MutexMessageRouter/MutexMessageRouter.vcxproj @@ -0,0 +1,140 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {23ad62d5-c3b6-48b0-bf0d-e349feb3f338} + MutexMessageRouter + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ../../include; + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + ../../include;%(AdditionalIncludeDirectories) + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + \ No newline at end of file