From b4fc91f41be76d8764e849fba9fdfd5b5dd284df Mon Sep 17 00:00:00 2001 From: chatlanin Date: Mon, 11 Apr 2022 10:23:05 +0300 Subject: [PATCH] init --- README.md | 14 +++++++++++ bin/main.cpp | 43 ++++++++++++++++++++++++++++++++ bin/meson.build | 10 ++++++++ logo.png | Bin 0 -> 439419 bytes meson.build | 37 +++++++++++++++++++++++++++ run | 15 +++++++++++ src/actfm.hpp | 3 +++ src/actor.hpp | 24 ++++++++++++++++++ src/actor_controller.hpp | 25 +++++++++++++++++++ src/meson.build | 16 ++++++++++++ src/scheduler.hpp | 36 ++++++++++++++++++++++++++ src/thread_pool/meson.build | 15 +++++++++++ src/thread_pool/thread_pool.cpp | 33 ++++++++++++++++++++++++ src/thread_pool/thread_pool.hpp | 25 +++++++++++++++++++ src/threadsafe_queue.hpp | 15 +++++++++++ subprojects/gtest.wrap | 15 +++++++++++ subprojects/hack.wrap | 6 +++++ tests/meson.build | 0 18 files changed, 332 insertions(+) create mode 100644 README.md create mode 100644 bin/main.cpp create mode 100644 bin/meson.build create mode 100644 logo.png create mode 100644 meson.build create mode 100755 run create mode 100644 src/actfm.hpp create mode 100644 src/actor.hpp create mode 100644 src/actor_controller.hpp create mode 100644 src/meson.build create mode 100644 src/scheduler.hpp create mode 100644 src/thread_pool/meson.build create mode 100644 src/thread_pool/thread_pool.cpp create mode 100644 src/thread_pool/thread_pool.hpp create mode 100644 src/threadsafe_queue.hpp create mode 100644 subprojects/gtest.wrap create mode 100644 subprojects/hack.wrap create mode 100644 tests/meson.build diff --git a/README.md b/README.md new file mode 100644 index 0000000..f7d2c96 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +![actfm's logo](./logo.png) +*The actor model is well described and if you don’t know anything about it, you can read about it elsewhere.* + +**This Actor Model behaves as follows:** +- An Actor is a unit of computation. It can accept a message and asynchronously perform some action based on user-specified behaviour. +- Actors have a “sendbox”, usually an in-memory queue that stores messages sent to that actor. +- Actors do not access shared state. +- Actors “own” any state they operate on, so the need for locking mechanisms is reduced*. + +**Here’s how it work:** +- Client code define the type of the message an actor can handle, and the type of the result produced by that actor using template parameters. In other words, the actors are statically typed. +- There have a simple actor interface. Clients send a message to an actor in two ways: actor.send if they don’t expect a response, or actor.expect if a response is required. +- Actor systems are instantiated with a thread pool onto which work dispatched. +- Actor systems are instantiated with a scheduler which handle the dispatching of tasks onto the thread pool in a fair manner. diff --git a/bin/main.cpp b/bin/main.cpp new file mode 100644 index 0000000..1a6815e --- /dev/null +++ b/bin/main.cpp @@ -0,0 +1,43 @@ +#include "actfm.hpp" + +#include "logger/logger.hpp" + +using result_t = std::vector; + +struct message +{ + result_t data; +}; + +class sorting : public actfm::actor +{ + public: + result_t set_message(message ms, actfm::actor* ac = nullptr) override + { + result_t res; + + if (ac) + {} + else + { + std::sort(ms.data.begin(), ms.data.end()); + } + return res; + + } +}; + +int main(int argc, char *argv[]) +{ + hack::log()("run example"); + + message ms; + ms.data = { 1, 5, 7, 9, 2, 4, 6, 8 }; + + sorting sort; + sort.set_message(ms); + + actfm::actor_controller::instance().set_actro(sort); + + hack::log()("completed"); +} diff --git a/bin/meson.build b/bin/meson.build new file mode 100644 index 0000000..64c8ac4 --- /dev/null +++ b/bin/meson.build @@ -0,0 +1,10 @@ +src = [ 'main.cpp' ] + +deps += actfm_dep + +executable( + 'actorfm', + src, + dependencies : deps, + cpp_args: args +) diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5565c88817c61d61503335b21379400dcf0e4b GIT binary patch literal 439419 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 literal 0 HcmV?d00001 diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..2bb4e1f --- /dev/null +++ b/meson.build @@ -0,0 +1,37 @@ +# https://pixorblog.wordpress.com/2019/07/27/a-meson-starter-script-for-c-projects +project( + 'actorfm', + 'cpp', + version : '0.0.1', + default_options : ['cpp_std=c++2a'] +) + +add_project_arguments ( + '-Wpedantic', + '-Wshadow', + '-Wno-comment', + '-Wunused-but-set-variable', + language: 'cpp' +) + +compiler = meson.get_compiler('cpp') +if compiler.get_id() == 'gcc' + message('Compiler: GCC') +elif compiler.get_id() == 'clang' + message('Compiler: LLVM/clang') +endif + +deps = [ + dependency('threads'), +] + +inc = [] +inc += include_directories('.', join_paths('.', 'subprojects')) + +args = [] +hack = subproject('hack') +deps += hack.get_variable('logger_dep') + +subdir('src') +subdir('bin') +#subdir('tests') diff --git a/run b/run new file mode 100755 index 0000000..6ecb493 --- /dev/null +++ b/run @@ -0,0 +1,15 @@ +#!/bin/sh + +PROJECT_NAME="actorfm" +TEST="meson test -C build" +RUN="./build/bin/$PROJECT_NAME" + +command meson compile -C build + +if [[ $1 == "test" ]]; then + command $TEST +else + command $RUN +fi + +return 0 diff --git a/src/actfm.hpp b/src/actfm.hpp new file mode 100644 index 0000000..a4f834f --- /dev/null +++ b/src/actfm.hpp @@ -0,0 +1,3 @@ +#include "actor.hpp" +#include "actor_controller.hpp" + diff --git a/src/actor.hpp b/src/actor.hpp new file mode 100644 index 0000000..00a6339 --- /dev/null +++ b/src/actor.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include +#include + +namespace actfm +{ + template + class actor + { + public: + virtual ~actor() {} + + public: + virtual result_t set_message(message_t ms, actor* ac = nullptr) = 0; + + void send(message_t ms, actor* ac = nullptr) + {} + + result_t expect(message_t ms, actor* ac = nullptr) + {} + }; +} + diff --git a/src/actor_controller.hpp b/src/actor_controller.hpp new file mode 100644 index 0000000..0c84860 --- /dev/null +++ b/src/actor_controller.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include "scheduler.hpp" + +namespace actfm +{ + class actor_controller + { + public: + actor_controller() : sch { std::make_unique() } {} + + static actor_controller& instance() { static actor_controller ac; return ac; } + + template + void set_actro(actor_t& actor) + { + sch->set_actor(actor); + } + + private: + std::unique_ptr sch; + }; +} diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 0000000..7db122e --- /dev/null +++ b/src/meson.build @@ -0,0 +1,16 @@ +inc += include_directories('.') + +subdir('thread_pool') +deps += thread_pool_dep + +lib = library( + 'actfm', + include_directories : inc, + dependencies : deps, + cpp_args: args +) + +actfm_dep = declare_dependency( + include_directories: inc, + link_with: lib, +) diff --git a/src/scheduler.hpp b/src/scheduler.hpp new file mode 100644 index 0000000..806765b --- /dev/null +++ b/src/scheduler.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include "thread_pool/thread_pool.hpp" + +#include "logger/logger.hpp" + +namespace actfm +{ + class scheduler + { + public: + scheduler() : th_pool { std::make_unique() } + { + + + } + + template + void set_actor(actor_t& actor) + { + hack::log()("ref semantic"); + } + + template + void set_actor(actor_t&& actor) + { + hack::log()("move semantic"); + } + + private: + std::unique_ptr th_pool; + }; +} + diff --git a/src/thread_pool/meson.build b/src/thread_pool/meson.build new file mode 100644 index 0000000..05bc175 --- /dev/null +++ b/src/thread_pool/meson.build @@ -0,0 +1,15 @@ +headers = ['thread_pool.hpp'] +sources = ['thread_pool.cpp'] + +lib = library( + 'thread_pool', + include_directories : inc, + sources: [headers, sources], + dependencies : deps, + cpp_args: args +) + +thread_pool_dep = declare_dependency( + include_directories: inc, + link_with: lib, +) diff --git a/src/thread_pool/thread_pool.cpp b/src/thread_pool/thread_pool.cpp new file mode 100644 index 0000000..5de2b47 --- /dev/null +++ b/src/thread_pool/thread_pool.cpp @@ -0,0 +1,33 @@ +#include "thread_pool.hpp" + +namespace actfm +{ + thread_pool::thread_pool() + { + const auto thread_count = std::thread::hardware_concurrency(); + + try + { + for (auto i = 0u; i < thread_count; ++i) + pool.emplace_back(std::thread(&thread_pool::worker, this)); + } + catch (std::exception& e) + { + hack::log()(e.what()); + } + } + + thread_pool::~thread_pool() + { + done = true; + hack::log()("thread_pool completed"); + } + + void thread_pool::worker() + { + while (!done) + { + hack::log()("run thread"); + } + }; +} diff --git a/src/thread_pool/thread_pool.hpp b/src/thread_pool/thread_pool.hpp new file mode 100644 index 0000000..f1f98be --- /dev/null +++ b/src/thread_pool/thread_pool.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +#include "logger/logger.hpp" + +namespace actfm +{ + class thread_pool + { + using Pool = std::vector; + + public: + thread_pool(); + ~thread_pool(); + + private: + void worker(); + + private: + Pool pool; + bool done { false }; + }; +} diff --git a/src/threadsafe_queue.hpp b/src/threadsafe_queue.hpp new file mode 100644 index 0000000..e369c7d --- /dev/null +++ b/src/threadsafe_queue.hpp @@ -0,0 +1,15 @@ +#pragma once + +namespace actfm +{ + template + class threadsafe_queue + { + + private: + struct node + { + + }; + }; +} diff --git a/subprojects/gtest.wrap b/subprojects/gtest.wrap new file mode 100644 index 0000000..730de1a --- /dev/null +++ b/subprojects/gtest.wrap @@ -0,0 +1,15 @@ +[wrap-file] +directory = googletest-release-1.11.0 +source_url = https://github.com/google/googletest/archive/release-1.11.0.tar.gz +source_filename = gtest-1.11.0.tar.gz +source_hash = b4870bf121ff7795ba20d20bcdd8627b8e088f2d1dab299a031c1034eddc93d5 +patch_filename = gtest_1.11.0-2_patch.zip +patch_url = https://wrapdb.mesonbuild.com/v2/gtest_1.11.0-2/get_patch +patch_hash = 764530d812ac161c9eab02a8cfaec67c871fcfc5548e29fd3d488070913d4e94 + +[provide] +gtest = gtest_dep +gtest_main = gtest_main_dep +gmock = gmock_dep +gmock_main = gmock_main_dep + diff --git a/subprojects/hack.wrap b/subprojects/hack.wrap new file mode 100644 index 0000000..06d49f7 --- /dev/null +++ b/subprojects/hack.wrap @@ -0,0 +1,6 @@ +[wrap-git] +url = https://github.com/azchatlanin/hack.git +revision = master + +[provide] +hack = hack_dep diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 0000000..e69de29