static void s_agent_task (void *args, zctx_t *ctx, void *control) { // Create agent instance as we start this task agent_t *self = s_agent_new (ctx, control); if (!self) // Interrupted return; // We always poll all three sockets zmq_pollitem_t pollitems [] = { { self->control, 0, ZMQ_POLLIN, 0 }, { self->router, 0, ZMQ_POLLIN, 0 }, { self->data, 0, ZMQ_POLLIN, 0 } }; while (!zctx_interrupted) { if (zmq_poll (pollitems, 3, -1) == -1) break; // Interrupted if (pollitems [0].revents & ZMQ_POLLIN) s_agent_handle_control (self); if (pollitems [1].revents & ZMQ_POLLIN) s_agent_handle_router (self); if (pollitems [2].revents & ZMQ_POLLIN) s_agent_handle_data (self); if (self->terminated) break; } // Done, free all agent resources s_agent_destroy (&self); }
static void s_agent_task (void *args, zctx_t *ctx, void *pipe) { // Create agent instance as we start this task agent_t *self = s_agent_new (ctx, pipe); if (!self) // Interrupted return; // We have three sockets, but poll third one only selectively zmq_pollitem_t pollitems [] = { { self->control, 0, ZMQ_POLLIN, 0 }, { self->dealer, 0, ZMQ_POLLIN, 0 }, { self->data, 0, ZMQ_POLLIN, 0 } }; while (!zctx_interrupted) { int pollsize = self->state == connected? 3: 2; if (zmq_poll (pollitems, pollsize, -1) == -1) break; // Interrupted if (pollitems [0].revents & ZMQ_POLLIN) s_agent_handle_control (self); if (pollitems [1].revents & ZMQ_POLLIN) s_agent_handle_dealer (self); if (pollitems [2].revents & ZMQ_POLLIN) s_agent_handle_data (self); if (self->state == terminated || self->state == exception) break; } // Done, free all agent resources s_agent_destroy (&self); }