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 <[email protected]> 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 < > [email protected]> 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 >> > [email protected] >> > http://lists.zeromq.org/mailman/listinfo/zeromq-dev >> >> _______________________________________________ >> zeromq-dev mailing list >> [email protected] >> http://lists.zeromq.org/mailman/listinfo/zeromq-dev >> > >
_______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
