[zeromq-dev] libevent + ZMQ_FD fail!

kasicass kasicass at gmail.com
Thu Dec 16 11:31:44 CET 2010


On 2010-12-6 16:48, Martin Sustrik wrote:
> Hi,
>
>> zmq 2.1.0, ZMQ_FD bug
>>      pull = zmq_bind(), push = zmq_connect(), libevent + pull, ok!
>>      push = zmq_bind(), pull = zmq_connect(), libevent + pull, fail!
>
> What does "fail" main?
>
>> example:
>> https://github.com/kasicass/kasicass/blob/master/zmq/test.c
>
> Can you provide a minimal test case?
>
> Martin

hi Martin,

Here is the detailed description of the problem I encountered. Is it a bug?

//// main thread (ok version) ////
pull = zmq_socket(ZMQ_PULL)
zmq_bind(pull)

push = zmq_socket(ZMQ_PUSH)
zmq_connect(push)
   -> zmq::socket_base_t::connect()
      -> send_bind()                 // send 'bind' to pull.mailbox

start thread 2

sleep(1)
while (1)
{
     zmq_send(push);
}

//// thread 2 ////
fd = zmq_getsockopt(pull, ZMQ_FD);

while (1)
{
     select(fd for read);
     zmq_getsockopt(pull, ZMQ_EVENTS);
     while (1) zmq_recv(pull, ZMQ_NOBLOCK);
}

// ======== sequence chart ========
//
// thread 2 (first loop):
//   select(fd for read);                                     // got 
'bind' message
//   zmq_getsockopt(pull, ZMQ_EVENTS);  // socket_base_t::process_commands()
//                                                                      
   //  -> pull attach
//                                                                      
   // pull_t::xhas_in()
//                                                                      
   //  -> fq_t::has_in()
//                                                                     
    //     -> ypipe_t::check_read()
//                                                                        //        
-> c.cas (&queue.front (), NULL);    // c = NULL
//   zmq_recv(pull, ZMQ_NOBLOCK);           // do nothing, goto to 
select() again
//
// main thread:
//   zmq_send(push);        // push_t::xsend()
//                                         //  -> lb_t::send()
//                                         //     -> ypipe_t::flush()
//                                         //        -> c.cas (w, f) != w
//                                         //           
(Compare-and-swap was unseccessful because 'c' is NULL.)
//                                         //     -> send 
'activate_reader' to pull.mailbox
//
// second loop:
//   select(fd for read);                                     // got 
'activate_reader' message
//   zmq_getsockopt(pull, ZMQ_EVENTS);  // socket_base_t::process_commands()
//                                                                    
     //  -> fq_t::activated()
//                                                                      
   // pull_t::xhas_in() / set 'ZMQ_POLLIN'
//   zmq_recv(pull, ZMQ_NOBLOCK);           // consuming all zmq_msg_t


-----------------------------------------------------------------------------

//// main thread (fail version) ////
push = zmq_socket(ZMQ_PUSH)
zmq_bind(push)

pull = zmq_socket(ZMQ_PULL)
zmq_connect(pull)
   -> zmq::socket_base_t::connect()
      -> send_bind()                 // send 'bind' to push.mailbox

start thread 2

sleep(1);
while (1)
{
     zmq_send(push);             // consume the 'bind' message
}

//// thread 2 ////
fd = zmq_getsockopt(pull, ZMQ_FD);

while (1)
{
     select(fd for read);
     zmq_getsockopt(pull, ZMQ_EVENTS);
     while (1) zmq_recv(pull, ZMQ_NOBLOCK);
}


// ======== sequence chart ========
//
// main thread:
//   zmq_send(push);       // push_t::xsend()
//                                        //  -> lb_t::send()
//                                        //     -> ypipe_t::flush()
//                                        //        -> c.cas (w, f) != w
//                                        //           (Compare-and-swap 
was unseccessful because 'c' is NULL.)
//                                        //           (no 
'activate_reader' to pull.mailbox)
//
// thread 2 (first loop):
//   select(fd for read);     // block here, as no 'activate_reader' message
//   ...

-- 
Kasicass, coder at work




More information about the zeromq-dev mailing list