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); }
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); }
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."); } } }
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; }
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); }