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; }
static ngx_int_t sub_notify_handler(ngx_int_t code, void *data, sub_data_t *d) { if(code == NCHAN_SUB_MULTI_NOTIFY_ADDSUB) { change_sub_count(d->target_chanhead, (ngx_int_t )data); } return NGX_OK; }