[zeromq-dev] zactor destroy sequence

Pieter Hintjens ph at imatix.com
Sun Nov 2 17:13:07 CET 2014


This is the relevant code from zactor (for POSIX):

static void *
s_thread_shim (void *args)
{
    assert (args);
    shim_t *shim = (shim_t *) args;
    shim->handler (shim->pipe, shim->args);
    //  Do not block, if the other end of the pipe is already deleted
    zsock_set_sndtimeo (shim->pipe, 0);
    zsock_signal (shim->pipe, 0);
    zsock_destroy (&shim->pipe);
    free (shim);
    return NULL;
}

On Sun, Nov 2, 2014 at 4:54 PM, Pieter Hintjens <ph at imatix.com> wrote:
> Like I said, the exit signal is sent by the wrapper inside zactor and
> not the actor itself. The echo actor was correct. (Otherwise the test
> case would not work).
>
> On Sun, Nov 2, 2014 at 1:11 PM, Arnaud Loonstra <arnaud at sphaero.org> wrote:
>> Then am I correct that the echo_actor example is not signaling the pipe
>> on exit while it should like this?
>>
>> static void
>> echo_actor (zsock_t *pipe, void *args)
>> {
>>      //  Do some initialization
>>      assert (streq ((char *) args, "Hello, World"));
>>      zsock_signal (pipe, 0);
>>
>>      bool terminated = false;
>>      while (!terminated) {
>>          zmsg_t *msg = zmsg_recv (pipe);
>>          if (!msg)
>>              break;              //  Interrupted
>>          char *command = zmsg_popstr (msg);
>>          //  All actors must handle $TERM in this way
>>          if (streq (command, "$TERM"))
>>              terminated = true;
>>          else
>>          //  This is an example command for our test actor
>>          if (streq (command, "ECHO"))
>>              zmsg_send (&msg, pipe);
>>          else {
>>              puts ("E: invalid message to actor");
>>              assert (false);
>>          }
>>          free (command);
>>          zmsg_destroy (&msg);
>>      }
>> +   // send signal to actor to confirm exit
>> +   zsock_signal (pipe, 0);
>> }
>>
>>
>> On 11/02/2014 12:41 PM, Pieter Hintjens wrote:
>>> If you send and wait without a timeout, it happens that the actor
>>> thread is gone, and its pair socket destroyed, before you get here.
>>> Then the calling thread blocks waiting for a reply that never arrives.
>>>
>>> The return signalling is done by the zactor wrapper, not the actor
>>> itself. This isn't entirely symmetrical, that's true.
>>>
>>> On Sat, Nov 1, 2014 at 10:18 PM, Arnaud Loonstra <arnaud at sphaero.org> wrote:
>>>> Hi all,
>>>>
>>>> I'm going through the zactor class to understand it better. I'm slightly
>>>> confused by the destroy sequence:
>>>>
>>>> At line 182 of zactor.c:
>>>>           //  Signal the actor to end and wait for the thread exit code
>>>>           //  If the pipe isn't connected any longer, assume child thread
>>>>           //  has already quit due to other reasons and don't collect the
>>>>           //  exit signal.
>>>>           zsock_set_sndtimeo (self->pipe, 0);
>>>>           if (zstr_send (self->pipe, "$TERM") == 0)
>>>>               zsock_wait (self->pipe);
>>>>           zsock_destroy (&self->pipe);
>>>>
>>>> So when destroy is called the actor method will receive the $TERM
>>>> command. The destroy sequence waits for a signal from the actor command.
>>>>
>>>> But why the == 0. Doesn't that mean that the zstr_send send 0 bytes thus
>>>> failed sending?
>>>>
>>>> Then the echo_actor example just sets: (line 268)
>>>>               terminated = true;
>>>> It nevers signals back.
>>>>
>>>> It does work that's why I'm confused about what's happening.
>>>> Can anybody turn the light on? :)
>>>>
>>>> Rg,
>>>>
>>>> Arnaud
>>>> --
>>>> w: http://www.sphaero.org
>>>> t: http://twitter.com/sphaero
>>>> g: http://github.com/sphaero
>>>> i: freenode: sphaero_z25
>>>> _______________________________________________
>>>> zeromq-dev mailing list
>>>> zeromq-dev at lists.zeromq.org
>>>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>> _______________________________________________
>>> zeromq-dev mailing list
>>> zeromq-dev at lists.zeromq.org
>>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>>
>>
>>
>> --
>> w: http://www.sphaero.org
>> t: http://twitter.com/sphaero
>> g: http://github.com/sphaero
>> i: freenode: sphaero_z25
>> _______________________________________________
>> zeromq-dev mailing list
>> zeromq-dev at lists.zeromq.org
>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev



More information about the zeromq-dev mailing list