äœèšã£ãŠãã®ïŒ
SObjectizerãã¬ãŒã ã¯ãŒã¯ã®äœ¿çšæã«éçºè ãééããæãäžè¬çãªåé¡ã®1ã€ã¯ãéä¿¡ãããã¡ãã»ãŒãžãåä¿¡ããªãããšã§ãã ã€ãŸã ã¡ãã»ãŒãžã¯éä¿¡ãããŸããããåä¿¡è ã«ã¯å±ããŸããã§ããã ãªãã§ïŒ ããããããã¯èå³æ·±ã質åã§ãã
éä¿¡ãããã¡ãã»ãŒãžãåä¿¡è ã«å±ããªãäž»ãªçç±ã¯ããã€ããããŸãã
1.åä¿¡è ã¯ååšããŸããã ãã§ã«ååšããªãããååšããªãããšã¯éèŠã§ã¯ãããŸããã ã¬ã·ãŒããŒã¯ãsendãåŒã³åºããšãã«ååšããå¯èœæ§ããããŸãããsendãäœæ¥ãå®äºããåã§ãååšããªããªãå¯èœæ§ããããŸãã ãŸãã¯ãsendãåŒã³åºãããšã«ãããã¬ã·ãŒããŒã¯æ¢ã«ååšããŠãããšèããããŸãããå®éã«ã¯ãŸã äœæãããŠããŸããã
2.åä¿¡è ãã¡ãã»ãŒãžã賌èªããŸããã§ããã ããã¯ç¹å®ã®ã¡ãã»ãŒãžãšãã¹ãŠã賌èªããã®ãæãã«å¿ããŠããŸããã ã¡ãã»ãŒãžãéä¿¡ããããšãå¿ èŠãªãšãŒãžã§ã³ãã«ãé ä¿¡ãããŸããã 圌ã¯åã«ã¡ãã»ãŒãžã賌èªããŠããŸããã ãŸãã¯ããªãã·ã§ã³ãšããŠã誀ã£ãŠåä¿¡è ãå¥ã®ã¡ãŒã«ããã¯ã¹ããã®ã¡ãã»ãŒãžã«çœ²åããŸããã
3.åä¿¡è ãç®çã®ç¶æ ã®ã¡ãã»ãŒãžã賌èªããŠããŸããã ããšãã°ããšãŒãžã§ã³ãã¯ãã¡ãã»ãŒãžãåŠçããã3ã€ã®ç¶æ ãããããšãããããŸããã ãããããµãã¹ã¯ãªãã·ã§ã³ã¯2ã€ã®å·ã«å¯ŸããŠã®ã¿è¡ãããŸãããã3çªç®ã®å·ã«ã€ããŠã¯å¿ããŠããŸããã ã¡ãã»ãŒãžãå°çãããšãã«åä¿¡ãšãŒãžã§ã³ãããã®3çªç®ã®ç¶æ ã«ããå Žåãã¡ãã»ãŒãžã¯åä¿¡è ã«é ä¿¡ãããŸããã
ä»ã®çç±ããããŸããããããã¯æãäžè¬çã§ãã
ç§ãã¡ã®èŠ³å¯ã«ãããšãNoã2ãšNo. 3ã®çç±ãæãäžè¬çã§ãã ãããŠãSObjectizerã®åå¿è ãšçµéšè±å¯ãªãŠãŒã¶ãŒã®äž¡æ¹ããã®ã¬ãŒããæ»æããŠããŸãã SObjectizerã®éçºè ã§ããç§ãã¡èªèº«ã§ããããããã®æããªééããå®æçã«ç¯ããŸãã ããã¯ã©ãã§ããïŒ ã¯ããéåžžã«ç°¡åã§ãã
ãµãã¹ã¯ãªãã·ã§ã³ãæ£ãããªãåçŽãªäŸ
以äžã«ãPingerãšpongerã®ãšãŒãžã§ã³ããå ±éã®ãã«ããããã¥ãŒãµãŒ/ãã«ãã³ã³ã·ã¥ãŒãã¡ãŒã«ããã¯ã¹ãä»ããŠpingããã³pongä¿¡å·ã亀æããç°¡åãªäŸã®ã³ãŒãã瀺ããŸãã
#include <so_5/all.hpp> // , pinger ponger. struct ping final : public so_5::signal_t {}; struct pong final : public so_5::signal_t {}; // pinger, ping, ping pong. class pinger final : public so_5::agent_t { // , . const so_5::mbox_t mbox_; public: // . pinger(context_t ctx, so_5::mbox_t mbox) : so_5::agent_t{std::move(ctx)} , mbox_{std::move(mbox)} { // . so_subscribe(mbox_).event([this](mhood_t<pong>) { std::cout << "pong!" << std::endl; so_5::send<ping>(mbox_); }); } // ping. virtual void so_evt_start() override { so_5::send<ping>(mbox_); } }; // ponger, pong- ping-. class ponger final : public so_5::agent_t { // , . const so_5::mbox_t mbox_; public: // . ponger(context_t ctx, so_5::mbox_t mbox) : so_5::agent_t{std::move(ctx)} , mbox_{std::move(mbox)} { // . so_subscribe_self().event([this](mhood_t<ping>) { std::cout << "ping!" << std::endl; so_5::send<pong>(mbox_); }); } }; int main() { // SObjectizer . so_5::launch([](so_5::environment_t & env) { env.introduce_coop([](so_5::coop_t & coop) { // , . const auto mbox = coop.environment().create_mbox(); // . coop.make_agent<pinger>(mbox); coop.make_agent<ponger>(mbox); }); }); }
ãã®åçŽãªã³ãŒãã«ã¯å°ããªãšã©ãŒããããŸããããã¯ãäŸãå®è¡ãããšãã«ping / pongã¡ãã»ãŒãžã®å°å·ã衚瀺ãããªãããã§ãã ãããã誰ãããã§ã«äœãèµ·ãã£ãŠããã®ãç解ããŠããã®ã§ãããã ããããäžè¬çã«èšãã°ããã®ãããªè¿·æãªãšã©ãŒãæ€åºããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã ç¹ã«ãäŸã§ã¯ãªãå®éã®ãšãŒãžã§ã³ããæ±ãå Žåããã®ããžãã¯ãšå®è£ ã¯ã¯ããã«è€éã«ãªãå¯èœæ§ããããŸãã
ãã©ãã¯ããã¯ã¹å¹æãšããã«å¯ŸããŠäœããã¹ããïŒ
äžèšã®äŸã§ã¯ãSObjectizerãããã©ãã¯ããã¯ã¹ãã«ãªã£ãŠãããšããäºå®ã«çŽé¢ããŠããŸãã 圌ã«ããã€ãã®ã³ã³ãããŒã«ã¢ã¯ã·ã§ã³ãäžããŸãããå¿ èŠãªçµæã¯çºçããŸããã ãããããªãã§ããïŒ ãã®çç±ã¯äœã§ããïŒ ãã®çç±ã®äžçªäžã«å°éããã«ã¯ïŒ
ãããŠãããã§çç±ã®åºã«å°éããããšã¯ããã»ã©ç°¡åã§ã¯ãªãããšãããããŸãã å°ããªäŸããªããšãããŠãããã°ããå¿ èŠããããŸãããã©ã®ããã«ãããè¡ãã®ã§ããããïŒ
ãããã¬ã䜿çšããå Žåãããã€ãã®å Žæã«ãã¬ãŒã¯ãã€ã³ããèšå®ã§ããŸãã äŸïŒ
1. pingã®æåã®éä¿¡ãåŒã³åºãããããšã確èªããããã«ãpinger :: so_evt_startïŒïŒã¡ãœããã§ã
2.ãã³ã¬ãŒãšãŒãžã§ã³ãã®pingã·ã°ãã«ãã³ãã©ãŒã§ãæåã®pingãå°çããå¿çãšããŠãã³ãéä¿¡ãããããšã確èªããŸãã
ãŸãã¯ãç§ãã¡ãæ¬ç©ã®ããã°ã©ãã§ããããããã¬ã匱è«çšã§ãããšä¿¡ããŠããå Žåã¯ããããã®å Žæã«ãããã°ããªã³ããé 眮ã§ããŸãã
ãããã®ã¢ã¯ã·ã§ã³ãå®è¡ãããšãso_evt_startïŒïŒãåŒã³åºãããpingã®æåã®éä¿¡ãå®è¡ãããŸãããpongã®ãã³ãã©ãŒã¯åŒã³åºãããŸããã ãããããªãã§ããïŒ ã³ã³ã¹ãã©ã¯ã¿ãŒã§ãµãã¹ã¯ãªãã·ã§ã³ãäœæããŸãã...
ããã§ãSObjectizerã䜿çšããéçºè ã®çŽåã«ããããããã¡ãã»ãŒãžãé ä¿¡ãããæ¹æ³ãç解ããããã«SObjectizerã®å éšãã©ã®ããã«èŠãŸããïŒããšããçåãçããŸãã
質åã¯ç°¡åã§ã¯ãããŸããã ããã°ã©ããéä¿¡åŒã³åºããã«ãŒãã£ã³ã°ããããšã決å®ããå ŽåããŸããSObjectizerå®è£ ã®è©³çŽ°ã®ãžã£ã³ã°ã«ã«é¥ããããã楜ããããšã¯ã»ãšãã©ãããŸããïŒãã ããäžéšã®äººã¯èŠãŠãã²ã©ãããšã¯äœãèŠãªãã£ãããä¿¡ããïŒïŒã 第äºã«ããããŠæãéèŠãªããšãšããŠã圌ã¯ã¡ãã»ãŒãžé ä¿¡ã2ã€ã®éšåã§æ§æãããŠããããšãç解ããŸãã æåã®éšåã¯ããµãã¹ã¯ã©ã€ããŒã®èŠæ±ãã¥ãŒã«ã¡ãã»ãŒãžãé 眮ããããšã§ãã 2çªç®ã®éšåã¯ãç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã³ããã³ã¹ã§ãããç¹å®ã®ãã£ã¹ãããã£ã«ãã£ãŠãã¥ãŒããåé€ãããŸãã
ãããŠãæåã®éšåã§åé¡ãæããã«ãªã£ããã ããšãã°ãéçºè ã¯ãã¡ãã»ãŒãžã®ãµãã¹ã¯ã©ã€ããååšããªããããã¡ãã»ãŒãžã«å¯Ÿãããªã¯ãšã¹ããçæãããªãããšãããããŸãã ããããã¢ããªã±ãŒã·ã§ã³ã¯çæããããããã³ãã©ãŒãåŒã³åºãããªãã£ãå Žåãããã°ã©ããŒã¯SObjectizerã®å éšãããã«æ·±ãæãäžããå¿ èŠããããŸãã ãããŠã圌ã¯SObjectizerã«ç°ãªããã£ã¹ãããã£ããããããã€ãã¯éåžžã«å ·äœçã§ãä»ãšã¯ç°ãªãåäœããã次ã®ã¢ããªã±ãŒã·ã§ã³ããã¥ãŒããæœåºããã³åæãããå ŽæãèŠã€ããããšã¯ããã»ã©ç°¡åã§ã¯ãªãããšãããããŸãã
äžè¬ã«ã誰ãããããã¬ã䜿çšããŠSObjectizerã®ã¡ãã»ãŒãžé ä¿¡ã¡ã«ããºã ãå®è¡ãããå Žåããã®äººã¯å¹žéãç¥ãã ãã§ãã ç§ãã¡èªèº«ã¯ãã®ãããªåš¯æ¥œã®å€§ãã¡ã³ã§ã¯ãªãã®ã§ã
ããŠã代æ¿æ段ã¯ãããŸããïŒ
ãããŸãã ããã¯ã æ£åŒã«ã¯ã¡ãã»ãŒãžé ä¿¡ãã¬ãŒã¹ ïŒãŸãã¯ç°¡ç¥åã®ããmsg_tracingïŒ ãšåŒã°ããã¡ã«ããºã ã§ã ã 2幎ååã«SObjectizer-5ã«è¿œå ãããŸããã ããããããããã圌ã«ã€ããŠèããããšã®ãã人ã¯ã»ãšãã©ããªãã§ãããã
Msg_tracingã¡ã«ããºã
SObjectizerãèµ·åãããšãmsg_tracingã¡ã«ããºã ãæå¹ã«ã§ããŸãã æå¹ã«ãããšãSObjectizerã¯ã¡ãã»ãŒãžã®é ä¿¡ãšåŠçã®ããã»ã¹ã説æããããã¹ãã¡ãã»ãŒãžãçæããŸãã ãããã®ã¡ãã»ãŒãžã¯ãç¹å¥ãªãã¬ãŒãµãŒãªããžã§ã¯ãã«æž¡ãããŸãã ãã¬ãŒãµãŒã®ã¿ã¹ã¯ã¯ããã¬ãŒã¹ã¡ãã»ãŒãžãä¿åããããåŠçããããšã§ãã ãŠãŒã¶ãŒã¯ç¬èªã®ãã¬ãŒãµãŒãå®è£ ããããSObjectizerã®æ¢è£œãã¬ãŒãµãŒã®ããããã䜿çšã§ããŸãã
msg_tracingãå«ããããšã§äžèšã®äŸãå±éããäœãèµ·ãããèŠãŠã¿ãŸãããã ãããã£ãŠãmsg_tracingãæå¹ã«ããŠããã¹ãŠã®ãã¬ãŒã¹ã¡ãã»ãŒãžãæšæºåºåã«ãããããå¿ èŠãããããšã瀺ããŸãã
int main() { // SObjectizer . so_5::launch([](so_5::environment_t & env) { env.introduce_coop([](so_5::coop_t & coop) { // , . const auto mbox = coop.environment().create_mbox(); // . coop.make_agent<pinger>(mbox); coop.make_agent<ponger>(mbox); }); }, [](so_5::environment_params_t & params) { // . // . params.message_delivery_tracer(so_5::msg_tracing::std_cout_tracer()); }); }
å€æŽãããäŸãå®è¡ãã次ã®ãããªãã®ãååŸããŸãã
[tid = 13728] [mbox_id = 5] deliver_message.no_subscribers [msg_type = struct ping] [signal] [overlimit_deep = 1]
ãã®ãšã³ããªã¯ãdeliver_messageæäœãé²è¡äžã§ããããšã瀺ããŸãã åæã«ããã®ãããªèå¥åãæã€ã¡ãŒã«ããã¯ã¹ã«éä¿¡ãããpingä¿¡å·ã®ãµãã¹ã¯ã©ã€ããŒããªãç¶æ³ãçºèŠãããŸããã
ãã®ãããã¡ãã»ãŒãžã¯ã¡ãŒã«ããã¯ã¹ã«éä¿¡ãããŸããã誰ã賌èªããŠããŸããã ããããã©ã®ããã«ãç§ãã¡ã¯ãµãã¹ã¯ãªãã·ã§ã³ãããŸãããããã«ãããŸãïŒ
// . so_subscribe_self().event([this](mhood_t<ping>) { std::cout << "ping!" << std::endl; so_5::send<pong>(mbox_); });
ãããŠãããã§ã¯ããµãã¹ã¯ãªãã·ã§ã³ãè¡ã£ãããšã¯æ¢ã«ããããŸããããã®mboxã§ã¯ãŸã£ããããããŸããã so_subscribeïŒmbox_ïŒãåŒã³åºãå¿ èŠããããso_subscribe_selfïŒïŒãåŒã³åºããŸããã regularãŸããèŠåæ§ã§äœãããäžå¹žãªééãã msg_tracingã¡ã«ããºã ã«ããããããã¬ãŒãSObjectizerã®å éšã«çªå ¥ãããããšãªããåé¡ã«è¿ éã«å¯ŸåŠã§ããŸããã
msg_tracingã¯ãããã°ã¡ã«ããºã ã§ã
å¿ã«çããŠããã¹ãæãéèŠãªããšã¯ãmsg_tracingããããã°ã®ãã«ããŒã¡ã«ããºã ã§ããããšã§ãã SObjectizerã«åºã¥ããŠéçºãããã¢ããªã±ãŒã·ã§ã³ã®ãããã°ãéçºè ãæ¯æŽããããã«äœæãããŸããã
ç¹ã«ãmsg_tracingã«ã¯è¿œå ã®ãªãŒããŒãããã³ã¹ãããããã¡ãã»ãŒãžã®éåä¿¡ã³ã¹ããå€§å¹ ã«å¢å ããŸãã ãã®ãããmsg_tracingãæ瀺çã«æå¹ã«ããå¿ èŠããããŸããããã¯ãSObjectizerãèµ·åããåã«äžåºŠã ãå®è¡ãããŸãã msg_tracingãæå¹ã«ããŠSObjectizerãèµ·åããåŸãmsg_tracingãç¡å¹ã«ããããšã¯ã§ããŸããã ãã¹ãŠãéåžžã«æ·±å»ãªã®ã§ãSObjectizerå ã§msg_tracingããªã³ã«ãããšãè¿œå ã®ããŒã¿ãšè¿œå ã®ã³ãŒãã®äž¡æ¹ãå«ãä»ã®ããŒã¿æ§é ã䜿çšãããŸãã ãã®ãããSObjectizerå ã§ãmsg_tracingããªã³ã«ãªã£ãŠããå Žåãä»ã®mboxã¿ã€ããäœæãããŸãã
ãããã£ãŠãmsg_tracingã¯ãSObjectizerã¢ããªã±ãŒã·ã§ã³ããããã°ããããã®è£å©ããŒã«ãšèŠãªãå¿ èŠããããŸãã ãŸããæ¬çªç°å¢ã§åäœããå¿ èŠã®ããæ段ããã®åºç€ã®äžã«æ§ç¯ããªãã§ãã ããã
msg_tracingã¡ã«ããºã ã®çŸåšã®ç¶æ ïŒãã®æ¬ ç¹ãšå¯èœãªè§£æ±ºç
msg_tracingã¡ã«ããºã ã¯ã2015幎10æã«ããŒãžã§ã³5.5.9ã«è¿œå ãããŸããã ããã§ãããã®ã¡ã«ããºã èªäœã¯ãŸã åæ段éã«ããããšãæããã§ããã äœãããå§ããå¿ èŠããããŸãããå®éã«è©ŠããŠã¿ãŠãçµéšãç©ãã§ãã©ãã«é²ãã¹ãããç解ã§ããäœããæã«å ¥ããå¿ èŠããããŸããã
éå»ã«ãæ¢åã®msg_tracingã¡ã«ããºã ã«2ã€ã®é倧ãªèª€ç®/匱ç¹ã確èªãããŠããŸãã
ãã¬ãŒã¹ã¡ãã»ãŒãžãã£ã«ã¿ãªã³ã°ãªã
SObjectizerã®éå§æã«msg_tracingãæå¹ã«ãªã£ãŠããå ŽåãSObjectizerã¯ã¡ãã»ãŒãžé ä¿¡ã«é¢é£ãããã¹ãŠã®æäœã®ããã¹ããã¬ãŒã¹ã¡ãã»ãŒãžãäœæãããããã®ã¡ãã»ãŒãžããã¬ãŒãµãŒãªããžã§ã¯ãã«æž¡ããŸããã ããã¯ãmsg_tracingã䜿çšããŠå°ããªã¢ããªã±ãŒã·ã§ã³ãäŸããŸãã¯ãã¹ãããããã°ããå Žåã«ã¯åé¡ã«ãªããŸããã ããããæ°çŸäžã®ã¡ãã»ãŒãžã亀æããæ°çŸã®ãšãŒãžã§ã³ããå«ã倧èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§msg_tracingã䜿çšããããšãããšãããã¯åé¡ã§ãã ãªããªã ããã°ã©ããå¿ èŠãšããªããã¬ãŒã¹ã¡ãã»ãŒãžãäœããã®åœ¢ã§é€å€ããå¿ èŠããããããã¹ããã¬ãŒã¹ã¡ãã»ãŒãžã§ãããè¡ãã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã
ãããã£ãŠããã¬ãŒãµãŒã«éä¿¡ãããåã«ãã¬ãŒã¹ã¡ãã»ãŒãžããã£ã«ã¿ãŒåŠçããæ©èœããŠãŒã¶ãŒã«SObjectizerã«äžãããšãã話ãæã ãããŸããã ããã«ããã£ã«ã¿ãŒã¯æçµçã«åœ¢æãããããã¹ãã¡ãã»ãŒãžãåŠçããã®ã§ã¯ãªããããã¹ãã«å€æãããããŒã¿ãåŠçããå¿ èŠããããŸãã
ãã¬ãŒã¹ã¡ãã»ãŒãžã®ãããŒãå¶åŸ¡ããæ¹æ³ã¯ãããŸãã
æã ããããã¯ããããã¬ãŒã¹ã¡ãã»ãŒãžã§SObjectizerãå®è¡ããããæç¹ã§ãèå£ãéããŠãããã¬ãŒã¹ã¡ãã»ãŒãžããã¬ãŒãµãŒã«å ¥ãããã«ãããããšããããŸãã ãããŠããã¿ãããã·ã£ãããªããã
ãããã£ãŠãSObjectizerã®åäœäžã«msg_tracingã®ãªã³ãšãªããåãæ¿ããããšãã§ããäŒè©±ãæã ãããŸããã ããã§ã®é£ããã¯ãSObjectizerã®éå§æã«ãéçºè ãmsg_tracingã䜿çšããããšãæ¢ã«ç¥ã£ãŠããå¿ èŠãããããšã§ããã ãã®å ŽåãSObjectizerã¯ä»ã®ã¿ã€ãã®mbox-sãäœæããã¡ãã»ãŒãžé ä¿¡ã®ä»ã®æ¹æ³ã䜿çšããŸãïŒäœãèµ·ãã£ãŠãããããã¬ãŒã¹ããŸãïŒã
ããŒãžã§ã³5.5.22ã§äºå®ãããŠããmsg_tracingã®å€æŽ
å æ¥ãSObjectizerã®æ°ããããŒãžã§ã³ã®æåã®ã¢ã«ãã¡ãä¿®æ£ããŸããã msg_tracingã¡ã«ããºã ã®æ¡åŒµãå®è£ ããŸãã ãã¬ãŒã¹ã¡ãã»ãŒãžã®ãã£ã«ã¿ãŒã®æŠå¿µãè¿œå ãããŸããã
ãã£ã«ã¿ãŒã¯ãªãã·ã§ã³ã§ãã ãã£ã«ã¿ãŒãå²ãåœãŠãããŠããå ŽåãSObjectizerã¯ãããã¹ããã¬ãŒã¹ã¡ãã»ãŒãžãçæããåã«ãçŸåšã®ãã¬ãŒã¹ã¡ãã»ãŒãžã®ãããªãåŠçãèš±å¯ãããã©ãããæåã«ãã£ã«ã¿ãŒã«åãåãããŸãã ãã£ã«ã¿ã«ãã¯ããã§ããŸãããšè¡šç€ºãããŠããå Žåãããã¹ããã¬ãŒã¹ã¡ãã»ãŒãžãçæããããã¬ãŒãµãªããžã§ã¯ãã«éä¿¡ãããŸãã ãã£ã«ã¿ãŒããããããã§ããŸããããšçããå Žåããã¬ãŒã¹ã¡ãã»ãŒãžã¯çæããããã©ãã«ãè¡ããŸããã
ãã£ã«ã¿ãŒããªãå ŽåãSObjectizerã¯ä»¥åãšåæ§ã«æ©èœããŸããããã¹ããã¬ãŒã¹ã¡ãã»ãŒãžãçæããããã¬ãŒãµãŒãªããžã§ã¯ãã«éä¿¡ãããŸãã ã€ãŸã ããã°ã©ããŒããã£ã«ã¿ãŒã«ã€ããŠç¥ããªãå ŽåããŸãã¯ãã£ã«ã¿ãŒã䜿çšããããªãå Žåãmsg_tracingã¡ã«ããºã ã¯ä»¥åãšåæ§ã«åäœããŸãã
ããã«ãããŒãžã§ã³5.5.22ã®SObjectizerã§ã¯ãäœæ¥äžã«msg_tracingãã£ã«ã¿ãŒãèšå®ããã³åé€ã§ããŸãã
ããŒãžã§ã³5.5.22ã§ã®msg_tracingãã£ã«ã¿ãŒã®äœ¿çšäŸ
msg_tracingã¡ã«ããºã ã®æ°æ©èœã瀺ãããã«ã次ã®äŸãåãäžããŸãã ã»ãšãã©åãããã«æ©èœãã2ã€ã®ãšãŒãžã§ã³ãããããŸãã ãããã«ã¯3ã€ã®ç¶æ ããããŸãïŒæåã2çªç®ã3çªç®ã åç¶æ ã§ããšãŒãžã§ã³ãã¯2çš®é¡ã®ã¡ãã»ãŒãžã«å¿çããå¿ èŠããããŸãã change_stateã«åŸã£ãŠã次ã®ç¶æ ïŒã€ãŸãã1çªç®ãã2çªç®ã2çªç®ãã3çªç®ã3çªç®ãã1çªç®ïŒã«ç§»åããå¿ èŠããããŸãã ãã£ãã¯ã¡ãã»ãŒãžãå°çããå ŽåããšãŒãžã§ã³ãã¯ããã«å¿çããã ãã§ãã åå¿ãã©ããªããã¯éèŠã§ã¯ãããŸããã
1çªç®ãš2çªç®ã®ãšãŒãžã§ã³ãã®éãã¯ãæåã®ãšãŒãžã§ã³ããåç¶æ ã®ãã£ãã¯ã¡ãã»ãŒãžã«å¿çããããšã§ãã ãããã2çªç®ã®ç¶æ ã®ãã£ãã¯ã¡ãã»ãŒãžããµãã¹ã¯ã©ã€ããã2çªç®ã®ãšãŒãžã§ã³ãã¯å¿ããŠããŸããã ãããã£ãŠã2çªç®ã®ãšãŒãžã§ã³ãã¯ã2çªç®ã®ç¶æ ã«ãããšãã«ãã£ãã¯ã¡ãã»ãŒãžã倱ããŸãã msg_tracingã¡ã«ããºã ã䜿çšããŠæ€åºãããã®ã¯ããŸãã«ãããã®æ倱ã§ãã
ãããè¡ãã«ã¯ã次ã®åœ¢åŒã®ãã¬ãŒã¹ãã£ã«ã¿ãŒãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
// , // - . , // . so_environment().change_message_delivery_tracer_filter( so_5::msg_tracing::make_filter( [](const so_5::msg_tracing::trace_data_t & td) { // . const auto handler_ptr = td.event_handler_data_ptr(); if(handler_ptr) { // trace- . // , . if(nullptr == *handler_ptr) // . , // . Trace- . return true; } // trace-. return false; }));
ãã¶ãæãã§ããã ãããããããç解ããŠã¿ãŸãããã
change_message_delivery_tracer_filterïŒïŒã¡ãœããã䜿çšãããšãSObjectizerã®å®è¡äžã«ãã¬ãŒã¹ãã£ã«ã¿ãŒã亀æã§ããŸãã
ãã«ããŒé¢æ°make_filterã¯ãã©ã ãé¢æ°ããå¿ èŠãªSObjectizerã¿ã€ãã®ãªããžã§ã¯ããäœæããŸãã
å¯äžã®åŒæ°ã¯ããã®ã©ã ãé¢æ°ã«æž¡ãããŸã-trace_data_tã€ã³ã¿ãŒãã§ã€ã¹ãžã®ãªã³ã¯ããã®ã€ã³ã¿ãŒãã§ã€ã¹ããããã£ã«ã¿ãŒã¯ãã¬ãŒã¹ã¡ãã»ãŒãžã«é¢é£ããããŒã¿ãæœåºã§ããŸãã ãã®ç¹å®ã®å Žåãtrace_data_tãå¯äžã®event_handler_data_ptrïŒïŒã¡ãœãããšåŒã³ãŸãã ãã®ã¡ãœããã¯ããªãã·ã§ã³ã®<const event_handler_data *>ãè¿ããŸãã ãããã£ãŠããªãã·ã§ã³ã®å éšã¯ããã€ã³ã¿ã«ããããšããããªãããšãã§ããŸãã ãã€ã³ã¿ãŒããªãå Žåããã¬ãŒã¹ã¡ãã»ãŒãžã¯èå³æ·±ããã®ã§ã¯ãããŸããã ã¡ãã»ãŒãžãã³ãã©ã®æ€çŽ¢ã«ã¯é©çšãããŸããã ãã€ã³ã¿ãŒã¯ããããã«ã§ããå Žåãããã¯ãŸãã«ç§ãã¡ãåŸ ã£ãŠããã±ãŒã¹ã§ããSObjectizerã¯ã¡ãã»ãŒãžã®ãã³ãã©ãŒãèŠã€ããããšããŸããããäœãèŠã€ãããŸããã§ããã ãã®å Žåããã®å Žåã®ã¿ããã¬ãŒã¹ã¡ãã»ãŒãžãæå¹ã«ããŸãã
ãã®äŸãå®è¡ãããšãã³ã³ãœãŒã«ã«æ¬¡ã®ã¡ãã»ãŒãžãå®æçã«è¡šç€ºãããããšãããããŸãã
[tid = 11880] [agent_ptr = 0x23be91d7cb0] demand_handler_on_message.find_handler [mbox_id = 6] [msg_type = struct base :: tick] [signal] [state = second] [evt_handler = NONE] [tid = 11880] [agent_ptr = 0x23be91d7cb0] demand_handler_on_message.find_handler [mbox_id = 6] [msg_type = struct base :: tick] [signal] [state = second] [evt_handler = NONE] [tid = 11880] [agent_ptr = 0x23be91d7cb0] demand_handler_on_message.find_handler [mbox_id = 6] [msg_type = struct base :: tick] [signal] [state = second] [evt_handler = NONE] [tid = 11880] [agent_ptr = 0x23be91d7cb0] demand_handler_on_message.find_handler [mbox_id = 6] [msg_type = struct base :: tick] [signal] [state = second] [evt_handler = NONE]
ããã«ããããã¯å°å·ãããããå°å·ãããŸããã ããã¯ããã¬ãŒã¹ã¡ãã»ãŒãžã®ã¹ããªãŒã ãããªã³ããŸãã¯ããªããã«ããtrace_controllerãšãŒãžã§ã³ããããããã§ãã
èå³ã®ããæ¹ã®ããã«ãããã«å®å
šãªãµã³ãã«ã³ãŒãããããŸã
#include <so_5/all.hpp> // . class base : public so_5::agent_t { protected: // , // . struct tick final : public so_5::signal_t {}; // . struct change_state final : public so_5::signal_t {}; // , . state_t st_first{this, "first"}, st_second{this, "second"}, st_third{this, "third"}; // . , // . so_5::timer_id_t tick_timer_; so_5::timer_id_t change_state_timer_; public: base(context_t ctx) : so_5::agent_t{std::move(ctx)} {} // . virtual void so_define_agent() override { // . this >>= st_first; // change_state . st_first.event([this](mhood_t<change_state>) { this >>= st_second; }); st_second.event([this](mhood_t<change_state>) { this >>= st_third; }); st_third.event([this](mhood_t<change_state>) { this >>= st_first; }); } // , . virtual void so_evt_start() override { using namespace std::chrono_literals; // 250ms. change_state_timer_ = so_5::send_periodic<change_state>(*this, 250ms, 250ms); // tick. tick_timer_ = so_5::send_periodic<tick>(*this, 0ms, 100ms); } }; // , tick . class first_agent final : public base { public: using base::base; virtual void so_define_agent() override { base::so_define_agent(); // . so_subscribe_self() .in(st_first).in(st_second).in(st_third) .event([](mhood_t<tick>){}); } }; // , tick st_second. class second_agent final : public base { public: using base::base; virtual void so_define_agent() override { base::so_define_agent(); // . so_subscribe_self() .in(st_first).in(st_third) .event([](mhood_t<tick>){}); } }; // , "" "" // trace-. class trace_controller final : public so_5::agent_t { // /. struct on_off final : public so_5::signal_t {}; // , . state_t st_on{this}, st_off{this}; // on_off. so_5::timer_id_t timer_; public: trace_controller(context_t ctx) : so_5::agent_t{std::move(ctx)} { st_off.event([this](mhood_t<on_off>) { // . this >>= st_on; // , // - . , // . so_environment().change_message_delivery_tracer_filter( so_5::msg_tracing::make_filter( [](const so_5::msg_tracing::trace_data_t & td) { // . const auto handler_ptr = td.event_handler_data_ptr(); if(handler_ptr) { // trace- . // , . if(nullptr == *handler_ptr) // . , // . Trace- . return true; } // trace-. return false; })); }); st_on.event([this](mhood_t<on_off>) { // . this >>= st_off; // . so_environment().change_message_delivery_tracer_filter( // trace-. so_5::msg_tracing::make_disable_all_filter()); }); this >>= st_off; } virtual void so_evt_start() override { using namespace std::chrono_literals; timer_ = so_5::send_periodic<on_off>(*this, 0ms, 1500ms); } }; int main() { // SObjectizer . so_5::launch([](so_5::environment_t & env) { env.introduce_coop([](so_5::coop_t & coop) { // // first_agent second_agent. coop.make_agent<first_agent>(); coop.make_agent<second_agent>(); // , // trace-. coop.make_agent<trace_controller>(); }); }, [](so_5::environment_params_t & params) { // . // . params.message_delivery_tracer(so_5::msg_tracing::std_cout_tracer()); // trace- , . params.message_delivery_tracer_filter( so_5::msg_tracing::make_disable_all_filter()); }); }
çŸåšãtrace_data_tã§å©çšã§ãããã®ã¯äœã§ããïŒ
trace_data_tã€ã³ã¿ãŒãã§ã€ã¹ã¯çŸåšã次ã®ããã«å®çŸ©ãããŠããŸãã
class trace_data_t { ... public : // ID , . virtual optional<current_thread_id_t> tid() const noexcept = 0; // , . virtual optional<std::type_index> msg_type() const noexcept = 0; // , . virtual optional<msg_source_t> msg_source() const noexcept = 0; // -, . virtual optional<const agent_t *> agent() const noexcept = 0; // . virtual optional<message_or_signal_flag_t> message_or_signal() const noexcept = 0; // . virtual optional<message_instance_info_t> message_instance_info() const noexcept = 0; // . virtual optional<compound_action_description_t> compound_action() const noexcept = 0; // . // , // . virtual optional<const so_5::impl::event_handler_data_t *> event_handler_data_ptr() const noexcept = 0; };
ãã®ãã¹ãŠã®æ å ±ããã¬ãŒã¹ã¡ãã»ãŒãžã«åžžã«å©çšã§ãããšã¯éããªãããšãç¹ã«åŒ·èª¿ããå¿ èŠããããŸãã ããšãã°ããµãã¹ã¯ã©ã€ããŒéã§é ä¿¡ããããã«ã¡ãã»ãŒãžãã¡ãŒã«ããã¯ã¹ã«éä¿¡ãããå Žåãevent_handler_data_ptrïŒïŒã¯ç©ºã®ãªãã·ã§ã³ãè¿ããŸãã ã¡ãŒã«ããã¯ã¹ã«ãã®ã¿ã€ãã®ã¡ãã»ãŒãžãžã®ãµãã¹ã¯ã©ã€ããŒããªãå ŽåãagentïŒïŒã¡ãœããã¯ç©ºã®ãªãã·ã§ã³ãè¿ããŸãã
ãªãããããã¹ãŠèª¬æãããã®ã§ããïŒ
ãã®èšäºã¯ãèå³ã®ããéçºè ãSObjectizerã®æ¬¡ã®ããŒãžã§ã³ã§äœãåŸ ã£ãŠããããäºåã«ç¥ãããšãã§ããããã«ããããã«æžãããŸããããããã£ãŠã圌ãã¯ææ¡ãããã€ãããŒã·ã§ã³ã«æ £ããããããæããå¿ãæŽããäœãæ°ã«å ¥ããªãå Žåã¯ããã¡ã€ããè¡šçŸã§ããŸãïŒso-5.5.22-alpha1ãããŠã³ããŒãå¯èœãgithubã®ãã©ãŒãæŽæ°ãããŸããïŒïŒ
ãããã£ãŠãæçµããŒãžã§ã³5.5.22ãä¿®æ£ããåã«ãäœãã©ã®ããã«æ¹åãã¹ãããç解ããæ©äŒãåŸãããŸããããã¯ç§ãã¡ã«ãšã£ãŠéèŠã§ãããªããªããããŒãžã§ã³éã®äºææ§ãç¶æãããšãããããã¯ã«é£ã³ã€ããŠããããã®éåžžã«äºææ§ãå£ããããªãããã§ãã
ã ãã誰ãããã®ãããã¯ã«èå³ããããªããã³ã¡ã³ãã§è©±ããŠãã ãããèšèšäžã®èæ ®äºé ã«è³ãåŸããŸãã
PSããã®èšäºã§äœ¿çšãããŠããäŸã¯ããã®ãªããžããªã«ãããŸãã
PPS ãŸããããŒãžã§ã³5.5.22ã§ã¯ãã€ãã³ããã³ãã©ãŒã®æéã«é¢ããçµ±èšãåéããããé«åºŠãªããŒãžã§ã³ãäœæããèšç»ããããŸããããã ãããã®ãããã¯ã«é¢ããè¿œå ã®ãã£ãŒãããã¯ãåŸãããªãå Žåããã®ã¿ã¹ã¯ã®åªå 床ã¯äœããªããã»ãšãã©ã®å ŽåããªãªãŒã¹5.5.22ã«ã¯ãªããŸããã