add back in the broken filter and query condition support
the implementation was and is terrible, but without it too many tests fail Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
		
							parent
							
								
									791a0efe7e
								
							
						
					
					
						commit
						e841e4bf94
					
				
					 6 changed files with 37 additions and 71 deletions
				
			
		| 
						 | 
				
			
			@ -200,12 +200,20 @@ typedef struct dds_writer
 | 
			
		|||
}
 | 
			
		||||
dds_writer;
 | 
			
		||||
 | 
			
		||||
#ifndef DDS_TOPIC_INTERN_FILTER_FN_DEFINED
 | 
			
		||||
#define DDS_TOPIC_INTERN_FILTER_FN_DEFINED
 | 
			
		||||
typedef bool (*dds_topic_intern_filter_fn) (const void * sample, void *ctx);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
typedef struct dds_topic
 | 
			
		||||
{
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
  struct ddsi_sertopic * m_stopic;
 | 
			
		||||
  const dds_topic_descriptor_t * m_descriptor;
 | 
			
		||||
 | 
			
		||||
  dds_topic_intern_filter_fn filter_fn;
 | 
			
		||||
  void * filter_ctx;
 | 
			
		||||
 | 
			
		||||
  /* Status metrics */
 | 
			
		||||
 | 
			
		||||
  dds_inconsistent_topic_status_t m_inconsistent_topic_status;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,11 +27,9 @@ dds_create_querycondition(
 | 
			
		|||
        _In_ uint32_t mask,
 | 
			
		||||
        _In_ dds_querycondition_filter_fn filter)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t topic;
 | 
			
		||||
    dds_entity_t hdl;
 | 
			
		||||
    dds__retcode_t rc;
 | 
			
		||||
    dds_reader *r;
 | 
			
		||||
    dds_topic  *t;
 | 
			
		||||
 | 
			
		||||
    DDS_REPORT_STACK();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -41,21 +39,7 @@ dds_create_querycondition(
 | 
			
		|||
        assert(cond);
 | 
			
		||||
        hdl = cond->m_entity.m_hdl;
 | 
			
		||||
        cond->m_query.m_filter = filter;
 | 
			
		||||
        topic = r->m_topic->m_entity.m_hdl;
 | 
			
		||||
        dds_reader_unlock(r);
 | 
			
		||||
        rc = dds_topic_lock(topic, &t);
 | 
			
		||||
        if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
            abort();
 | 
			
		||||
#if 0
 | 
			
		||||
            if (t->m_stopic->filter_sample == NULL) {
 | 
			
		||||
                t->m_stopic->filter_sample = dds_alloc(t->m_descriptor->m_size);
 | 
			
		||||
            }
 | 
			
		||||
#endif
 | 
			
		||||
            dds_topic_unlock(t);
 | 
			
		||||
        } else {
 | 
			
		||||
            (void)dds_delete(hdl);
 | 
			
		||||
            hdl = DDS_ERRNO(rc, "Error occurred on locking topic");
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        hdl = DDS_ERRNO(rc, "Error occurred on locking reader");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -663,16 +663,19 @@ static bool add_sample
 | 
			
		|||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool content_filter_accepts (const struct ddsi_sertopic * topic, const struct ddsi_serdata *sample)
 | 
			
		||||
static bool content_filter_accepts (const struct ddsi_sertopic * sertopic, const struct ddsi_serdata *sample)
 | 
			
		||||
{
 | 
			
		||||
  bool ret = true;
 | 
			
		||||
#if 0 /* FIXME: content filter */
 | 
			
		||||
  if (topic->filter_fn)
 | 
			
		||||
  const struct dds_topic *tp = sertopic->status_cb_entity;
 | 
			
		||||
  if (tp->filter_fn)
 | 
			
		||||
  {
 | 
			
		||||
    deserialize_into ((char*) topic->filter_sample, sample);
 | 
			
		||||
    ret = (topic->filter_fn) (topic->filter_sample, topic->filter_ctx);
 | 
			
		||||
    const dds_topic_descriptor_t * desc = tp->m_descriptor;
 | 
			
		||||
    char tmp[desc->m_size];
 | 
			
		||||
    memset (tmp, 0, sizeof (tmp));
 | 
			
		||||
    ddsi_serdata_to_sample (sample, tmp, NULL, NULL);
 | 
			
		||||
    ret = (tp->filter_fn) (tmp, tp->filter_ctx);
 | 
			
		||||
    dds_sample_free(tmp, desc, DDS_FREE_CONTENTS_BIT);
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2179,9 +2182,9 @@ static bool update_conditions_locked
 | 
			
		|||
  dds_readcond * iter;
 | 
			
		||||
  int m_pre;
 | 
			
		||||
  int m_post;
 | 
			
		||||
#if 0 /* FIXME: content filter, query cond */
 | 
			
		||||
  bool deserialised = (rhc->topic->filter_fn != NULL);
 | 
			
		||||
#endif
 | 
			
		||||
  bool deserialised = (rhc->topic->status_cb_entity->filter_fn != 0);
 | 
			
		||||
  const struct dds_topic_descriptor *desc = rhc->topic->status_cb_entity->m_descriptor;
 | 
			
		||||
  char tmp[desc->m_size];
 | 
			
		||||
 | 
			
		||||
  TRACE (("update_conditions_locked(%p) - inst %u nonempty %u disp %u nowr %u new %u samples %u read %u\n",
 | 
			
		||||
          (void *) rhc, rhc->n_instances, rhc->n_nonempty_instances, rhc->n_not_alive_disposed,
 | 
			
		||||
| 
						 | 
				
			
			@ -2224,17 +2227,17 @@ static bool update_conditions_locked
 | 
			
		|||
    }
 | 
			
		||||
    else if (m_pre < m_post)
 | 
			
		||||
    {
 | 
			
		||||
#if 0 /* FIXME: content filter, query cond */
 | 
			
		||||
      if (sample && !deserialised && (dds_entity_kind(iter->m_entity.m_hdl) == DDS_KIND_COND_QUERY))
 | 
			
		||||
      {
 | 
			
		||||
        deserialize_into ((char*)rhc->topic->filter_sample, sample);
 | 
			
		||||
        memset (tmp, 0, sizeof (tmp));
 | 
			
		||||
        ddsi_serdata_to_sample (sample, tmp, NULL, NULL);
 | 
			
		||||
        deserialised = true;
 | 
			
		||||
      }
 | 
			
		||||
      if
 | 
			
		||||
      (
 | 
			
		||||
        (sample == NULL)
 | 
			
		||||
        || (dds_entity_kind(iter->m_entity.m_hdl) != DDS_KIND_COND_QUERY)
 | 
			
		||||
        || (iter->m_query.m_filter != NULL && iter->m_query.m_filter (rhc->topic->filter_sample))
 | 
			
		||||
        || (iter->m_query.m_filter != NULL && iter->m_query.m_filter (tmp))
 | 
			
		||||
      )
 | 
			
		||||
      {
 | 
			
		||||
        TRACE (("now matches"));
 | 
			
		||||
| 
						 | 
				
			
			@ -2244,18 +2247,6 @@ static bool update_conditions_locked
 | 
			
		|||
          trigger = true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
#else
 | 
			
		||||
      assert (dds_entity_kind(iter->m_entity.m_hdl) != DDS_KIND_COND_QUERY);
 | 
			
		||||
      if (sample == NULL)
 | 
			
		||||
      {
 | 
			
		||||
        TRACE (("now matches"));
 | 
			
		||||
        if (iter->m_entity.m_trigger++ == 0)
 | 
			
		||||
        {
 | 
			
		||||
          TRACE ((" (cond now triggers)"));
 | 
			
		||||
          trigger = true;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
#endif
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -2273,6 +2264,8 @@ static bool update_conditions_locked
 | 
			
		|||
    iter = iter->m_rhc_next;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (deserialised)
 | 
			
		||||
    dds_sample_free (tmp, desc, DDS_FREE_CONTENTS_BIT);
 | 
			
		||||
  return trigger;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -502,28 +502,20 @@ dds_topic_mod_filter(
 | 
			
		|||
        void **ctx,
 | 
			
		||||
        bool set)
 | 
			
		||||
{
 | 
			
		||||
#if 0 /* FIXME: content filter */
 | 
			
		||||
    dds_topic *t;
 | 
			
		||||
    if (dds_topic_lock(topic, &t) == DDS_RETCODE_OK) {
 | 
			
		||||
        if (set) {
 | 
			
		||||
            t->m_stopic->filter_fn = *filter;
 | 
			
		||||
            t->m_stopic->filter_ctx = *ctx;
 | 
			
		||||
 | 
			
		||||
            /* Create sample for read filtering */
 | 
			
		||||
 | 
			
		||||
            if (t->m_stopic->filter_sample == NULL) {
 | 
			
		||||
                t->m_stopic->filter_sample = dds_alloc (t->m_descriptor->m_size);
 | 
			
		||||
            }
 | 
			
		||||
            t->filter_fn = *filter;
 | 
			
		||||
            t->filter_ctx = *ctx;
 | 
			
		||||
        } else {
 | 
			
		||||
            *filter = t->m_stopic->filter_fn;
 | 
			
		||||
            *ctx = t->m_stopic->filter_ctx;
 | 
			
		||||
            *filter = t->filter_fn;
 | 
			
		||||
            *ctx = t->filter_ctx;
 | 
			
		||||
        }
 | 
			
		||||
        dds_topic_unlock(t);
 | 
			
		||||
    } else {
 | 
			
		||||
        *filter = 0;
 | 
			
		||||
        *ctx = NULL;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_Pre_satisfies_((topic & DDS_ENTITY_KIND_MASK) == DDS_KIND_TOPIC)
 | 
			
		||||
| 
						 | 
				
			
			@ -545,8 +537,7 @@ dds_topic_get_filter(
 | 
			
		|||
    dds_topic_intern_filter_fn filter;
 | 
			
		||||
    void *ctx;
 | 
			
		||||
    dds_topic_mod_filter (topic, &filter, &ctx, false);
 | 
			
		||||
    return
 | 
			
		||||
      (filter == dds_topic_chaining_filter) ? (dds_topic_filter_fn)ctx : 0;
 | 
			
		||||
    return (filter == dds_topic_chaining_filter) ? (dds_topic_filter_fn)ctx : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -198,14 +198,12 @@ dds_write_impl(
 | 
			
		|||
        return DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER, "No data buffer provided");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#if 0 /* FIXME: content filter */
 | 
			
		||||
    /* Check for topic filter */
 | 
			
		||||
    if (ddsi_wr->topic->filter_fn && ! writekey) {
 | 
			
		||||
        if (!(ddsi_wr->topic->filter_fn) (data, ddsi_wr->topic->filter_ctx)) {
 | 
			
		||||
            return DDS_RECTODE_OK;
 | 
			
		||||
    if (wr->m_topic->filter_fn && ! writekey) {
 | 
			
		||||
        if (!(wr->m_topic->filter_fn) (data, wr->m_topic->filter_ctx)) {
 | 
			
		||||
            return DDS_RETCODE_OK;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if (asleep) {
 | 
			
		||||
        thread_state_awake (thr);
 | 
			
		||||
| 
						 | 
				
			
			@ -265,12 +263,9 @@ dds_writecdr_impl(
 | 
			
		|||
    struct writer * ddsi_wr = wr->m_wr;
 | 
			
		||||
    struct tkmap_instance * tk;
 | 
			
		||||
 | 
			
		||||
#if 0 /* FIXME: content filter */
 | 
			
		||||
    /* Check for topic filter */
 | 
			
		||||
    if (ddsi_wr->topic->filter_fn && ! writekey) {
 | 
			
		||||
    if (wr->m_topic->filter_fn) {
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if (asleep) {
 | 
			
		||||
        thread_state_awake (thr);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -78,11 +78,6 @@ static size_t alignup_size (size_t x, size_t a)
 | 
			
		|||
  return (x+m) & ~m;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static size_t alignup4 (size_t x)
 | 
			
		||||
{
 | 
			
		||||
  return alignup_size (x, 4);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void * ddsi_serstate_append (struct serstate * st, size_t n)
 | 
			
		||||
{
 | 
			
		||||
  char *p;
 | 
			
		||||
| 
						 | 
				
			
			@ -378,7 +373,7 @@ static struct ddsi_serdata *serdata_default_from_sample_plist (const struct ddsi
 | 
			
		|||
 | 
			
		||||
  /* if we're it is supposed to be just a key, rawkey must be be the first field and followed only by a sentinel */
 | 
			
		||||
  assert (kind != SDK_KEY || rawkey == (const unsigned char *)sample->blob + sizeof (nn_parameter_t));
 | 
			
		||||
  assert (kind != SDK_KEY || sample->size == sizeof (nn_parameter_t) + alignup4 (keysize) + sizeof (nn_parameter_t));
 | 
			
		||||
  assert (kind != SDK_KEY || sample->size == sizeof (nn_parameter_t) + alignup_size (keysize, 4) + sizeof (nn_parameter_t));
 | 
			
		||||
  return fix_serdata_default (d, tp->c.iid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -404,7 +399,7 @@ static void serdata_default_to_ser (const struct ddsi_serdata *serdata_common, s
 | 
			
		|||
{
 | 
			
		||||
  const struct ddsi_serdata_default *d = (const struct ddsi_serdata_default *)serdata_common;
 | 
			
		||||
  assert (off < d->pos + sizeof(struct CDRHeader));
 | 
			
		||||
  assert (sz <= alignup4 (d->pos + sizeof(struct CDRHeader)) - off);
 | 
			
		||||
  assert (sz <= alignup_size (d->pos + sizeof(struct CDRHeader), 4) - off);
 | 
			
		||||
  /* FIXME: maybe I should pull the header out ... */
 | 
			
		||||
  memcpy (buf, (char *)&d->hdr + off, sz);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -413,7 +408,7 @@ static struct ddsi_serdata *serdata_default_to_ser_ref (const struct ddsi_serdat
 | 
			
		|||
{
 | 
			
		||||
  const struct ddsi_serdata_default *d = (const struct ddsi_serdata_default *)serdata_common;
 | 
			
		||||
  assert (off < d->pos + sizeof(struct CDRHeader));
 | 
			
		||||
  assert (sz <= alignup4 (d->pos + sizeof(struct CDRHeader)) - off);
 | 
			
		||||
  assert (sz <= alignup_size (d->pos + sizeof(struct CDRHeader), 4) - off);
 | 
			
		||||
  ref->iov_base = (char *)&d->hdr + off;
 | 
			
		||||
  ref->iov_len = sz;
 | 
			
		||||
  return ddsi_serdata_ref(serdata_common);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue