On Fri, May 27, 2011 at 7:20 AM, Pavel Chlupáček <[email protected]> wrote:
> I just wonder if there is no any way how to force all sockets to close when > term() is called. So far it blocks indefinitely the calling thread, and I > wonder if there isn't any way to avoid that. > > I experimented a bit with linger opt, but did not get any visible result > from it. > > I am on scala (java bindings) so hope it is not specific to java. There is a long discussion about this. The upshot is that because 0MQ allows sockets to be migrated between threads, it cannot automatically close sockets at zmq_term time. In the CZMQ binding, I wrapped this up so that it does in fact close sockets automatically. This assumes there is no socket migration. I know the erlzmq binding does more or less the same, and it could be done in any language binding. The approach is to track all open sockets, and when the called wants to destroy the context, to (a) set LINGER on all sockets to some specific value, be it zero, 1 second, etc. and (b) close all sockets, and (c) call zmq_term. In any other thread that's using the same context, blocking calls will exit with ETERM, and those threads must then also do (a) and (b) in turn. This cannot be done by libzmq without breaking socket migration. It can be done in a language binding. If you were for instance to wrap CZMQ in Scala, you'd get that behaviour in Scala. -Pieter _______________________________________________ zeromq-dev mailing list [email protected] http://lists.zeromq.org/mailman/listinfo/zeromq-dev
