static subscriber_pool_t *get_spool(channel_spooler_t *spl, nchan_msg_id_t *id) { rbtree_seed_t *seed = &spl->spoolseed; ngx_rbtree_node_t *node; subscriber_pool_t *spool; if((node = rbtree_find_node(seed, id)) == NULL) { if((node = rbtree_create_node(seed, sizeof(*spool))) == NULL) { ERR("can't create rbtree node for spool"); return NULL; } // DBG("CREATED spool node %p for msgid %i:%i", node, id->time, id->tag); spool = (subscriber_pool_t *)rbtree_data_from_node(node); ngx_memzero(spool, sizeof(*spool)); spool->spooler = spl; spool->id = *id; spool->spooler = spl; spool->msg_status = MSG_INVALID; spool->msg = NULL; if(rbtree_insert_node(seed, node) != NGX_OK) { ERR("couldn't insert spool node"); rbtree_destroy_node(seed, node); return NULL; } } else { spool = (subscriber_pool_t *)rbtree_data_from_node(node); //DBG("found spool node %p with msgid %i:%i", node, id->time, id->tag); assert(spool->id.time == id->time); } return spool; }
static subscriber_pool_t *get_spool(channel_spooler_t *spl, nchan_msg_id_t *id) { rbtree_seed_t *seed = &spl->spoolseed; ngx_rbtree_node_t *node; subscriber_pool_t *spool; if(id->time == NCHAN_NEWEST_MSGID_TIME) { spool = &spl->current_msg_spool; spool->msg_status = MSG_EXPECTED; return &spl->current_msg_spool; } if((node = rbtree_find_node(seed, id)) == NULL) { if((node = rbtree_create_node(seed, sizeof(*spool))) == NULL) { ERR("can't create rbtree node for spool"); return NULL; } // DBG("CREATED spool node %p for msgid %V", node, msgid_to_str(id)); spool = (subscriber_pool_t *)rbtree_data_from_node(node); init_spool(spl, spool, id); if(rbtree_insert_node(seed, node) != NGX_OK) { ERR("couldn't insert spool node"); rbtree_destroy_node(seed, node); return NULL; } } else { spool = (subscriber_pool_t *)rbtree_data_from_node(node); DBG("found spool node %p with msgid %V", node, msgid_to_str(id)); assert(spool->id.time == id->time); } return spool; }