Exemple #1
0
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;
    }
  }
}
Exemple #2
0
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);
    }
  }
}