subscriber_t *memstore_ipc_subscriber_create(ngx_int_t originator_slot, ngx_str_t *chid, void* foreign_chanhead) { sub_data_t *d; d = ngx_alloc(sizeof(*d), ngx_cycle->log); if(d == NULL) { ERR("couldn't allocate memstore subscriber data"); return NULL; } assert(originator_slot != memstore_slot()); subscriber_t *sub = internal_subscriber_create("memstore-ipc", d); internal_subscriber_set_enqueue_handler(sub, (callback_pt )sub_enqueue); internal_subscriber_set_dequeue_handler(sub, (callback_pt )sub_dequeue); internal_subscriber_set_respond_message_handler(sub, (callback_pt )sub_respond_message); internal_subscriber_set_respond_status_handler(sub, (callback_pt )sub_respond_status); sub->destroy_after_dequeue = 1; d->sub = sub; d->chid = chid; d->originator = originator_slot; assert(foreign_chanhead != NULL); d->foreign_chanhead = foreign_chanhead; d->owner = memstore_slot(); ngx_memzero(&d->timeout_ev, sizeof(d->timeout_ev)); d->timeout_ev.handler = timeout_ev_handler; d->timeout_ev.data = d; d->timeout_ev.log = ngx_cycle->log; reset_timer(d); DBG("%p created memstore subscriber created with privdata %p", d->sub, d); return sub; }
subscriber_t *memstore_multi_subscriber_create(nchan_store_channel_head_t *chanhead, uint8_t n) { static nchan_msg_id_t latest_msgid = NCHAN_NEWEST_MSGID; sub_data_t *d; nchan_store_channel_head_t *target_ch; ngx_int_t multi_subs; nchan_loc_conf_t cf; cf.use_redis = chanhead->use_redis; d = ngx_alloc(sizeof(*d), ngx_cycle->log); if(d == NULL) { ERR("couldn't allocate memstore-multi subscriber data"); return NULL; } subscriber_t *sub = internal_subscriber_create(&sub_name, d); internal_subscriber_set_enqueue_handler(sub, (callback_pt )sub_enqueue); internal_subscriber_set_dequeue_handler(sub, (callback_pt )sub_dequeue); internal_subscriber_set_respond_message_handler(sub, (callback_pt )sub_respond_message); internal_subscriber_set_respond_status_handler(sub, (callback_pt )sub_respond_status); internal_subscriber_set_notify_handler(sub, (callback_pt )sub_notify_handler); sub->last_msgid = latest_msgid; sub->destroy_after_dequeue = 1; sub->dequeue_after_response = 0; d->multi = &chanhead->multi[n]; d->multi->sub = sub; d->multi_chanhead = chanhead; d->n = n; chanhead->multi_waiting++; target_ch = nchan_memstore_get_chanhead(&d->multi->id, &cf); assert(target_ch); target_ch->spooler.fn->add(&target_ch->spooler, sub); multi_subs = chanhead->shared->sub_count; d->target_chanhead = target_ch; change_sub_count(target_ch, multi_subs); DBG("%p created with privdata %p", d->multi->sub, d); return sub; }