static rbtree_walk_direction_t collect_spool_range_callback(rbtree_seed_t *seed, subscriber_pool_t *spool, spooler_respond_data_t *data) { rbtree_walk_direction_t dir; uint8_t multi_count = data->multi; if(multi_count <= 1) { dir = compare_msgid_onetag_range(&data->min, &data->max, &spool->id); if(dir == RBTREE_WALK_LEFT_RIGHT) { spoolcollector_addspool(data, spool); } return dir; } else { int tc = compare_msgid_time(&data->min, &data->max, &spool->id); if(tc < 0) { return RBTREE_WALK_RIGHT; } else if(tc > 0) { return RBTREE_WALK_LEFT; } else { time_t timmin = data->min.time, timmax = data->max.time, timcur = spool->id.time; int max_cmp = -1, min_cmp = -1; if( timcur > timmin && timcur < timmax) { spoolcollector_addspool(data, spool); } else if(timcur == timmax && timcur == timmin) { if( nchan_compare_msgid_tags(&spool->id, &data->max) < 0 && nchan_compare_msgid_tags(&spool->id, &data->min) >= 0 ) { spoolcollector_addspool(data, spool); } } else if((timcur == timmax && (max_cmp = nchan_compare_msgid_tags(&spool->id, &data->max)) < 0) || (timcur == timmin && (min_cmp = nchan_compare_msgid_tags(&spool->id, &data->min)) >= 0)) { spoolcollector_addspool(data, spool); } else if( timcur > timmin && timcur < timmax) { spoolcollector_addspool(data, spool); } /* else { ERR("time_min: %i, time_cur: %i, time_max: %i", timmin, timcur, timmax); } */ return RBTREE_WALK_LEFT_RIGHT; } } }
int8_t nchan_compare_msgids(nchan_msg_id_t *id1, nchan_msg_id_t *id2) { assert(id1->tagcount == id2->tagcount); if(id1->time < id2->time) { return -1; } else if(id1->time > id2->time) { return 1; } else { assert(id1->tagcount == id2->tagcount); if(id1->tagcount == 1) { if(id1->tag.fixed[0] < id2->tag.fixed[0]) { return -1; } else if(id1->tag.fixed[0] > id2->tag.fixed[0]) { return 1; } else { return 0; } } else { return nchan_compare_msgid_tags(id1, id2); } } }