Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <opc/ua/server/addons/asio_addon.h>
00021
00022 #include <boost/asio.hpp>
00023 #include <iostream>
00024 #include <thread>
00025
00026 namespace
00027 {
00028 class AsioAddonImpl : public OpcUa::Server::AsioAddon
00029 {
00030 public:
00031 AsioAddonImpl()
00032 : Work(IoService)
00033 {
00034 }
00035
00036
00037 void Initialize(Common::AddonsManager&, const Common::AddonParameters& params) override
00038 {
00039 const unsigned threadsNumber = GetThreadsNumber(params);
00040
00041 for (unsigned i = 0; i < threadsNumber; ++i)
00042 {
00043 Threads.emplace_back([this, i](){
00044
00045 IoService.run();
00046
00047 });
00048 }
00049 }
00050
00051 void Stop() override
00052 {
00053
00054 IoService.stop();
00055
00056 std::for_each(Threads.begin(), Threads.end(), [](std::thread& thread){
00057 thread.join();
00058 });
00059 }
00060
00061 virtual boost::asio::io_service& GetIoService() override
00062 {
00063 return IoService;
00064 }
00065
00066 unsigned GetThreadsNumber(const Common::AddonParameters& params) const
00067 {
00068 unsigned num = 1;
00069 for (auto paramIt : params.Parameters)
00070 {
00071 if (paramIt.Name == "threads")
00072 {
00073 num = std::stoi(paramIt.Value);
00074 break;
00075 }
00076 }
00077 return num;
00078 }
00079
00080 private:
00081 boost::asio::io_service IoService;
00082 boost::asio::io_service::work Work;
00083 std::vector<std::thread> Threads;
00084 };
00085 }
00086
00087
00088 namespace OpcUa
00089 {
00090 namespace Server
00091 {
00092
00093 Common::Addon::UniquePtr AsioAddonFactory::CreateAddon()
00094 {
00095 return Common::Addon::UniquePtr(new AsioAddonImpl);
00096 }
00097
00098 }
00099 }