/* send 100 messages over PAIR sockets * sender in one event handler, receiver in another */ void test_ev_zmq (void) { struct ev_loop *loop; void *zctx; void *zin, *zout; int i; ev_zmq win, wout; ok ((loop = ev_loop_new (EVFLAG_AUTO)) != NULL, "ev_loop_new works"); ok ((zctx = zmq_init (1)) != NULL, "initialized zmq context"); ok ((zout = zmq_socket (zctx, ZMQ_PAIR)) != NULL && zmq_bind (zout, "inproc://eventloop_test") == 0, "PAIR socket bind ok"); ok ((zin = zmq_socket (zctx, ZMQ_PAIR)) != NULL && zmq_connect (zin, "inproc://eventloop_test") == 0, "PAIR socket connect ok"); i = 0; ev_zmq_init (&win, zsock_rx_cb, zin, EV_READ); win.data = &i; ev_zmq_init (&wout, zsock_tx_cb, zout, EV_WRITE); ev_zmq_start (loop, &win); ev_zmq_start (loop, &wout); ok (ev_run (loop, 0) == 0, "both watchers removed themselves and ev_run exited"); ev_zmq_stop (loop, &win); ev_zmq_stop (loop, &wout); cmp_ok (i, "==", 100, "ev_zmq handler ran 100 times"); ev_loop_destroy (loop); zmq_close (zin); zmq_close (zout); zmq_ctx_destroy (zctx); }
flux_watcher_t *flux_zmq_watcher_create (flux_reactor_t *r, void *zsock, int events, flux_watcher_f cb, void *arg) { struct watcher_ops ops = { .start = zmq_start, .stop = zmq_stop, .destroy = zmq_destroy, }; ev_zmq *zw = xzmalloc (sizeof (*zw)); flux_watcher_t *w; ev_zmq_init (zw, zmq_cb, zsock, events_to_libev (events) & ~EV_ERROR); w = flux_watcher_create (r, zw, ops, ZMQ_SIG, cb, arg); zw->data = w; return w; }