[zeromq-dev] PUB/SUB assert(get_load () == 0) in zmq_ctx_destroy
Edwin van den Oetelaar
edwin at oetelaar.com
Tue Jul 1 12:58:24 CEST 2014
Sorry about that, I think I spoke too soon.
It looks like your zcontext is a reference after all.
Greetings,
Edwin
On Tue, Jul 1, 2014 at 12:54 PM, Edwin van den Oetelaar <edwin at oetelaar.com>
wrote:
> Hello Martin,
>
> in your code
> zmq_ctx_destroy (& zcontext);
>
> needs a reference.
>
> or like this:
>
> void *context = zmq_ctx_new ();
> zmq_ctx_destroy (context);
>
> Good luck,
> Edwin van den Oetelaar
>
>
> On Tue, Jul 1, 2014 at 12:45 PM, Martin Townsend <
> martin.townsend at xsilon.com> wrote:
>
>> Apologies I forgot to say that I'm using v4.0.4 with epoll.
>>
>> On 01/07/14 11:44, Martin Townsend wrote:
>> > Hi,
>> >
>> > I'm getting an assert when trying to gracefully exit
>> >
>> > At the bottom of the mail is my pthread code that handles subscribing in
>> > a pub/sub model and reads power values. On SIGINT and SIGTERM it sets
>> > quit to 1 and the thread exits but I get an exception on the call to
>> > zmq_ctx_destroy (zcontext);
>> >
>> > Assertion failed: get_load () == 0 (poller_base.cpp:31)
>> > Thread [2] (Suspended: Signal 'SIGABRT' received. Description: Aborted.)
>> > 15 __GI_raise() raise.c:56 0x482c9ff4
>> > 14 __GI_abort() abort.c:89 0x482ce4d0
>> > 13 zmq::zmq_abort() err.cpp:74 0x4803c558
>> > 12 zmq::poller_base_t::~poller_base_t() poller_base.cpp:31
>> 0x480519d4
>> > 11 zmq::epoll_t::~epoll_t() epoll.cpp:42 0x4803b8f8
>> > 10 zmq::epoll_t::~epoll_t() epoll.cpp:50 0x4803b930
>> > 9 zmq::io_thread_t::~io_thread_t() io_thread.cpp:39 0x4803d2f0
>> > 8 zmq::io_thread_t::~io_thread_t() io_thread.cpp:40 0x4803d3ac
>> > 7 zmq::ctx_t::~ctx_t() ctx.cpp:82 0x48033a9c
>> > 6 zmq::ctx_t::terminate() ctx.cpp:153 0x480367d4
>> > 5 zmq_ctx_term() zmq.cpp:171 0x4806f13c
>> > 4 zmq_ctx_destroy() zmq.cpp:241 0x4806f3e0
>> > 3 zsub_thread() xcoapd.c:470 0x10002b9c
>> > 2 start_thread() pthread_create.c:314 0x48095180
>> > 1 clone() clone.S:65 0x48383e88
>> >
>> > Am I doing anything incorrect below? If I put a sleep(4) before
>> > destroying the context I don't get the assert so I'm suspecting a race
>> > condition somewhere. I'm running on a 100MHz Microblaze.
>> >
>> > /* ZeroMq Subscriber task */
>> > static void * zsub_thread(void * arg) {
>> > int rc;
>> >
>> > zcontext = zmq_ctx_new ();
>> > zmq_ctx_set (zcontext, ZMQ_MAX_SOCKETS, 256);
>> > int max_sockets = zmq_ctx_get (zcontext, ZMQ_MAX_SOCKETS); assert
>> > (max_sockets == 256);
>> >
>> > subscriber = zmq_socket (zcontext, ZMQ_SUB);
>> > printf("Subscribing\n");
>> > rc = zmq_connect (subscriber, "ipc://xpwrd.ipc");
>> > assert (rc == 0);
>> > // Subscribe to zipcode, default is NYC, 10001
>> > char *filter = "Pwr";
>> > rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, filter, strlen
>> > (filter));
>> >
>> >
>> > while(!quit) {
>> > char buf[32];
>> > char *s;
>> > int unknown_err_count;
>> > zmq_pollitem_t items [] = {
>> > { subscriber, 0, ZMQ_POLLIN, 0 }
>> > };
>> >
>> > rc = zmq_poll (items, 1, 1000);
>> > if(rc == 1) {
>> > /* As we only have one poll item we can safely call recv
>> on
>> > this */
>> > unknown_err_count = 0;
>> > s = s_recv (subscriber, buf, sizeof(buf));
>> > if(s)
>> > sscanf(s, "Pwr:%04dW T:%dC", &pwr, &temp);
>> >
>> > printf("Pwr:%04dW T:%dC\n", pwr, temp);
>> > } else if(rc == 0) {
>> > unknown_err_count = 0;
>> > printf("Poller Timed out\n");
>> > } else {
>> > /* error */
>> > if(errno == ETERM) {
>> > printf("Poller has detected that socket was
>> terminated\n");
>> > break;
>> > } else if(errno == EFAULT) {
>> > printf("zmq_poll has invalid parameters!!!!\n");
>> > break;
>> > } else if(errno != EINTR) {
>> > /* Ignore EINTR as we will just poll again on next
>> > iteration of
>> > * loop, all other errors are undocumented in zmq so
>> > print a
>> > * message and set a flag and if it occurs 3 times
>> exit
>> > loop */
>> > printf("Poller returned unknown error %d", errno);
>> > printf("%s\n", strerror(errno));
>> > unknown_err_count++;
>> > if(unknown_err_count == 3) {
>> > break;
>> > }
>> > }
>> > }
>> > }
>> >
>> > printf("Subscriber thread closed\n");
>> > zmq_close (subscriber);
>> > zmq_ctx_destroy (zcontext);
>> >
>> > return (void *)0;
>> > }
>> >
>> >
>> > Best Regards,
>> > Martin.
>> >
>> > _______________________________________________
>> > 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
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.zeromq.org/pipermail/zeromq-dev/attachments/20140701/3b81bf93/attachment.htm>
More information about the zeromq-dev
mailing list