Hi Jiri,

In normal operation of the router, there is only one call to 'qd_router',
so I'm not sure we really need 'type_registered'.  That code has been there
from the very beginning so I don't think it was added to fix a particular
problem.  I think it could safely be removed.

-Ted

On Fri, Jul 16, 2021 at 5:56 AM Jiri Daněk <jda...@redhat.com> wrote:

> Hello folks
>
> ```
> static int type_registered = 0;
>
> qd_router_t *qd_router(qd_dispatch_t *qd, qd_router_mode_t mode, const char
> *area, const char *id)
> {
>     if (!type_registered) {
>         type_registered = 1;
>         qd_container_register_node_type(qd, &router_node);
>     }
> ```
>
> https://github.com/apache/qpid-dispatch/blob/d8800269d3a80225794be9914b5fc9f8d6118d04/src/router_node.c#L1623-L1630
>
> I'd like to understand the motivation behind this code better.
>
> Some parts of the codebase assume that there may be many qd_dispatch_t
> instances around, while others assume there is only one. There is the
> `dispatch` global variable in python_embedded.c, there is the global flag
> `type_registered` here, but the `qd_dispatch_t` pointer is usually passed
> through function argument (as if there could be more than one).
>
> Having this check for `type_registered` prevents me from stopping and
> freeing one instance of a router, then immediately starting another in the
> same process. I want to do this for testing purposes. What happens now is
> that the second router I start will not function correctly; deleting this
> type_registered logic makes it work right (as far as my tests so far are
> concerned).
>
> It seems to me that it should be perfectly ok to have multiple dispatch
> instances in the single process, as long as there is only one at a time.
> --
> Mit freundlichen Grüßen / Kind regards
> Jiri Daněk
>

Reply via email to