2014年4月9日水曜日

release: libWRP-message // C++ intra-process messaging header-only library.

C++でプロセス内のオブジェクト間でメッセージングするためのヘッダーオンリーライブラリーをGitHubにて公開しました。em++-1.12、clang-3.2、g++-4.8に対応。

特徴は、メッセージングと言っても、intやdoubleやstd::stringなどと言った型のデータをメッセージングするのではなく、関数オブジェクトをメッセージングします。




[主なクラス]
  • message::message_t
    • メッセージ本体。評価ポリシー(async|sync)、メッセージが実行されるべきか判断するためのプレディケーターや、実行すべき関数オブジェクトを含んでいる。
  • message::sender_t
    •  メッセージを送信する機能send_message()メンバー関数をもった子。
  • message::reciever_t
    • メッセージを受信する機能を持った子。メッセージスプールを持っていて非同期実行ポリシーのメッセージは配送後、任意のタイミングで評価できる。
  • message::server_t
    • 複数のreciever_tたちを保持しておいて、自身が受け取ったメッセージをそれらに配送できる子。非同期実行ポリシーのメッセージは配送処理を任意のタイミングで行い、reciever_tたちは配送を受けたメッセージをそれぞれにまた任意のタイミングで評価できる。

[主な機能: 1. 直接配送]
  • message::sender_tを継承したオブジェクトはsender_t::send_message(reciever, ...)メンバー関数により特定のmessage::reciever_tを継承したオブジェクトに向けてメッセージを配送できます。
  • message::message_t型のオブジェクトには、
    • そのメッセージを受信したオブジェクトに評価させたいstd::function<void(const reciever_t*)>型の関数オブジェクトを保持できます。デフォルトでは何もしない関数オブジェクトがセットされます。
    • そのメッセージを受信したオブジェクトが関数オブジェクトを実行実行すべきか判断するstd::function<bool(const reciever_t* const)>型のプレディケーターを与えられます。デフォルトでは必ずtrueとなるプレディケーターがセットされます。
  • メッセージを送られたmessage:reciever_tを継承したオブジェクトはプレディケーターによりそのメッセージの関数オブジェクトを実行すべきかを評価し、プレディケーターがtrueの場合には、
    • メッセージの評価ポリシーmessage::message_t::launch_eの値に従って
      • launch_e::async値であればmessage::reciever_tの内蔵するメッセージスプールにメッセージを保持し、
      • launch_e::sync値であれば直ちにメッセージの関数オブジェクトを評価します。
  • message::reciever_tを継承したオブジェクトは、message::reciever_t::invoke_messages()メンバー関数により、内蔵するメッセージスプールにメッセージがあればそれらの関数オブジェクトを実際に評価します。
[主な機能: 2. サーバー中継配送]
  • message::server_t型は、
    • message_reciever_t型を継承しており、message::sender_tからのメッセージ配送の対称にできます。
    • message::server_t::contract_message_reciever()メンバー関数により、メッセージを受信したいmessage::reciever_tのstd::shared_ptrオブジェクトを受け取り、内部的にはstd::weak_ptr群として保持します。
      • 解除はmessage:server_t::dissolve_message_reciever()メンバー関数で行います。
    • message::sender_tからメッセージを送られると、
      • launch_e::async値が設定されたメッセージであれば、ひとまずサーバー自身のメッセージスプールに保持します。
      • launch_e::sync値が設定されたメッセージであれば即座に保持しているmessage::reciever_t群に対してメッセージのプレディケーターを評価し、trueならば関数オブジェクトを評価します。
    • message_server_t::invoke_messages()メンバー関数を呼ぶと、サーバーのスプールにあるメッセージ群に対してサーバーの保持するmessage::reciever_t群に対してプレディケーターを評価し、trueならばmessage::reciever_tのスプールへ配送します。
      • サーバーから配送されたlaunch_e::asyncのメッセージは直接配送の場合と同様に、受信したreciever_tのinvoke_messages()メンバー関数が呼ばれた時に実行されます。

0 件のコメント:

コメントを投稿