예제 #1
0
void test_ctx_shutdown()
{
    int rc;
    
    //  Set up our context and sockets
    void *ctx = zmq_ctx_new ();
    assert (ctx);
    
    void *socket = zmq_socket (ctx, ZMQ_PULL);
    assert (socket);

    // Spawn a thread to receive on socket
    void *receiver_thread = zmq_threadstart (&receiver, socket);

    // Wait for thread to start up and block
    msleep (SETTLE_TIME);

    // Shutdown context, if we used destroy here we would deadlock.
    rc = zmq_ctx_shutdown (ctx);
    assert (rc == 0);

    // Wait for thread to finish
    zmq_threadclose (receiver_thread);

    // Close the socket.
    rc = zmq_close (socket);
    assert (rc == 0);

    // Destory the context, will now not hang as we have closed the socket.
    rc = zmq_ctx_destroy (ctx);
    assert (rc == 0);
}
예제 #2
0
void test_shutdown_during_pend ()
{
    // Connect first
    void *connect_socket = test_context_socket (ZMQ_PAIR);
    TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (connect_socket, "inproc://cbb"));

    zmq_ctx_shutdown (get_test_context ());

    // Cleanup
    test_context_socket_close (connect_socket);
}
void test_shutdown_during_pend ()
{
    void *ctx = zmq_ctx_new ();
    assert (ctx);

    // Connect first
    void *connectSocket = zmq_socket (ctx, ZMQ_PAIR);
    assert (connectSocket);
    int rc = zmq_connect (connectSocket, "inproc://cbb");
    assert (rc == 0);

    zmq_ctx_shutdown (ctx);

    // Cleanup
    rc = zmq_close (connectSocket);
    assert (rc == 0);

    rc = zmq_ctx_term (ctx);
    assert (rc == 0);
}
예제 #4
0
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    void **contextPtr;
    int coreAPIReturn;

    if (nrhs != 1) {
        mexErrMsgIdAndTxt("zmq:ctx_shutdown:invalidArgs",
                "Error: Only a context argument is accepted by this function.");
    }
    contextPtr = (void **) mxGetData(prhs[0]);
    coreAPIReturn = zmq_ctx_shutdown(*contextPtr);
    if (coreAPIReturn < 0) {
        switch (errno) {
            case EFAULT:
                mexErrMsgIdAndTxt("zmq:ctx_shutdown:invalidContext",
                        "Error: Invalid ZMQ Context.");
                break;
            default:
                mexErrMsgIdAndTxt("zmq:ctx_shutdown:unknownOops",
                        "Error: Something has gone very, very wrong. Unknown error.");
        }
    }
}
예제 #5
0
int main (void)
{
    setup_test_environment ();

    void *ctx = zmq_ctx_new ();
    assert (ctx);

    //  Create few sockets
    void *vent = zmq_socket (ctx, ZMQ_PUSH);
    assert (vent);
    int rc = zmq_bind (vent, "tcp://127.0.0.1:55556");
    assert (rc == 0);

    void *sink = zmq_socket (ctx, ZMQ_PULL);
    assert (sink);
    rc = zmq_connect (sink, "tcp://127.0.0.1:55556");
    assert (rc == 0);

    void *bowl = zmq_socket (ctx, ZMQ_PULL);
    assert (bowl);

    void *server = zmq_socket (ctx, ZMQ_SERVER);
    assert (server);
    rc = zmq_bind (server, "tcp://127.0.0.1:55557");
    assert (rc == 0);

    void *client = zmq_socket (ctx, ZMQ_CLIENT);
    assert (client);

    //  Set up poller
    void* poller = zmq_poller_new ();
    rc = zmq_poller_add_socket (poller, sink, sink);
    assert (rc == 0);
    
    //  Send a message
    char data[1] = {'H'};
    rc = zmq_send_const (vent, data, 1, 0);
    assert (rc == 1);

    //  We expect a message only on the sink
    zmq_poller_event_t event;
    rc = zmq_poller_wait (poller, &event, -1);
    assert (rc == 0);
    assert (event.socket == sink);
    assert (event.user_data == sink);
    rc = zmq_recv (sink, data, 1, 0);
    assert (rc == 1);
    
    //  Stop polling sink
    rc = zmq_poller_remove_socket (poller, sink);
    assert (rc == 0);

    //  Check we can poll an FD
    rc = zmq_connect (bowl, "tcp://127.0.0.1:55556");
    assert (rc == 0);

#if defined _WIN32
    SOCKET fd;
    size_t fd_size = sizeof (SOCKET);
#else 
    int fd;
    size_t fd_size = sizeof (int);
#endif

    rc = zmq_getsockopt (bowl, ZMQ_FD, &fd, &fd_size);
    assert (rc == 0);
    rc = zmq_poller_add_fd (poller, fd, bowl);
    assert (rc == 0);
    rc = zmq_poller_wait (poller, &event, 500);
    assert (rc == 0);
    assert (event.socket == NULL);
    assert (event.fd == fd);
    assert (event.user_data == bowl);
    zmq_poller_remove_fd (poller, fd);

    //  Polling on thread safe sockets
    zmq_poller_add_socket (poller, server, NULL);
    rc = zmq_connect (client, "tcp://127.0.0.1:55557");
    assert (rc == 0);
    rc = zmq_send_const (client, data, 1, 0);
    assert (rc == 1);
    rc = zmq_poller_wait (poller, &event, 500);
    assert (rc == 0);
    assert (event.socket == server);
    assert (event.user_data == NULL); 
    rc = zmq_recv (server, data, 1, 0);
    assert (rc == 1);     

    //  Destory poller, sockets and ctx
    rc = zmq_poller_close (poller);
    assert (rc == 0);
    rc = zmq_close (sink);
    assert (rc == 0);
    rc = zmq_close (vent);
    assert (rc == 0);
    rc = zmq_close (bowl);
    assert (rc == 0);
    rc = zmq_close (server);
    assert (rc == 0);
    rc = zmq_close (client);
    assert (rc == 0);
    rc = zmq_ctx_shutdown (ctx);
    assert (rc == 0);

    return 0;
}
예제 #6
0
void test_zmq_ctx_shutdown_null_fails ()
{
    int rc = zmq_ctx_shutdown (NULL);
    TEST_ASSERT_EQUAL_INT (-1, rc);
    TEST_ASSERT_EQUAL_INT (EFAULT, errno);
}