So I have created pull request 603 to send a monitor event when monitor socket 
is closed: https://github.com/zeromq/libzmq/pull/603

Ric.





From:   [email protected]
To:     [email protected]
Date:   01/07/2013 09:46 AM
Subject:        [zeromq-dev] Aborting a thread monitoring a socket
Sent by:        [email protected]



Hi All,

Say I'm monitoring a socket using zmq_socket_monitor and have a monitor thread 
blocked on a zmq_recvmsg waiting for socket activity, is there a way to
abort the monitoring and unblock the socket other than closing the entire 
context?

I've tried calling zmq_socket_monitor again with a NULL address, that stops any 
more events going to the monitor socket but does not unblock it.

Maybe if we call zmq_socket_monitor on an already monitored socket it could 
send and event to the already connected monitor socket to indicate the
change?

Full example here:

#include <zmq.h>
#include <assert.h>
#include <cstring>
#include <pthread.h>
#include <unistd.h>

static void *req_socket_monitor (void *ctx)
{
    void *s = zmq_socket (ctx, ZMQ_PAIR);
    assert (s);

    int rc = zmq_connect (s, "inproc://monitor.req");
    assert (rc == 0);

    zmq_msg_t msg;
    zmq_msg_init (&msg);

    printf("Waiting for socket monitor activitiy\n");

    rc = zmq_recvmsg (s, &msg, 0);
    if (rc == -1 && zmq_errno() == ETERM)
    {
        printf("Monitor aborting\n");
    }
    else
    {
        assert (rc != -1);
        printf("Got activity\n");
    }

    zmq_close (s);
    return NULL;
}

int main(int argc, char* argv[])
{
    void* ctx = zmq_ctx_new();
    void* req = zmq_socket(ctx, ZMQ_REQ);

    int rc = zmq_socket_monitor (req, "inproc://monitor.req", ZMQ_EVENT_ALL);
    assert (rc == 0);

    printf("Spawning monitor thread\n");
    pthread_t thread;
    rc = pthread_create (&thread, NULL, req_socket_monitor, ctx);
    assert (rc == 0);

    sleep(1);

    printf("Aborting monitor thread\n");

    // What to do here to unblock monitor thread?
    rc = zmq_socket_monitor (req, NULL, ZMQ_EVENT_ALL);


    pthread_join(thread, NULL);
    printf("Monitor thread aborted\n");

    zmq_close(req);
    zmq_ctx_destroy(ctx);

    return 0;
}


Thanks,

Ric.


===========================================================
The information in this email is confidential, and is intended solely for the 
addressee(s).
Access to this email by anyone else is unauthorized and therefore prohibited.  
If you are
not the intended recipient you are notified that disclosing, copying, 
distributing or taking
any action in reliance on the contents of this information is strictly 
prohibited and may be unlawful.
===========================================================


===========================================================
The information in this email is confidential, and is intended solely for the 
addressee(s).
Access to this email by anyone else is unauthorized and therefore prohibited.  
If you are
not the intended recipient you are notified that disclosing, copying, 
distributing or taking
any action in reliance on the contents of this information is strictly 
prohibited and may be unlawful.
===========================================================_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev



===========================================================
The information in this email is confidential, and is intended solely for the 
addressee(s). 
Access to this email by anyone else is unauthorized and therefore prohibited.  
If you are 
not the intended recipient you are notified that disclosing, copying, 
distributing or taking 
any action in reliance on the contents of this information is strictly 
prohibited and may be unlawful.
===========================================================

<<inline: graycol.gif>>

_______________________________________________
zeromq-dev mailing list
[email protected]
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to