ngx_int_t memstore_ipc_send_get_channel_info(ngx_int_t dst, ngx_str_t *chid, callback_pt callback, void* privdata) { DBG("send get_channel_info to %i %V", dst, chid); channel_info_data_t data; DEBUG_MEMZERO(&data); if((data.shm_chid = str_shm_copy(chid)) == NULL) { return NGX_ERROR; } data.channel_info = NULL; data.last_msgid = zero_msgid; data.callback = callback; data.privdata = privdata; return ipc_alert(nchan_memstore_get_ipc(), dst, IPC_GET_CHANNEL_INFO, &data, sizeof(data)); }
ngx_int_t memstore_ipc_send_get_channel_info(ngx_int_t dst, ngx_str_t *chid, nchan_loc_conf_t *cf, callback_pt callback, void* privdata) { DBG("send get_channel_info to %i %V", dst, chid); channel_info_data_t data; DEBUG_MEMZERO(&data); if((data.shm_chid = str_shm_copy(chid)) == NULL) { return NGX_ERROR; } data.channel_info = NULL; data.last_msgid = zero_msgid; data.cf = cf; data.callback = callback; data.privdata = privdata; return ipc_cmd(get_channel_info, dst, &data); }
ngx_int_t memstore_ipc_send_subscribe(ngx_int_t dst, ngx_str_t *chid, memstore_channel_head_t *origin_chanhead, nchan_loc_conf_t *cf) { DBG("send subscribe to %i, %V", dst, chid); subscribe_data_t data; DEBUG_MEMZERO(&data); if((data.shm_chid = str_shm_copy(chid)) == NULL) { ERR("Out of shared memory, can't send IPC subscrive alert"); return NGX_DECLINED; } data.shared_channel_data = NULL; data.d.origin_chanhead = origin_chanhead; data.cf = cf; return ipc_cmd(subscribe, dst, &data); }
ngx_int_t memstore_ipc_send_publish_message(ngx_int_t dst, ngx_str_t *chid, nchan_msg_t *shm_msg, nchan_loc_conf_t *cf, callback_pt callback, void *privdata) { publish_data_t data; DEBUG_MEMZERO(&data); DBG("IPC: send publish message to %i ch %V", dst, chid); assert(shm_msg->shared == 1); assert(shm_msg->temp_allocd == 0); assert(chid->data != NULL); data.shm_chid = str_shm_copy(chid); if(data.shm_chid == NULL) { return NGX_DECLINED; } data.shm_msg = shm_msg; data.cf = cf; data.callback = callback; data.callback_privdata = privdata; assert(data.shm_chid->data != NULL); assert(msg_reserve(shm_msg, "publish_message") == NGX_OK); return ipc_cmd(publish_message, dst, &data); }
static ngx_int_t publish_message_generic_callback(ngx_int_t status, void *rptr, void *privdata) { DBG("IPC: publish message generic callback"); publish_callback_data *cd = (publish_callback_data *)privdata; publish_response_data rd; DEBUG_MEMZERO(&rd); nchan_channel_t *ch = (nchan_channel_t *)rptr; rd.status = status; rd.callback = cd->d->callback; rd.callback_privdata = cd->d->callback_privdata; if(ch != NULL) { rd.last_seen = ch->last_seen; rd.subscribers = ch->subscribers; rd.messages = ch->messages; assert(ch->last_published_msg_id.tagcount == 1); rd.msg_time = ch->last_published_msg_id.time; rd.msg_tag = ch->last_published_msg_id.tag.fixed[0]; } ipc_cmd(publish_message_reply, cd->sender, &rd); if(cd->allocd) { ngx_free(cd); } return NGX_OK; }