void nn_req_init (struct nn_req *self, const struct nn_sockbase_vfptr *vfptr, void *hint) { nn_req_handle hndl; nn_xreq_init (&self->xreq, vfptr, hint); nn_fsm_init_root (&self->fsm, nn_req_handler, nn_req_shutdown, nn_sockbase_getctx (&self->xreq.sockbase)); self->state = NN_REQ_STATE_IDLE; /* Start assigning request IDs beginning with a random number. This way there should be no key clashes even if the executable is re-started. */ nn_random_generate (&self->lastid, sizeof (self->lastid)); self->task.sent_to = NULL; nn_msg_init (&self->task.request, 0); nn_msg_init (&self->task.reply, 0); nn_timer_init (&self->task.timer, NN_REQ_SRC_RESEND_TIMER, &self->fsm); self->resend_ivl = NN_REQ_DEFAULT_RESEND_IVL; /* For now, handle is empty. */ memset (&hndl, 0, sizeof (hndl)); nn_task_init (&self->task, self->lastid, hndl); /* Start the state machine. */ nn_fsm_start (&self->fsm); }
static int nn_xreq_create (void *hint, struct nn_sockbase **sockbase) { struct nn_xreq *self; self = nn_alloc (sizeof (struct nn_xreq), "socket (xreq)"); alloc_assert (self); nn_xreq_init (self, &nn_xreq_sockbase_vfptr, hint); *sockbase = &self->sockbase; return 0; }
static int nn_req_init (struct nn_req *self, const struct nn_sockbase_vfptr *vfptr) { int rc; rc = nn_xreq_init (&self->xreq, vfptr); if (rc < 0) return rc; self->sink = &nn_req_sink; /* Start assigning request IDs beginning with a random number. This way there should be no key clashes even if the executable is re-started. */ nn_random_generate (&self->reqid, sizeof (self->reqid)); self->state = NN_REQ_STATE_IDLE; self->resend_ivl = NN_REQ_DEFAULT_RESEND_IVL; nn_timer_init (&self->resend_timer, &self->sink, nn_sockbase_getcp (&self->xreq.sockbase)); return 0; }