Giter Site home page Giter Site logo

Comments (3)

eao197 avatar eao197 commented on May 21, 2024 1

No, named dispatchers were a part of SObjectizer up to v.5.5 but were deprecated and removed in v.5.6.

It is because in practice they were not as useful as expected.

The main problem is that every dispatcher can have its own unique interface and the binding of an agent to a dispatcher can require different parameters. You can compare an interface of disp_handle of one_thread, active_group, or so5extra's asio_thread_pool dispatchers.

This situation is completely different from the case of mboxes where each mbox implements the same interface.

Anyway, if you have a case where you want to have a dictionary of similar dispatchers (or wrap different dispatchers under the same unified interface) you can implement such a dictionary by yourself and attach that dispatcher to SObjectizer's Environment as a layer. Unfortunately, there is no example of custom layers in the standard SObjectizer's examples, but there are some unit-tests for layres.

The basic idea is:

class disp_binder_dictionary_layer_t : public so_5::layer_t
{
   using map_t = std::map<std::string, so_5::disp_binder_shptr_t, std::less<>>;

   std::mutex m_lock;
   map_t m_dict;

public:
   // There is no need to override start()/shutdown()/wait() methods
   // because the basic implementation does nothing.

   void add(std::string name, so_5::disp_binder_shptr_t binder)
   {
      std::lock_guard l{m_lock};
      auto [it, inserted] = m_dict.emplace(std::move(name), std::move(binder));
      if(!inserted)
         throw std::runtime_error(name + ": is not unique name");
   }

   std::optional<so_5::disp_binder_shptr_t>
   try_get(std::string_view name) noexcept
   {
      std::lock_guard l{m_lock};
      if(const auto it = m_dict.find(name); it != m_dict.end())
         return { it->second };
      else
         return std::nullopt;
   }

   so_5::disp_binder_shptr_t
   get(std::string_view name)
   {
      auto r = try_get(name);
      if(!r) throw std::runtime_error("binder is not found");
      return std::move(*r);
   }
};
...
so_5::launch([](so_5::environment_t & env) {...},
   [](so_5::environment_params_t & params) {
      params.add_layer(std::make_unique<disp_binder_dictionary_layer_t>());
      ...
   });
...
// Somewhere inside your application code:
so_environment().query_layer<disp_binder_dictionary_layer_t>()->add("my_disp", ...);
...
so_environment().introduce_coop(
   so_environment().query_layer<disp_binder_dictionary_layer_t>()->get("my_disp"),
   ...);

from sobjectizer.

zamazan4ik avatar zamazan4ik commented on May 21, 2024

Got it. Thank you a lot. Will be fine, if you add an example with SObjectizer layers to the official examples. But for me your answer is enough.

I think I can close it.

from sobjectizer.

zamazan4ik avatar zamazan4ik commented on May 21, 2024

By the way, if anyone else will use in the future the example above, you should fix one thing - use-after-move in add method: variable name is moved into distionary and then used during exaception message building. Be careful with that (catched with Clang-Tidy btw).

from sobjectizer.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.