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 <arn...@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@lists.zeromq.org
>> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev@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@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to