static void s_service_dispatch (service_t *self) { // for each message, check regexp and dispatch if possible if (zlistx_size (self->offers)) { mlm_msg_t *message = mlm_msgq_first (self->queue); while (message) { mlm_msg_link(message); if (s_service_dispatch_message (self, message)) mlm_msgq_dequeue_cursor (self->queue); mlm_msg_unlink(&message); message = mlm_msgq_next (self->queue); } } }
static int s_stream_engine_handle_message (stream_engine_t *self) { void *sender; mlm_msg_t *msg; zsock_brecv (self->msgpipe, "pp", &sender, &msg); selector_t *selector = (selector_t *) zlistx_first (self->selectors); while (selector) { if (zrex_matches (selector->rex, mlm_msg_subject (msg))) { void *client = zlistx_first (selector->clients); while (client) { if (client != sender) zsock_bsend (self->msgpipe, "pp", client, mlm_msg_link (msg)); client = zlistx_next (selector->clients); } } selector = (selector_t *) zlistx_next (self->selectors); } mlm_msg_unlink (&msg); return 0; }
int mlm_msg_test (bool verbose) { printf (" * mlm_msg: "); // @selftest // Simple create/destroy test mlm_msg_t *self = mlm_msg_new ( "sender", "address", "subject", "tracker", 0, zmsg_new ()); assert (self); mlm_msg_destroy (&self); // Test reference counting self = mlm_msg_new ( "sender", "address", "subject", "tracker", 0, zmsg_new ()); mlm_msg_t *copy = mlm_msg_link (self); mlm_msg_unlink (©); mlm_msg_unlink (&self); // @end printf ("OK\n"); return 0; }