static void nn_cinproc_connect (struct nn_ins_item *self, struct nn_ins_item *peer) { struct nn_cinproc *cinproc; struct nn_binproc *binproc; struct nn_sinproc *sinproc; cinproc = nn_cont (self, struct nn_cinproc, item); binproc = nn_cont (peer, struct nn_binproc, item); nn_assert_state (cinproc, NN_CINPROC_STATE_ACTIVE); sinproc = nn_alloc (sizeof (struct nn_sinproc), "sinproc"); alloc_assert (sinproc); nn_sinproc_init (sinproc, NN_CINPROC_SRC_SINPROC, cinproc->item.ep, &cinproc->fsm); nn_list_insert (&cinproc->sinprocs, &sinproc->item, nn_list_end (&cinproc->sinprocs)); nn_sinproc_connect (sinproc, &binproc->fsm); nn_ep_stat_increment (cinproc->item.ep, NN_STAT_INPROGRESS_CONNECTIONS, -1); nn_ep_stat_increment (cinproc->item.ep, NN_STAT_ESTABLISHED_CONNECTIONS, 1); }
void nn_binproc_connect (struct nn_binproc *self, struct nn_cinproc *peer) { struct nn_sinproc *sinproc; nn_assert (self->state == NN_BINPROC_STATE_ACTIVE); sinproc = nn_alloc (sizeof (struct nn_sinproc), "sinproc"); alloc_assert (sinproc); nn_sinproc_init (sinproc, NN_BINPROC_SRC_SINPROC, &self->epbase, &self->fsm); nn_list_insert (&self->sinprocs, &sinproc->item, nn_list_end (&self->sinprocs)); nn_sinproc_connect (sinproc, &peer->fsm); }
static void nn_binproc_connect (struct nn_ins_item *self, struct nn_ins_item *peer) { struct nn_binproc *binproc; struct nn_cinproc *cinproc; struct nn_sinproc *sinproc; binproc = nn_cont (self, struct nn_binproc, item); cinproc = nn_cont (peer, struct nn_cinproc, item); nn_assert (binproc->state == NN_BINPROC_STATE_ACTIVE); sinproc = nn_alloc (sizeof (struct nn_sinproc), "sinproc"); alloc_assert (sinproc); nn_sinproc_init (sinproc, NN_BINPROC_SRC_SINPROC, &binproc->item.epbase, &binproc->fsm); nn_list_insert (&binproc->sinprocs, &sinproc->item, nn_list_end (&binproc->sinprocs)); nn_sinproc_connect (sinproc, &cinproc->fsm); }
int nn_cinproc_create (void *hint, struct nn_epbase **epbase) { struct nn_cinproc *self; self = nn_alloc (sizeof (struct nn_cinproc), "cinproc"); alloc_assert (self); nn_ins_item_init (&self->item, &nn_cinproc_vfptr, hint); nn_fsm_init_root (&self->fsm, nn_cinproc_handler, nn_cinproc_shutdown, nn_epbase_getctx (&self->item.epbase)); self->state = NN_CINPROC_STATE_IDLE; nn_sinproc_init (&self->sinproc, NN_CINPROC_SRC_SINPROC, &self->item.epbase, &self->fsm); /* Start the state machine. */ nn_fsm_start (&self->fsm); /* Register the inproc endpoint into a global repository. */ nn_ins_connect (&self->item, nn_cinproc_connect); *epbase = &self->item.epbase; return 0; }