abstract WHC and pull it out of core DDSI code
Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
		
							parent
							
								
									37953f5c49
								
							
						
					
					
						commit
						61d98b46a6
					
				
					 18 changed files with 733 additions and 469 deletions
				
			
		| 
						 | 
				
			
			@ -31,3 +31,4 @@
 | 
			
		|||
69  src/dds_report.c
 | 
			
		||||
70  src/dds_builtin.c
 | 
			
		||||
72  src/dds_guardcond.c
 | 
			
		||||
73  src/dds_whc.c
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,6 +41,7 @@ PREPEND(srcs_ddsc "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    dds_guardcond.c
 | 
			
		||||
    dds_subscriber.c
 | 
			
		||||
    dds_write.c
 | 
			
		||||
    dds_whc.c
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
PREPEND(hdrs_public_ddsc "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/ddsc>$<INSTALL_INTERFACE:include/ddsc>"
 | 
			
		||||
| 
						 | 
				
			
			@ -80,6 +81,7 @@ PREPEND(hdrs_private_ddsc "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    dds__types.h
 | 
			
		||||
    dds__write.h
 | 
			
		||||
    dds__writer.h
 | 
			
		||||
    dds__whc.h
 | 
			
		||||
    q__osplser.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -190,6 +190,7 @@ typedef struct dds_writer
 | 
			
		|||
  struct nn_xpack * m_xp;
 | 
			
		||||
  struct writer * m_wr;
 | 
			
		||||
  os_mutex m_call_lock;
 | 
			
		||||
  struct whc *m_whc; /* FIXME: ownership still with underlying DDSI writer (cos of DDSI built-in writers )*/
 | 
			
		||||
 | 
			
		||||
  /* Status metrics */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										27
									
								
								src/core/ddsc/src/dds__whc.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/core/ddsc/src/dds__whc.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 *
 | 
			
		||||
 * This program and the accompanying materials are made available under the
 | 
			
		||||
 * terms of the Eclipse Public License v. 2.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
 | 
			
		||||
 * v. 1.0 which is available at
 | 
			
		||||
 * http://www.eclipse.org/org/documents/edl-v10.php.
 | 
			
		||||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#ifndef DDS__WHC_H
 | 
			
		||||
#define DDS__WHC_H
 | 
			
		||||
 | 
			
		||||
#include "ddsi/q_whc.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct whc *whc_new (int is_transient_local, unsigned hdepth, unsigned tldepth);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /* Q_WHC_H */
 | 
			
		||||
							
								
								
									
										1353
									
								
								src/core/ddsc/src/dds_whc.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1353
									
								
								src/core/ddsc/src/dds_whc.c
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -21,6 +21,7 @@
 | 
			
		|||
#include "dds__err.h"
 | 
			
		||||
#include "dds__init.h"
 | 
			
		||||
#include "dds__tkmap.h"
 | 
			
		||||
#include "dds__whc.h"
 | 
			
		||||
#include "dds__report.h"
 | 
			
		||||
#include "ddsc/ddsc_project.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -233,6 +234,8 @@ dds_writer_delete(
 | 
			
		|||
    assert(e);
 | 
			
		||||
    assert(thr);
 | 
			
		||||
 | 
			
		||||
    /* FIXME: not freeing WHC here because it is owned by the DDSI entity */
 | 
			
		||||
 | 
			
		||||
    if (asleep) {
 | 
			
		||||
        thread_state_awake(thr);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -338,6 +341,62 @@ dds_writer_qos_set(
 | 
			
		|||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct whc *make_whc(const dds_qos_t *qos)
 | 
			
		||||
{
 | 
			
		||||
  bool startup_mode;
 | 
			
		||||
  bool handle_as_transient_local;
 | 
			
		||||
  unsigned hdepth, tldepth;
 | 
			
		||||
  /* Startup mode causes the writer to treat data in its WHC as if
 | 
			
		||||
   transient-local, for the first few seconds after startup of the
 | 
			
		||||
   DDSI service. It is done for volatile reliable writers only
 | 
			
		||||
   (which automatically excludes all builtin writers) or for all
 | 
			
		||||
   writers except volatile best-effort & transient-local ones.
 | 
			
		||||
 | 
			
		||||
   Which one to use depends on whether merge policies are in effect
 | 
			
		||||
   in durability. If yes, then durability will take care of all
 | 
			
		||||
   transient & persistent data; if no, DDSI discovery usually takes
 | 
			
		||||
   too long and this'll save you.
 | 
			
		||||
 | 
			
		||||
   Note: may still be cleared, if it turns out we are not maintaining
 | 
			
		||||
   an index at all (e.g., volatile KEEP_ALL) */
 | 
			
		||||
  if (config.startup_mode_full) {
 | 
			
		||||
    startup_mode = gv.startup_mode &&
 | 
			
		||||
      (qos->durability.kind >= DDS_DURABILITY_TRANSIENT ||
 | 
			
		||||
       (qos->durability.kind == DDS_DURABILITY_VOLATILE &&
 | 
			
		||||
        qos->reliability.kind != DDS_RELIABILITY_BEST_EFFORT));
 | 
			
		||||
  } else {
 | 
			
		||||
    startup_mode = gv.startup_mode &&
 | 
			
		||||
      (qos->durability.kind == DDS_DURABILITY_VOLATILE &&
 | 
			
		||||
       qos->reliability.kind != DDS_RELIABILITY_BEST_EFFORT);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Construct WHC -- if aggressive_keep_last1 is set, the WHC will
 | 
			
		||||
    drop all samples for which a later update is available.  This
 | 
			
		||||
    forces it to maintain a tlidx.  */
 | 
			
		||||
  handle_as_transient_local = (qos->durability.kind == DDS_DURABILITY_TRANSIENT_LOCAL);
 | 
			
		||||
  if (!config.aggressive_keep_last_whc || qos->history.kind == DDS_HISTORY_KEEP_ALL)
 | 
			
		||||
    hdepth = 0;
 | 
			
		||||
  else
 | 
			
		||||
    hdepth = (unsigned)qos->history.depth;
 | 
			
		||||
  if (handle_as_transient_local) {
 | 
			
		||||
    if (qos->durability_service.history.kind == DDS_HISTORY_KEEP_ALL)
 | 
			
		||||
      tldepth = 0;
 | 
			
		||||
    else
 | 
			
		||||
      tldepth = (unsigned)qos->durability_service.history.depth;
 | 
			
		||||
  } else if (startup_mode) {
 | 
			
		||||
    tldepth = (hdepth == 0) ? 1 : hdepth;
 | 
			
		||||
  } else {
 | 
			
		||||
    tldepth = 0;
 | 
			
		||||
  }
 | 
			
		||||
  if (hdepth == 0 && tldepth == 0)
 | 
			
		||||
  {
 | 
			
		||||
    /* no index at all - so no need to bother with startup mode */
 | 
			
		||||
    startup_mode = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return whc_new (handle_as_transient_local, hdepth, tldepth);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
_Pre_satisfies_(((participant_or_publisher & DDS_ENTITY_KIND_MASK) == DDS_KIND_PUBLISHER) || \
 | 
			
		||||
                ((participant_or_publisher & DDS_ENTITY_KIND_MASK) == DDS_KIND_PARTICIPANT))
 | 
			
		||||
| 
						 | 
				
			
			@ -426,6 +485,7 @@ dds_create_writer(
 | 
			
		|||
    wr->m_entity.m_deriver.set_qos = dds_writer_qos_set;
 | 
			
		||||
    wr->m_entity.m_deriver.validate_status = dds_writer_status_validate;
 | 
			
		||||
    wr->m_entity.m_deriver.get_instance_hdl = dds_writer_instance_hdl;
 | 
			
		||||
    wr->m_whc = make_whc (wqos);
 | 
			
		||||
 | 
			
		||||
    /* Extra claim of this writer to make sure that the delete waits until DDSI
 | 
			
		||||
     * has deleted its writer as well. This can be known through the callback. */
 | 
			
		||||
| 
						 | 
				
			
			@ -439,8 +499,7 @@ dds_create_writer(
 | 
			
		|||
    if (asleep) {
 | 
			
		||||
        thread_state_awake(thr);
 | 
			
		||||
    }
 | 
			
		||||
    wr->m_wr = new_writer(&wr->m_entity.m_guid, NULL, &pub->m_participant->m_guid, ((dds_topic*)tp)->m_stopic,
 | 
			
		||||
                          wqos, dds_writer_status_cb, wr);
 | 
			
		||||
    wr->m_wr = new_writer(&wr->m_entity.m_guid, NULL, &pub->m_participant->m_guid, ((dds_topic*)tp)->m_stopic, wqos, wr->m_whc, dds_writer_status_cb, wr);
 | 
			
		||||
    os_mutexLock(&pub->m_mutex);
 | 
			
		||||
    os_mutexLock(&tp->m_mutex);
 | 
			
		||||
    assert(wr->m_wr);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue