Merge branch 'master' into merge2
Signed-off-by: Martin Bremmer <martin.bremmer@adlinktech.com>
This commit is contained in:
		
						commit
						3fc777e631
					
				
					 477 changed files with 31941 additions and 32175 deletions
				
			
		| 
						 | 
				
			
			@ -19,22 +19,27 @@ FUNCTION(PREPEND var prefix)
 | 
			
		|||
   SET(${var} "${listVar}" PARENT_SCOPE)
 | 
			
		||||
ENDFUNCTION(PREPEND)
 | 
			
		||||
 | 
			
		||||
option(DDSC_SHARED "Build DDSC as a shared library" ON)
 | 
			
		||||
 | 
			
		||||
if(DDSC_SHARED AND ((NOT DEFINED BUILD_SHARED_LIBS) OR BUILD_SHARED_LIBS))
 | 
			
		||||
  # BUILD_SHARED_LIBS is set to off by for example VxWorks DKM environment
 | 
			
		||||
  add_library(ddsc SHARED "")
 | 
			
		||||
if (BUILD_SHARED_LIBS OR NOT DEFINED BUILD_SHARED_LIBS)
 | 
			
		||||
  add_library(ddsc SHARED)
 | 
			
		||||
else()
 | 
			
		||||
  if(DDSC_SHARED)
 | 
			
		||||
    message(STATUS "Option DDSC_SHARED ignored. Only static libraries supported on this platform.")
 | 
			
		||||
  endif()
 | 
			
		||||
  add_library(ddsc "")
 | 
			
		||||
  add_library(ddsc)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
add_definitions(-DDDSI_INCLUDE_NETWORK_PARTITIONS -DDDSI_INCLUDE_SSM)
 | 
			
		||||
 | 
			
		||||
option(DDSC_ENABLE_OPENSSL "Enable openssl support" ON)
 | 
			
		||||
if(DDSC_ENABLE_OPENSSL)
 | 
			
		||||
# OpenSSL is huge, raising the RSS by 1MB or so, and moreover find_package(OpenSSL) causes
 | 
			
		||||
# trouble on some older CMake versions that otherwise work fine, so provide an option to avoid
 | 
			
		||||
# all OpenSSL related things.
 | 
			
		||||
#
 | 
			
		||||
# Historically the option was DDSC_ENABLE_OPENSSL so make some allowance for those who are
 | 
			
		||||
# currently relying on it.
 | 
			
		||||
option(ENABLE_SSL "Enable openssl support" ON)
 | 
			
		||||
option(DDSC_ENABLE_OPENSSL "Deprecated: please use ENABLE_SSL instead" ON)
 | 
			
		||||
if(NOT DDSC_ENABLE_OPENSSL)
 | 
			
		||||
  message(ERROR "DDSC_ENABLE_OPENSSL is deprecated, please use ENABLE_SSL instead")
 | 
			
		||||
  set(ENABLE_SSL OFF)
 | 
			
		||||
endif()
 | 
			
		||||
if(ENABLE_SSL)
 | 
			
		||||
  find_package(OpenSSL)
 | 
			
		||||
  if(OPENSSL_FOUND)
 | 
			
		||||
    add_definitions(-DDDSI_INCLUDE_SSL)
 | 
			
		||||
| 
						 | 
				
			
			@ -42,8 +47,9 @@ if(DDSC_ENABLE_OPENSSL)
 | 
			
		|||
    if(CMAKE_GENERATOR MATCHES "Visual Studio")
 | 
			
		||||
      set_target_properties(ddsc PROPERTIES LINK_FLAGS "/ignore:4099")
 | 
			
		||||
    endif()
 | 
			
		||||
    message(STATUS "Building with OpenSSL support")
 | 
			
		||||
  else()
 | 
			
		||||
    message(FATAL_ERROR "To build without openssl support, set DDSC_ENABLE_OPENSSL to OFF")
 | 
			
		||||
    message(STATUS "Building without OpenSSL support")
 | 
			
		||||
  endif()
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +57,6 @@ include(ddsi/CMakeLists.txt)
 | 
			
		|||
include(ddsc/CMakeLists.txt)
 | 
			
		||||
 | 
			
		||||
target_link_libraries(ddsc PRIVATE ddsrt security_api)
 | 
			
		||||
 | 
			
		||||
target_compile_definitions(
 | 
			
		||||
  ddsc PUBLIC
 | 
			
		||||
  $<BUILD_INTERFACE:$<TARGET_PROPERTY:ddsrt,INTERFACE_COMPILE_DEFINITIONS>>)
 | 
			
		||||
| 
						 | 
				
			
			@ -76,4 +81,21 @@ install(
 | 
			
		|||
  ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT lib
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
add_subdirectory("${CMAKE_CURRENT_LIST_DIR}/xtests")
 | 
			
		||||
if(BUILD_IDLC)
 | 
			
		||||
  add_subdirectory(xtests)
 | 
			
		||||
endif()
 | 
			
		||||
 | 
			
		||||
if(BUILD_DOCS)
 | 
			
		||||
  set(DOXYGEN_GENERATE_HTML NO)
 | 
			
		||||
  set(DOXYGEN_GENERATE_XML YES)
 | 
			
		||||
  set(DOXYGEN_EXCLUDE_PATTERNS "*/tests/*")
 | 
			
		||||
  set(DOXYGEN_MACRO_EXPANSION YES)
 | 
			
		||||
  set(DOXYGEN_PREDEFINED
 | 
			
		||||
    "__restrict="
 | 
			
		||||
    "__attribute__="
 | 
			
		||||
    "__declspec(x)="
 | 
			
		||||
    "DDS_EXPORT="
 | 
			
		||||
    "DDS_DEPRECATED_EXPORT=")
 | 
			
		||||
  find_package(Doxygen REQUIRED)
 | 
			
		||||
  doxygen_add_docs(ddsc_api_docs "ddsc/include")
 | 
			
		||||
endif()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,12 +19,13 @@ PREPEND(srcs_ddsc "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    dds_init.c
 | 
			
		||||
    dds_publisher.c
 | 
			
		||||
    dds_rhc.c
 | 
			
		||||
    dds_rhc_default.c
 | 
			
		||||
    dds_domain.c
 | 
			
		||||
    dds_instance.c
 | 
			
		||||
    dds_qos.c
 | 
			
		||||
    dds_handles.c
 | 
			
		||||
    dds_entity.c
 | 
			
		||||
    dds_key.c
 | 
			
		||||
    dds_matched.c
 | 
			
		||||
    dds_querycond.c
 | 
			
		||||
    dds_topic.c
 | 
			
		||||
    dds_listener.c
 | 
			
		||||
| 
						 | 
				
			
			@ -47,8 +48,8 @@ PREPEND(hdrs_public_ddsc "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include/dd
 | 
			
		|||
    ddsc/dds_public_impl.h
 | 
			
		||||
    ddsc/dds_public_listener.h
 | 
			
		||||
    ddsc/dds_public_qos.h
 | 
			
		||||
    ddsc/dds_public_qosdefs.h
 | 
			
		||||
    ddsc/dds_public_status.h
 | 
			
		||||
    ddsc/dds_public_stream.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
PREPEND(hdrs_private_ddsc "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +59,6 @@ PREPEND(hdrs_private_ddsc "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    dds__handles.h
 | 
			
		||||
    dds__entity.h
 | 
			
		||||
    dds__init.h
 | 
			
		||||
    dds__key.h
 | 
			
		||||
    dds__listener.h
 | 
			
		||||
    dds__participant.h
 | 
			
		||||
    dds__publisher.h
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +68,7 @@ PREPEND(hdrs_private_ddsc "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    dds__guardcond.h
 | 
			
		||||
    dds__reader.h
 | 
			
		||||
    dds__rhc.h
 | 
			
		||||
    dds__rhc_default.h
 | 
			
		||||
    dds__stream.h
 | 
			
		||||
    dds__subscriber.h
 | 
			
		||||
    dds__topic.h
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +78,7 @@ PREPEND(hdrs_private_ddsc "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    dds__whc.h
 | 
			
		||||
    dds__whc_builtintopic.h
 | 
			
		||||
    dds__serdata_builtintopic.h
 | 
			
		||||
    dds__get_status.h
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
generate_export_header(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,17 +26,10 @@
 | 
			
		|||
 | 
			
		||||
#include "dds/export.h"
 | 
			
		||||
 | 
			
		||||
/* TODO: Move to appropriate location */
 | 
			
		||||
/**
 | 
			
		||||
 * Return code indicating success (DDS_RETCODE_OK) or failure. If a given
 | 
			
		||||
 * operation failed the value will be a unique error code and dds_err_nr() must
 | 
			
		||||
 * be used to extract the DDS_RETCODE_* value.
 | 
			
		||||
 */
 | 
			
		||||
typedef int32_t dds_return_t;
 | 
			
		||||
/**
 | 
			
		||||
 * Handle to an entity. A valid entity handle will always have a positive
 | 
			
		||||
 * integer value. Should the value be negative, the value represents a unique
 | 
			
		||||
 * error code. dds_err_nr() can be used to extract the DDS_RETCODE_* value.
 | 
			
		||||
 * integer value. Should the value be negative, it is one of the DDS_RETCODE_*
 | 
			
		||||
 * error codes.
 | 
			
		||||
 */
 | 
			
		||||
typedef int32_t dds_entity_t;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +38,6 @@ typedef int32_t dds_entity_t;
 | 
			
		|||
#include "dds/ddsrt/time.h"
 | 
			
		||||
#include "dds/ddsrt/retcode.h"
 | 
			
		||||
#include "dds/ddsrt/log.h"
 | 
			
		||||
#include "dds/ddsc/dds_public_stream.h"
 | 
			
		||||
#include "dds/ddsc/dds_public_impl.h"
 | 
			
		||||
#include "dds/ddsc/dds_public_alloc.h"
 | 
			
		||||
#include "dds/ddsc/dds_public_qos.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -87,7 +79,6 @@ DDS_EXPORT dds_domainid_t dds_domain_default (void);
 | 
			
		|||
 | 
			
		||||
/** @name Communication Status definitions
 | 
			
		||||
  @{**/
 | 
			
		||||
/** Another topic exists with the same name but with different characteristics. */
 | 
			
		||||
typedef enum dds_status_id {
 | 
			
		||||
  DDS_INCONSISTENT_TOPIC_STATUS_ID,
 | 
			
		||||
  DDS_OFFERED_DEADLINE_MISSED_STATUS_ID,
 | 
			
		||||
| 
						 | 
				
			
			@ -102,8 +93,9 @@ typedef enum dds_status_id {
 | 
			
		|||
  DDS_LIVELINESS_CHANGED_STATUS_ID,
 | 
			
		||||
  DDS_PUBLICATION_MATCHED_STATUS_ID,
 | 
			
		||||
  DDS_SUBSCRIPTION_MATCHED_STATUS_ID
 | 
			
		||||
}
 | 
			
		||||
dds_status_id_t;
 | 
			
		||||
} dds_status_id_t;
 | 
			
		||||
 | 
			
		||||
/** Another topic exists with the same name but with different characteristics. */
 | 
			
		||||
#define DDS_INCONSISTENT_TOPIC_STATUS          (1u << DDS_INCONSISTENT_TOPIC_STATUS_ID)
 | 
			
		||||
/** The deadline that the writer has committed through its deadline QoS policy was not respected for a specific instance. */
 | 
			
		||||
#define DDS_OFFERED_DEADLINE_MISSED_STATUS     (1u << DDS_OFFERED_DEADLINE_MISSED_STATUS_ID)
 | 
			
		||||
| 
						 | 
				
			
			@ -321,7 +313,7 @@ dds_delete(dds_entity_t entity);
 | 
			
		|||
 * For instance, it will return the Publisher that was used when
 | 
			
		||||
 * creating a DataWriter (when that DataWriter was provided here).
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]  entity  Entity from which to get its publisher.
 | 
			
		||||
 * @param[in]  writer  Entity from which to get its publisher.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A valid entity or an error code.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -369,7 +361,7 @@ dds_get_subscriber(dds_entity_t entity);
 | 
			
		|||
 * For instance, it will return the DataReader that was used when
 | 
			
		||||
 * creating a ReadCondition (when that ReadCondition was provided here).
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]  entity  Entity from which to get its datareader.
 | 
			
		||||
 * @param[in]  condition  Entity from which to get its datareader.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A valid reader handle or an error code.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -510,7 +502,7 @@ dds_get_status_changes(dds_entity_t entity, uint32_t *status);
 | 
			
		|||
 * This operation returns the status enabled on the entity
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]  entity  Entity to get the status.
 | 
			
		||||
 * @param[out] status  Status set on the entity.
 | 
			
		||||
 * @param[out] mask    Mask of enabled statuses set on the entity.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A dds_return_t indicating success or failure.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -960,6 +952,8 @@ dds_create_topic(
 | 
			
		|||
  const dds_qos_t *qos,
 | 
			
		||||
  const dds_listener_t *listener);
 | 
			
		||||
 | 
			
		||||
struct ddsi_sertopic;
 | 
			
		||||
struct nn_plist;
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Creates a new topic with arbitrary type handling.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -980,8 +974,6 @@ dds_create_topic(
 | 
			
		|||
 *             Either participant, descriptor, name or qos is invalid.
 | 
			
		||||
 */
 | 
			
		||||
/* TODO: Check list of retcodes is complete. */
 | 
			
		||||
struct ddsi_sertopic;
 | 
			
		||||
struct nn_plist;
 | 
			
		||||
DDS_EXPORT dds_entity_t
 | 
			
		||||
dds_create_topic_arbitrary (
 | 
			
		||||
  dds_entity_t participant,
 | 
			
		||||
| 
						 | 
				
			
			@ -1224,7 +1216,7 @@ dds_create_reader(
 | 
			
		|||
 * @returns a status, 0 on success, TIMEOUT on timeout or a negative value to indicate error.
 | 
			
		||||
 */
 | 
			
		||||
/* TODO: Complete list of error codes */
 | 
			
		||||
DDS_EXPORT int
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_reader_wait_for_historical_data(
 | 
			
		||||
  dds_entity_t reader,
 | 
			
		||||
  dds_duration_t max_wait);
 | 
			
		||||
| 
						 | 
				
			
			@ -1658,8 +1650,7 @@ dds_write_flush(dds_entity_t writer);
 | 
			
		|||
 * @brief Write a CDR serialized value of a data instance
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]  writer The writer entity.
 | 
			
		||||
 * @param[in]  cdr CDR serialized value to be written.
 | 
			
		||||
 * @param[in]  size Size (in bytes) of CDR encoded data to be written.
 | 
			
		||||
 * @param[in]  serdata CDR serialized value to be written.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A dds_return_t indicating success or failure.
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -2612,7 +2603,7 @@ dds_take_mask_wl(
 | 
			
		|||
  uint32_t maxs,
 | 
			
		||||
  uint32_t mask);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT int
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_takecdr(
 | 
			
		||||
  dds_entity_t reader_or_condition,
 | 
			
		||||
  struct ddsi_serdata **buf,
 | 
			
		||||
| 
						 | 
				
			
			@ -2906,7 +2897,7 @@ dds_read_next_wl(
 | 
			
		|||
 * the memory is released so that the buffer can be reused during a successive read/take operation.
 | 
			
		||||
 * When a condition is provided, the reader to which the condition belongs is looked up.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] rd_or_cnd Reader or condition that belongs to a reader.
 | 
			
		||||
 * @param[in] reader_or_condition Reader or condition that belongs to a reader.
 | 
			
		||||
 * @param[in] buf An array of (pointers to) samples.
 | 
			
		||||
 * @param[in] bufsz The number of (pointers to) samples stored in buf.
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -2948,7 +2939,7 @@ dds_instance_lookup(dds_entity_t entity, const void *data);
 | 
			
		|||
/**
 | 
			
		||||
 * @brief This operation takes an instance handle and return a key-value corresponding to it.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in]  entity Reader or writer entity.
 | 
			
		||||
 * @param[in]  entity Reader, writer, readcondition or querycondition entity.
 | 
			
		||||
 * @param[in]  inst   Instance handle.
 | 
			
		||||
 * @param[out] data   pointer to an instance, to which the key ID corresponding to the instance handle will be
 | 
			
		||||
 *    returned, the sample in the instance should be ignored.
 | 
			
		||||
| 
						 | 
				
			
			@ -3070,6 +3061,140 @@ dds_triggered(dds_entity_t entity);
 | 
			
		|||
DDS_EXPORT dds_entity_t
 | 
			
		||||
dds_get_topic(dds_entity_t entity);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get instance handles of the data readers matching a writer
 | 
			
		||||
 *
 | 
			
		||||
 * This operation fills the provided array with the instance handles
 | 
			
		||||
 * of the data readers that match the writer.  On successful output,
 | 
			
		||||
 * the number of entries of "rds" set is the minimum of the return
 | 
			
		||||
 * value and the value of "nrds".
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] writer   The writer.
 | 
			
		||||
 * @param[in] rds      The array to be filled.
 | 
			
		||||
 * @param[in] nrds     The size of the rds array, at most the first
 | 
			
		||||
 *             nrds entries will be filled.  rds = NULL and nrds = 0
 | 
			
		||||
 *             is a valid way of determining the number of matched
 | 
			
		||||
 *             readers, but inefficient compared to relying on the
 | 
			
		||||
 *             matched publication status.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A dds_return_t indicating the number of matched readers
 | 
			
		||||
 *             or failure.  The return value may be larger than nrds
 | 
			
		||||
 *             if there are more matching readers than the array can
 | 
			
		||||
 *             hold.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval >=0
 | 
			
		||||
 *             The number of matching readers.
 | 
			
		||||
 * @retval DDS_RETCODE_BAD_PARAMETER
 | 
			
		||||
 *             The entity parameter is not valid or rds = NULL and
 | 
			
		||||
 *             nrds > 0.
 | 
			
		||||
 * @retval DDS_RETCODE_ILLEGAL_OPERATION
 | 
			
		||||
 *             The operation is invoked on an inappropriate object.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_get_matched_subscriptions (
 | 
			
		||||
  dds_entity_t writer,
 | 
			
		||||
  dds_instance_handle_t *rds,
 | 
			
		||||
  size_t nrds);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get a description of a reader matched with the provided
 | 
			
		||||
 * writer
 | 
			
		||||
 *
 | 
			
		||||
 * This operation looks up the reader instance handle in the set of
 | 
			
		||||
 * readers matched with the specified writer, returning a freshly
 | 
			
		||||
 * allocated sample of the DCPSSubscription built-in topic if found,
 | 
			
		||||
 * and NULL if not.  The caller is responsible for freeing the
 | 
			
		||||
 * memory allocated.
 | 
			
		||||
 *
 | 
			
		||||
 * This operation is similar to performing a read of the given
 | 
			
		||||
 * instance handle on a reader of the DCPSSubscription built-in
 | 
			
		||||
 * topic, but this operation additionally filters on whether the
 | 
			
		||||
 * reader is matched by the provided writer.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] writer   The writer.
 | 
			
		||||
 * @param[in] ih       The instance handle of a reader.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A newly allocated sample containing the information on the
 | 
			
		||||
 *             reader, or a NULL pointer for any kind of failure.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval != NULL
 | 
			
		||||
 *             The requested data
 | 
			
		||||
 * @retval NULL
 | 
			
		||||
 *             The writer is not valid or ih is not an instance handle
 | 
			
		||||
 *             of a matched reader.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT dds_builtintopic_endpoint_t *
 | 
			
		||||
dds_get_matched_subscription_data (
 | 
			
		||||
  dds_entity_t writer,
 | 
			
		||||
  dds_instance_handle_t ih);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get instance handles of the data writers matching a reader
 | 
			
		||||
 *
 | 
			
		||||
 * This operation fills the provided array with the instance handles
 | 
			
		||||
 * of the data writers that match the reader.  On successful output,
 | 
			
		||||
 * the number of entries of "wrs" set is the minimum of the return
 | 
			
		||||
 * value and the value of "nwrs".
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] reader   The reader.
 | 
			
		||||
 * @param[in] wrs      The array to be filled.
 | 
			
		||||
 * @param[in] nwrs     The size of the wrs array, at most the first
 | 
			
		||||
 *             nwrs entries will be filled.  wrs = NULL and wrds = 0
 | 
			
		||||
 *             is a valid way of determining the number of matched
 | 
			
		||||
 *             readers, but inefficient compared to relying on the
 | 
			
		||||
 *             matched publication status.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A dds_return_t indicating the number of matched writers
 | 
			
		||||
 *             or failure.  The return value may be larger than nwrs
 | 
			
		||||
 *             if there are more matching writers than the array can
 | 
			
		||||
 *             hold.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval >=0
 | 
			
		||||
 *             The number of matching writers.
 | 
			
		||||
 * @retval DDS_RETCODE_BAD_PARAMETER
 | 
			
		||||
 *             The entity parameter is not valid or wrs = NULL and
 | 
			
		||||
 *             nwrs > 0.
 | 
			
		||||
 * @retval DDS_RETCODE_ILLEGAL_OPERATION
 | 
			
		||||
 *             The operation is invoked on an inappropriate object.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_get_matched_publications (
 | 
			
		||||
  dds_entity_t reader,
 | 
			
		||||
  dds_instance_handle_t *wrs,
 | 
			
		||||
  size_t nwrs);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Get a description of a writer matched with the provided
 | 
			
		||||
 * reader
 | 
			
		||||
 *
 | 
			
		||||
 * This operation looks up the writer instance handle in the set of
 | 
			
		||||
 * writers matched with the specified reader, returning a freshly
 | 
			
		||||
 * allocated sample of the DCPSPublication built-in topic if found,
 | 
			
		||||
 * and NULL if not.  The caller is responsible for freeing the
 | 
			
		||||
 * memory allocated.
 | 
			
		||||
 *
 | 
			
		||||
 * This operation is similar to performing a read of the given
 | 
			
		||||
 * instance handle on a reader of the DCPSPublication built-in
 | 
			
		||||
 * topic, but this operation additionally filters on whether the
 | 
			
		||||
 * writer is matched by the provided reader.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] reader   The reader.
 | 
			
		||||
 * @param[in] ih       The instance handle of a writer.
 | 
			
		||||
 *
 | 
			
		||||
 * @returns A newly allocated sample containing the information on the
 | 
			
		||||
 *             writer, or a NULL pointer for any kind of failure.
 | 
			
		||||
 *
 | 
			
		||||
 * @retval != NULL
 | 
			
		||||
 *             The requested data
 | 
			
		||||
 * @retval NULL
 | 
			
		||||
 *             The reader is not valid or ih is not an instance handle
 | 
			
		||||
 *             of a matched writer.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT dds_builtintopic_endpoint_t *
 | 
			
		||||
dds_get_matched_publication_data (
 | 
			
		||||
  dds_entity_t reader,
 | 
			
		||||
  dds_instance_handle_t ih);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,20 +54,6 @@ typedef struct dds_allocator
 | 
			
		|||
}
 | 
			
		||||
dds_allocator_t;
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_set_allocator (const dds_allocator_t * __restrict n, dds_allocator_t * __restrict o);
 | 
			
		||||
 | 
			
		||||
typedef struct dds_aligned_allocator
 | 
			
		||||
{
 | 
			
		||||
  /* size is a multiple of align, align is a power of 2 no less than
 | 
			
		||||
     the machine's page size, returned pointer MUST be aligned to at
 | 
			
		||||
     least align. */
 | 
			
		||||
  void * (*alloc) (size_t size, size_t align);
 | 
			
		||||
  void (*free) (size_t size, void *ptr);
 | 
			
		||||
}
 | 
			
		||||
dds_aligned_allocator_t;
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_set_aligned_allocator (const dds_aligned_allocator_t * __restrict n, dds_aligned_allocator_t * __restrict o);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void * dds_alloc (size_t size);
 | 
			
		||||
DDS_EXPORT void * dds_realloc (void * ptr, size_t size);
 | 
			
		||||
DDS_EXPORT void * dds_realloc_zero (void * ptr, size_t size);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -28,6 +28,8 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* ** DEPRECATED ** */
 | 
			
		||||
 | 
			
		||||
/* Error masks for returned status values */
 | 
			
		||||
 | 
			
		||||
#define DDS_ERR_NR_MASK       0x000000ff
 | 
			
		||||
| 
						 | 
				
			
			@ -37,13 +39,13 @@ extern "C" {
 | 
			
		|||
/* Error code handling functions */
 | 
			
		||||
 | 
			
		||||
/** Macro to extract error number */
 | 
			
		||||
#define dds_err_nr(e) ((-(e)) & DDS_ERR_NR_MASK)
 | 
			
		||||
#define dds_err_nr(e) (e)
 | 
			
		||||
 | 
			
		||||
/** Macro to extract line number */
 | 
			
		||||
#define dds_err_line(e) (((-(e)) & DDS_ERR_LINE_MASK) >> 8)
 | 
			
		||||
#define dds_err_line(e) (0)
 | 
			
		||||
 | 
			
		||||
/** Macro to extract file identifier */
 | 
			
		||||
#define dds_err_file_id(e) (((-(e)) & DDS_ERR_FILE_ID_MASK) >> 22)
 | 
			
		||||
#define dds_err_file_id(e) (0)
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,9 +21,10 @@
 | 
			
		|||
#ifndef DDS_IMPL_H
 | 
			
		||||
#define DDS_IMPL_H
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include "dds/export.h"
 | 
			
		||||
#include "dds/ddsc/dds_public_alloc.h"
 | 
			
		||||
#include "dds/ddsc/dds_public_stream.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -38,8 +39,6 @@ typedef struct dds_sequence
 | 
			
		|||
}
 | 
			
		||||
dds_sequence_t;
 | 
			
		||||
 | 
			
		||||
#define DDS_LENGTH_UNLIMITED -1
 | 
			
		||||
 | 
			
		||||
typedef struct dds_key_descriptor
 | 
			
		||||
{
 | 
			
		||||
  const char * m_name;
 | 
			
		||||
| 
						 | 
				
			
			@ -71,6 +70,7 @@ dds_topic_descriptor_t;
 | 
			
		|||
 | 
			
		||||
#define DDS_TOPIC_NO_OPTIMIZE 0x0001
 | 
			
		||||
#define DDS_TOPIC_FIXED_KEY 0x0002
 | 
			
		||||
#define DDS_TOPIC_CONTAINS_UNION 0x0004
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Masks for read condition, read, take: there is only one mask here,
 | 
			
		||||
| 
						 | 
				
			
			@ -92,116 +92,145 @@ dds_topic_descriptor_t;
 | 
			
		|||
 | 
			
		||||
#define DDS_ANY_STATE (DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE)
 | 
			
		||||
 | 
			
		||||
#define DDS_DOMAIN_DEFAULT -1
 | 
			
		||||
#define DDS_DOMAIN_DEFAULT ((uint32_t) 0xffffffffu)
 | 
			
		||||
#define DDS_HANDLE_NIL 0
 | 
			
		||||
#define DDS_ENTITY_NIL 0
 | 
			
		||||
 | 
			
		||||
typedef enum dds_entity_kind
 | 
			
		||||
{
 | 
			
		||||
  DDS_KIND_DONTCARE    = 0x00000000,
 | 
			
		||||
  DDS_KIND_TOPIC       = 0x01000000,
 | 
			
		||||
  DDS_KIND_PARTICIPANT = 0x02000000,
 | 
			
		||||
  DDS_KIND_READER      = 0x03000000,
 | 
			
		||||
  DDS_KIND_WRITER      = 0x04000000,
 | 
			
		||||
  DDS_KIND_SUBSCRIBER  = 0x05000000,
 | 
			
		||||
  DDS_KIND_PUBLISHER   = 0x06000000,
 | 
			
		||||
  DDS_KIND_COND_READ   = 0x07000000,
 | 
			
		||||
  DDS_KIND_COND_QUERY  = 0x08000000,
 | 
			
		||||
  DDS_KIND_COND_GUARD  = 0x09000000,
 | 
			
		||||
  DDS_KIND_WAITSET     = 0x0A000000
 | 
			
		||||
}
 | 
			
		||||
dds_entity_kind_t;
 | 
			
		||||
  DDS_KIND_DONTCARE,
 | 
			
		||||
  DDS_KIND_TOPIC,
 | 
			
		||||
  DDS_KIND_PARTICIPANT,
 | 
			
		||||
  DDS_KIND_READER,
 | 
			
		||||
  DDS_KIND_WRITER,
 | 
			
		||||
  DDS_KIND_SUBSCRIBER,
 | 
			
		||||
  DDS_KIND_PUBLISHER,
 | 
			
		||||
  DDS_KIND_COND_READ,
 | 
			
		||||
  DDS_KIND_COND_QUERY,
 | 
			
		||||
  DDS_KIND_COND_GUARD,
 | 
			
		||||
  DDS_KIND_WAITSET
 | 
			
		||||
} dds_entity_kind_t;
 | 
			
		||||
 | 
			
		||||
/* Handles are opaque pointers to implementation types */
 | 
			
		||||
typedef uint64_t dds_instance_handle_t;
 | 
			
		||||
typedef int32_t dds_domainid_t;
 | 
			
		||||
typedef uint32_t dds_domainid_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Topic encoding instruction types */
 | 
			
		||||
 | 
			
		||||
#define DDS_OP_RTS 0x00000000
 | 
			
		||||
#define DDS_OP_ADR 0x01000000
 | 
			
		||||
#define DDS_OP_JSR 0x02000000
 | 
			
		||||
#define DDS_OP_JEQ 0x03000000
 | 
			
		||||
enum dds_stream_opcode {
 | 
			
		||||
  /* return from subroutine, exits top-level
 | 
			
		||||
     [RTS,   0,   0, 0] */
 | 
			
		||||
  DDS_OP_RTS = 0x00 << 24,
 | 
			
		||||
  /* data field
 | 
			
		||||
     [ADR, nBY,   0, k] [offset]
 | 
			
		||||
     [ADR, STR,   0, k] [offset]
 | 
			
		||||
     [ADR, BST,   0, k] [offset] [bound]
 | 
			
		||||
     [ADR, SEQ, nBY, 0] [offset]
 | 
			
		||||
     [ADR, SEQ, STR, 0] [offset]
 | 
			
		||||
     [ADR, SEQ, BST, 0] [offset] [bound]
 | 
			
		||||
     [ADR, SEQ,   s, 0] [offset] [elem-size] [next-insn, elem-insn]
 | 
			
		||||
       where s = {SEQ,ARR,UNI,STU}
 | 
			
		||||
     [ADR, ARR, nBY, k] [offset] [alen]
 | 
			
		||||
     [ADR, ARR, STR, 0] [offset] [alen]
 | 
			
		||||
     [ADR, ARR, BST, 0] [offset] [alen] [0] [bound]
 | 
			
		||||
     [ADR, ARR,   s, 0] [offset] [alen] [next-insn, elem-insn] [elem-size]
 | 
			
		||||
         where s = {SEQ,ARR,UNI,STU}
 | 
			
		||||
     [ADR, UNI,   d, z] [offset] [alen] [next-insn, cases]
 | 
			
		||||
       where
 | 
			
		||||
         d = discriminant type of {1BY,2BY,4BY}
 | 
			
		||||
         z = default present/not present (DDS_OP_FLAG_DEF)
 | 
			
		||||
         offset = discriminant offset
 | 
			
		||||
       followed by alen case labels: in JEQ format
 | 
			
		||||
     note: [ADR, STU, ...] is illegal
 | 
			
		||||
   where
 | 
			
		||||
     s            = subtype
 | 
			
		||||
     k            = key/not key (DDS_OP_FLAG_KEY)
 | 
			
		||||
     [offset]     = field offset from start of element in memory
 | 
			
		||||
     [elem-size]  = element size in memory
 | 
			
		||||
     [bound]      = string bound + 1
 | 
			
		||||
     [alen]       = array length, number of cases
 | 
			
		||||
     [next-insn]  = (unsigned 16 bits) offset to instruction for next field, from start of insn
 | 
			
		||||
     [elem-insn]  = (unsigned 16 bits) offset to first instruction for element, from start of insn
 | 
			
		||||
     [cases]      = (unsigned 16 bits) offset to first case label, from start of insn
 | 
			
		||||
   */
 | 
			
		||||
  DDS_OP_ADR = 0x01 << 24,
 | 
			
		||||
  /* jump-to-subroutine (apparently not used at the moment)
 | 
			
		||||
     [JSR,   0, e]
 | 
			
		||||
       where
 | 
			
		||||
         e = (signed 16 bits) offset to first instruction in subroutine, from start of insn
 | 
			
		||||
             instruction sequence must end in RTS, execution resumes at instruction
 | 
			
		||||
             following JSR */
 | 
			
		||||
  DDS_OP_JSR = 0x02 << 24,
 | 
			
		||||
  /* union case
 | 
			
		||||
     [JEQ, nBY, 0] [disc] [offset]
 | 
			
		||||
     [JEQ, STR, 0] [disc] [offset]
 | 
			
		||||
     [JEQ,   s, e] [disc] [offset]
 | 
			
		||||
       where
 | 
			
		||||
         s  = subtype other than {nBY,STR}
 | 
			
		||||
         e  = (unsigned 16 bits) offset to first instruction for case, from start of insn
 | 
			
		||||
              instruction sequence must end in RTS, at which point executes continues
 | 
			
		||||
              at the next field's instruction as specified by the union */
 | 
			
		||||
  DDS_OP_JEQ = 0x03 << 24
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Core type flags
 | 
			
		||||
 | 
			
		||||
  1BY : One byte simple type
 | 
			
		||||
  2BY : Two byte simple type
 | 
			
		||||
  4BY : Four byte simple type
 | 
			
		||||
  8BY : Eight byte simple type
 | 
			
		||||
  STR : String
 | 
			
		||||
  BST : Bounded string
 | 
			
		||||
  SEQ : Sequence
 | 
			
		||||
  ARR : Array
 | 
			
		||||
  UNI : Union
 | 
			
		||||
  STU : Struct
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define DDS_OP_VAL_1BY 0x01
 | 
			
		||||
#define DDS_OP_VAL_2BY 0x02
 | 
			
		||||
#define DDS_OP_VAL_4BY 0x03
 | 
			
		||||
#define DDS_OP_VAL_8BY 0x04
 | 
			
		||||
#define DDS_OP_VAL_STR 0x05
 | 
			
		||||
#define DDS_OP_VAL_BST 0x06
 | 
			
		||||
#define DDS_OP_VAL_SEQ 0x07
 | 
			
		||||
#define DDS_OP_VAL_ARR 0x08
 | 
			
		||||
#define DDS_OP_VAL_UNI 0x09
 | 
			
		||||
#define DDS_OP_VAL_STU 0x0a
 | 
			
		||||
 | 
			
		||||
#define DDS_OP_TYPE_1BY (DDS_OP_VAL_1BY << 16)
 | 
			
		||||
#define DDS_OP_TYPE_2BY (DDS_OP_VAL_2BY << 16)
 | 
			
		||||
#define DDS_OP_TYPE_4BY (DDS_OP_VAL_4BY << 16)
 | 
			
		||||
#define DDS_OP_TYPE_8BY (DDS_OP_VAL_8BY << 16)
 | 
			
		||||
#define DDS_OP_TYPE_STR (DDS_OP_VAL_STR << 16)
 | 
			
		||||
#define DDS_OP_TYPE_SEQ (DDS_OP_VAL_SEQ << 16)
 | 
			
		||||
#define DDS_OP_TYPE_ARR (DDS_OP_VAL_ARR << 16)
 | 
			
		||||
#define DDS_OP_TYPE_UNI (DDS_OP_VAL_UNI << 16)
 | 
			
		||||
#define DDS_OP_TYPE_STU (DDS_OP_VAL_STU << 16)
 | 
			
		||||
#define DDS_OP_TYPE_BST (DDS_OP_VAL_BST << 16)
 | 
			
		||||
enum dds_stream_typecode {
 | 
			
		||||
  DDS_OP_VAL_1BY = 0x01, /* one byte simple type (char, octet, boolean) */
 | 
			
		||||
  DDS_OP_VAL_2BY = 0x02, /* two byte simple type ((unsigned) short) */
 | 
			
		||||
  DDS_OP_VAL_4BY = 0x03, /* four byte simple type ((unsigned) long, enums, float) */
 | 
			
		||||
  DDS_OP_VAL_8BY = 0x04, /* eight byte simple type ((unsigned) long long, double) */
 | 
			
		||||
  DDS_OP_VAL_STR = 0x05, /* string */
 | 
			
		||||
  DDS_OP_VAL_BST = 0x06, /* bounded string */
 | 
			
		||||
  DDS_OP_VAL_SEQ = 0x07, /* sequence */
 | 
			
		||||
  DDS_OP_VAL_ARR = 0x08, /* array */
 | 
			
		||||
  DDS_OP_VAL_UNI = 0x09, /* union */
 | 
			
		||||
  DDS_OP_VAL_STU = 0x0a  /* struct */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* primary type code for DDS_OP_ADR, DDS_OP_JEQ */
 | 
			
		||||
enum dds_stream_typecode_primary {
 | 
			
		||||
  DDS_OP_TYPE_1BY = DDS_OP_VAL_1BY << 16,
 | 
			
		||||
  DDS_OP_TYPE_2BY = DDS_OP_VAL_2BY << 16,
 | 
			
		||||
  DDS_OP_TYPE_4BY = DDS_OP_VAL_4BY << 16,
 | 
			
		||||
  DDS_OP_TYPE_8BY = DDS_OP_VAL_8BY << 16,
 | 
			
		||||
  DDS_OP_TYPE_STR = DDS_OP_VAL_STR << 16,
 | 
			
		||||
  DDS_OP_TYPE_BST = DDS_OP_VAL_BST << 16,
 | 
			
		||||
  DDS_OP_TYPE_SEQ = DDS_OP_VAL_SEQ << 16,
 | 
			
		||||
  DDS_OP_TYPE_ARR = DDS_OP_VAL_ARR << 16,
 | 
			
		||||
  DDS_OP_TYPE_UNI = DDS_OP_VAL_UNI << 16,
 | 
			
		||||
  DDS_OP_TYPE_STU = DDS_OP_VAL_STU << 16
 | 
			
		||||
};
 | 
			
		||||
#define DDS_OP_TYPE_BOO DDS_OP_TYPE_1BY
 | 
			
		||||
 | 
			
		||||
/* sub-type code:
 | 
			
		||||
   - encodes element type for DDS_OP_TYPE_{SEQ,ARR},
 | 
			
		||||
   - discriminant type for DDS_OP_TYPE_UNI */
 | 
			
		||||
enum dds_stream_typecode_subtype {
 | 
			
		||||
  DDS_OP_SUBTYPE_1BY = DDS_OP_VAL_1BY << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_2BY = DDS_OP_VAL_2BY << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_4BY = DDS_OP_VAL_4BY << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_8BY = DDS_OP_VAL_8BY << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_STR = DDS_OP_VAL_STR << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_BST = DDS_OP_VAL_BST << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_SEQ = DDS_OP_VAL_SEQ << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_ARR = DDS_OP_VAL_ARR << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_UNI = DDS_OP_VAL_UNI << 8,
 | 
			
		||||
  DDS_OP_SUBTYPE_STU = DDS_OP_VAL_STU << 8
 | 
			
		||||
};
 | 
			
		||||
#define DDS_OP_SUBTYPE_BOO DDS_OP_SUBTYPE_1BY
 | 
			
		||||
 | 
			
		||||
#define DDS_OP_SUBTYPE_1BY (DDS_OP_VAL_1BY << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_2BY (DDS_OP_VAL_2BY << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_4BY (DDS_OP_VAL_4BY << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_8BY (DDS_OP_VAL_8BY << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_STR (DDS_OP_VAL_STR << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_SEQ (DDS_OP_VAL_SEQ << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_ARR (DDS_OP_VAL_ARR << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_UNI (DDS_OP_VAL_UNI << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_STU (DDS_OP_VAL_STU << 8)
 | 
			
		||||
#define DDS_OP_SUBTYPE_BST (DDS_OP_VAL_BST << 8)
 | 
			
		||||
 | 
			
		||||
#define DDS_OP_FLAG_KEY 0x01
 | 
			
		||||
#define DDS_OP_FLAG_DEF 0x02
 | 
			
		||||
#define DDS_OP_FLAG_KEY 0x01 /* key field: applicable to {1,2,4,8}BY, STR, BST, ARR-of-{1,2,4,8}BY */
 | 
			
		||||
#define DDS_OP_FLAG_DEF 0x02 /* union has a default case (for DDS_OP_ADR | DDS_OP_TYPE_UNI) */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description : Enable or disable write batching. Overrides default configuration
 | 
			
		||||
 * setting for write batching (DDSI2E/Internal/WriteBatch).
 | 
			
		||||
 * setting for write batching (Internal/WriteBatch).
 | 
			
		||||
 *
 | 
			
		||||
 * Arguments :
 | 
			
		||||
 *   -# enable Enables or disables write batching for all writers.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT void dds_write_set_batch (bool enable);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description : Install tcp/ssl and encryption support. Depends on openssl.
 | 
			
		||||
 *
 | 
			
		||||
 * Arguments :
 | 
			
		||||
 *   -# None
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT void dds_ssl_plugin (void);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description : Install client durability support. Depends on OSPL server.
 | 
			
		||||
 *
 | 
			
		||||
 * Arguments :
 | 
			
		||||
 *   -# None
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT void dds_durability_plugin (void);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,131 +21,12 @@
 | 
			
		|||
#define DDS_QOS_H
 | 
			
		||||
 | 
			
		||||
#include "dds/export.h"
 | 
			
		||||
#include "dds/ddsc/dds_public_qosdefs.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* QoS identifiers */
 | 
			
		||||
/** @name QoS identifiers
 | 
			
		||||
  @{**/
 | 
			
		||||
#define DDS_INVALID_QOS_POLICY_ID 0
 | 
			
		||||
#define DDS_USERDATA_QOS_POLICY_ID 1
 | 
			
		||||
#define DDS_DURABILITY_QOS_POLICY_ID 2
 | 
			
		||||
#define DDS_PRESENTATION_QOS_POLICY_ID 3
 | 
			
		||||
#define DDS_DEADLINE_QOS_POLICY_ID 4
 | 
			
		||||
#define DDS_LATENCYBUDGET_QOS_POLICY_ID 5
 | 
			
		||||
#define DDS_OWNERSHIP_QOS_POLICY_ID 6
 | 
			
		||||
#define DDS_OWNERSHIPSTRENGTH_QOS_POLICY_ID 7
 | 
			
		||||
#define DDS_LIVELINESS_QOS_POLICY_ID 8
 | 
			
		||||
#define DDS_TIMEBASEDFILTER_QOS_POLICY_ID 9
 | 
			
		||||
#define DDS_PARTITION_QOS_POLICY_ID 10
 | 
			
		||||
#define DDS_RELIABILITY_QOS_POLICY_ID 11
 | 
			
		||||
#define DDS_DESTINATIONORDER_QOS_POLICY_ID 12
 | 
			
		||||
#define DDS_HISTORY_QOS_POLICY_ID 13
 | 
			
		||||
#define DDS_RESOURCELIMITS_QOS_POLICY_ID 14
 | 
			
		||||
#define DDS_ENTITYFACTORY_QOS_POLICY_ID 15
 | 
			
		||||
#define DDS_WRITERDATALIFECYCLE_QOS_POLICY_ID 16
 | 
			
		||||
#define DDS_READERDATALIFECYCLE_QOS_POLICY_ID 17
 | 
			
		||||
#define DDS_TOPICDATA_QOS_POLICY_ID 18
 | 
			
		||||
#define DDS_GROUPDATA_QOS_POLICY_ID 19
 | 
			
		||||
#define DDS_TRANSPORTPRIORITY_QOS_POLICY_ID 20
 | 
			
		||||
#define DDS_LIFESPAN_QOS_POLICY_ID 21
 | 
			
		||||
#define DDS_DURABILITYSERVICE_QOS_POLICY_ID 22
 | 
			
		||||
/** @}*/
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* QoS structure is opaque */
 | 
			
		||||
/** QoS structure */
 | 
			
		||||
typedef struct nn_xqos dds_qos_t;
 | 
			
		||||
 | 
			
		||||
/** Durability QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_durability_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_DURABILITY_VOLATILE,
 | 
			
		||||
    DDS_DURABILITY_TRANSIENT_LOCAL,
 | 
			
		||||
    DDS_DURABILITY_TRANSIENT,
 | 
			
		||||
    DDS_DURABILITY_PERSISTENT
 | 
			
		||||
}
 | 
			
		||||
dds_durability_kind_t;
 | 
			
		||||
 | 
			
		||||
/** History QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_history_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_HISTORY_KEEP_LAST,
 | 
			
		||||
    DDS_HISTORY_KEEP_ALL
 | 
			
		||||
}
 | 
			
		||||
dds_history_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Ownership QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_ownership_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_OWNERSHIP_SHARED,
 | 
			
		||||
    DDS_OWNERSHIP_EXCLUSIVE
 | 
			
		||||
}
 | 
			
		||||
dds_ownership_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Liveliness QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_liveliness_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_LIVELINESS_AUTOMATIC,
 | 
			
		||||
    DDS_LIVELINESS_MANUAL_BY_PARTICIPANT,
 | 
			
		||||
    DDS_LIVELINESS_MANUAL_BY_TOPIC
 | 
			
		||||
}
 | 
			
		||||
dds_liveliness_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Reliability QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_reliability_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_RELIABILITY_BEST_EFFORT,
 | 
			
		||||
    DDS_RELIABILITY_RELIABLE
 | 
			
		||||
}
 | 
			
		||||
dds_reliability_kind_t;
 | 
			
		||||
 | 
			
		||||
/** DestinationOrder QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_destination_order_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_DESTINATIONORDER_BY_RECEPTION_TIMESTAMP,
 | 
			
		||||
    DDS_DESTINATIONORDER_BY_SOURCE_TIMESTAMP
 | 
			
		||||
}
 | 
			
		||||
dds_destination_order_kind_t;
 | 
			
		||||
 | 
			
		||||
/** History QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef struct dds_history_qospolicy
 | 
			
		||||
{
 | 
			
		||||
    dds_history_kind_t kind;
 | 
			
		||||
    int32_t depth;
 | 
			
		||||
}
 | 
			
		||||
dds_history_qospolicy_t;
 | 
			
		||||
 | 
			
		||||
/** ResourceLimits QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef struct dds_resource_limits_qospolicy
 | 
			
		||||
{
 | 
			
		||||
    int32_t max_samples;
 | 
			
		||||
    int32_t max_instances;
 | 
			
		||||
    int32_t max_samples_per_instance;
 | 
			
		||||
}
 | 
			
		||||
dds_resource_limits_qospolicy_t;
 | 
			
		||||
 | 
			
		||||
/** Presentation QoS: Applies to Publisher, Subscriber */
 | 
			
		||||
typedef enum dds_presentation_access_scope_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_PRESENTATION_INSTANCE,
 | 
			
		||||
    DDS_PRESENTATION_TOPIC,
 | 
			
		||||
    DDS_PRESENTATION_GROUP
 | 
			
		||||
}
 | 
			
		||||
dds_presentation_access_scope_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Ignore-local QoS: Applies to DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_ignorelocal_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_IGNORELOCAL_NONE,
 | 
			
		||||
    DDS_IGNORELOCAL_PARTICIPANT,
 | 
			
		||||
    DDS_IGNORELOCAL_PROCESS
 | 
			
		||||
}
 | 
			
		||||
dds_ignorelocal_kind_t;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @brief Allocate memory and initialize default QoS-policies
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -212,8 +93,8 @@ dds_qos_merge (dds_qos_t * __restrict dst, const dds_qos_t * __restrict src);
 | 
			
		|||
 *
 | 
			
		||||
 * Policies are copied from src to dst, unless src already has the policy set to a non-default value.
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in,out] dst - Pointer to the destination qos structure
 | 
			
		||||
 * @param[in] src - Pointer to the source qos structure
 | 
			
		||||
 * @param[in,out] a - Pointer to the destination qos structure
 | 
			
		||||
 * @param[in] b - Pointer to the source qos structure
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT bool
 | 
			
		||||
dds_qos_equal (const dds_qos_t * __restrict a, const dds_qos_t * __restrict b);
 | 
			
		||||
| 
						 | 
				
			
			@ -448,7 +329,7 @@ dds_qset_destination_order (
 | 
			
		|||
 * @brief Set the writer data-lifecycle policy of a qos structure
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in,out] qos - Pointer to a dds_qos_t structure that will store the policy
 | 
			
		||||
 * @param[in] autodispose_unregistered_instances - Automatic disposal of unregistered instances
 | 
			
		||||
 * @param[in] autodispose - Automatic disposal of unregistered instances
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT void
 | 
			
		||||
dds_qset_writer_data_lifecycle (dds_qos_t * __restrict qos, bool autodispose);
 | 
			
		||||
| 
						 | 
				
			
			@ -493,7 +374,8 @@ dds_qset_durability_service (
 | 
			
		|||
 * @param[in,out] qos - Pointer to a dds_qos_t structure that will store the policy
 | 
			
		||||
 * @param[in] ignore - True if readers and writers owned by the same participant should be ignored
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT void dds_qset_ignorelocal (
 | 
			
		||||
DDS_EXPORT void
 | 
			
		||||
dds_qset_ignorelocal (
 | 
			
		||||
  dds_qos_t * __restrict qos,
 | 
			
		||||
  dds_ignorelocal_kind_t ignore);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -738,7 +620,7 @@ dds_qget_destination_order (
 | 
			
		|||
 * @brief Get the writer data-lifecycle qos policy
 | 
			
		||||
 *
 | 
			
		||||
 * @param[in] qos - Pointer to a dds_qos_t structure storing the policy
 | 
			
		||||
 * @param[in,out] autodispose_unregistered_instances - Pointer that will store the autodispose unregistered instances enable value
 | 
			
		||||
 * @param[in,out] autodispose - Pointer that will store the autodispose unregistered instances enable value
 | 
			
		||||
 *
 | 
			
		||||
 * @returns - false iff any of the arguments is invalid or the qos is not present in the qos object
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										132
									
								
								src/core/ddsc/include/dds/ddsc/dds_public_qosdefs.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								src/core/ddsc/include/dds/ddsc/dds_public_qosdefs.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,132 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * @brief DDS C QoS API
 | 
			
		||||
 *
 | 
			
		||||
 * This header file defines the public API of QoS and Policies in the
 | 
			
		||||
 * Eclipse Cyclone DDS C language binding.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef DDS_QOSDEFS_H
 | 
			
		||||
#define DDS_QOSDEFS_H
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define DDS_LENGTH_UNLIMITED -1
 | 
			
		||||
 | 
			
		||||
/** QoS identifiers */
 | 
			
		||||
typedef enum dds_qos_policy_id {
 | 
			
		||||
  DDS_INVALID_QOS_POLICY_ID,
 | 
			
		||||
  DDS_USERDATA_QOS_POLICY_ID,
 | 
			
		||||
  DDS_DURABILITY_QOS_POLICY_ID,
 | 
			
		||||
  DDS_PRESENTATION_QOS_POLICY_ID,
 | 
			
		||||
  DDS_DEADLINE_QOS_POLICY_ID,
 | 
			
		||||
  DDS_LATENCYBUDGET_QOS_POLICY_ID,
 | 
			
		||||
  DDS_OWNERSHIP_QOS_POLICY_ID,
 | 
			
		||||
  DDS_OWNERSHIPSTRENGTH_QOS_POLICY_ID,
 | 
			
		||||
  DDS_LIVELINESS_QOS_POLICY_ID,
 | 
			
		||||
  DDS_TIMEBASEDFILTER_QOS_POLICY_ID,
 | 
			
		||||
  DDS_PARTITION_QOS_POLICY_ID,
 | 
			
		||||
  DDS_RELIABILITY_QOS_POLICY_ID,
 | 
			
		||||
  DDS_DESTINATIONORDER_QOS_POLICY_ID,
 | 
			
		||||
  DDS_HISTORY_QOS_POLICY_ID,
 | 
			
		||||
  DDS_RESOURCELIMITS_QOS_POLICY_ID,
 | 
			
		||||
  DDS_ENTITYFACTORY_QOS_POLICY_ID,
 | 
			
		||||
  DDS_WRITERDATALIFECYCLE_QOS_POLICY_ID,
 | 
			
		||||
  DDS_READERDATALIFECYCLE_QOS_POLICY_ID,
 | 
			
		||||
  DDS_TOPICDATA_QOS_POLICY_ID,
 | 
			
		||||
  DDS_GROUPDATA_QOS_POLICY_ID,
 | 
			
		||||
  DDS_TRANSPORTPRIORITY_QOS_POLICY_ID,
 | 
			
		||||
  DDS_LIFESPAN_QOS_POLICY_ID,
 | 
			
		||||
  DDS_DURABILITYSERVICE_QOS_POLICY_ID
 | 
			
		||||
} dds_qos_policy_id_t;
 | 
			
		||||
 | 
			
		||||
/* QoS structure is opaque */
 | 
			
		||||
/** QoS structure */
 | 
			
		||||
typedef struct dds_qos dds_qos_t;
 | 
			
		||||
 | 
			
		||||
/** Durability QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_durability_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_DURABILITY_VOLATILE,
 | 
			
		||||
    DDS_DURABILITY_TRANSIENT_LOCAL,
 | 
			
		||||
    DDS_DURABILITY_TRANSIENT,
 | 
			
		||||
    DDS_DURABILITY_PERSISTENT
 | 
			
		||||
}
 | 
			
		||||
dds_durability_kind_t;
 | 
			
		||||
 | 
			
		||||
/** History QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_history_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_HISTORY_KEEP_LAST,
 | 
			
		||||
    DDS_HISTORY_KEEP_ALL
 | 
			
		||||
}
 | 
			
		||||
dds_history_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Ownership QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_ownership_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_OWNERSHIP_SHARED,
 | 
			
		||||
    DDS_OWNERSHIP_EXCLUSIVE
 | 
			
		||||
}
 | 
			
		||||
dds_ownership_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Liveliness QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_liveliness_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_LIVELINESS_AUTOMATIC,
 | 
			
		||||
    DDS_LIVELINESS_MANUAL_BY_PARTICIPANT,
 | 
			
		||||
    DDS_LIVELINESS_MANUAL_BY_TOPIC
 | 
			
		||||
}
 | 
			
		||||
dds_liveliness_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Reliability QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_reliability_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_RELIABILITY_BEST_EFFORT,
 | 
			
		||||
    DDS_RELIABILITY_RELIABLE
 | 
			
		||||
}
 | 
			
		||||
dds_reliability_kind_t;
 | 
			
		||||
 | 
			
		||||
/** DestinationOrder QoS: Applies to Topic, DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_destination_order_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_DESTINATIONORDER_BY_RECEPTION_TIMESTAMP,
 | 
			
		||||
    DDS_DESTINATIONORDER_BY_SOURCE_TIMESTAMP
 | 
			
		||||
}
 | 
			
		||||
dds_destination_order_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Presentation QoS: Applies to Publisher, Subscriber */
 | 
			
		||||
typedef enum dds_presentation_access_scope_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_PRESENTATION_INSTANCE,
 | 
			
		||||
    DDS_PRESENTATION_TOPIC,
 | 
			
		||||
    DDS_PRESENTATION_GROUP
 | 
			
		||||
}
 | 
			
		||||
dds_presentation_access_scope_kind_t;
 | 
			
		||||
 | 
			
		||||
/** Ignore-local QoS: Applies to DataReader, DataWriter */
 | 
			
		||||
typedef enum dds_ignorelocal_kind
 | 
			
		||||
{
 | 
			
		||||
    DDS_IGNORELOCAL_NONE,
 | 
			
		||||
    DDS_IGNORELOCAL_PARTICIPANT,
 | 
			
		||||
    DDS_IGNORELOCAL_PROCESS
 | 
			
		||||
}
 | 
			
		||||
dds_ignorelocal_kind_t;
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -185,7 +185,7 @@ dds_inconsistent_topic_status_t;
 | 
			
		|||
 * @param[out] status The pointer to \ref DCPS_Status_InconsistentTopic to get the status
 | 
			
		||||
 *
 | 
			
		||||
 * @returns  0 - Success
 | 
			
		||||
 * @returns <0 - Failure (use dds_err_nr() to get error value).
 | 
			
		||||
 * @returns <0 - Failure
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_ERROR
 | 
			
		||||
 *                  An internal error has occurred.
 | 
			
		||||
| 
						 | 
				
			
			@ -212,7 +212,7 @@ dds_get_inconsistent_topic_status (
 | 
			
		|||
 * @param[out] status  The pointer to \ref DCPS_Status_PublicationMatched to get the status
 | 
			
		||||
 *
 | 
			
		||||
 * @returns  0 - Success
 | 
			
		||||
 * @returns <0 - Failure (use dds_err_nr() to get error value).
 | 
			
		||||
 * @returns <0 - Failure
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_ERROR
 | 
			
		||||
 *                  An internal error has occurred.
 | 
			
		||||
| 
						 | 
				
			
			@ -239,7 +239,7 @@ dds_get_publication_matched_status (
 | 
			
		|||
 * @param[out] status  The pointer to \ref DCPS_Status_LivelinessLost to get the status
 | 
			
		||||
 *
 | 
			
		||||
 * @returns  0 - Success
 | 
			
		||||
 * @returns <0 - Failure (use dds_err_nr() to get error value).
 | 
			
		||||
 * @returns <0 - Failure
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_ERROR
 | 
			
		||||
 *                  An internal error has occurred.
 | 
			
		||||
| 
						 | 
				
			
			@ -266,7 +266,7 @@ dds_get_liveliness_lost_status (
 | 
			
		|||
 * @param[out] status  The pointer to \ref DCPS_Status_OfferedDeadlineMissed to get the status
 | 
			
		||||
 *
 | 
			
		||||
 * @returns  0 - Success
 | 
			
		||||
 * @returns <0 - Failure (use dds_err_nr() to get error value).
 | 
			
		||||
 * @returns <0 - Failure
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_ERROR
 | 
			
		||||
 *                  An internal error has occurred.
 | 
			
		||||
| 
						 | 
				
			
			@ -293,7 +293,7 @@ dds_get_offered_deadline_missed_status(
 | 
			
		|||
 * @param[out] status  The pointer to \ref DCPS_Status_OfferedIncompatibleQoS to get the status
 | 
			
		||||
 *
 | 
			
		||||
 * @returns  0 - Success
 | 
			
		||||
 * @returns <0 - Failure (use dds_err_nr() to get error value).
 | 
			
		||||
 * @returns <0 - Failure
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_ERROR
 | 
			
		||||
 *                  An internal error has occurred.
 | 
			
		||||
| 
						 | 
				
			
			@ -320,7 +320,7 @@ dds_get_offered_incompatible_qos_status (
 | 
			
		|||
 * @param[out] status  The pointer to \ref DCPS_Status_SubscriptionMatched to get the status
 | 
			
		||||
 *
 | 
			
		||||
 * @returns  0 - Success
 | 
			
		||||
 * @returns <0 - Failure (use dds_err_nr() to get error value).
 | 
			
		||||
 * @returns <0 - Failure
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_ERROR
 | 
			
		||||
 *                  An internal error has occurred.
 | 
			
		||||
| 
						 | 
				
			
			@ -347,7 +347,7 @@ dds_get_subscription_matched_status (
 | 
			
		|||
 * @param[out] status  The pointer to \ref DCPS_Status_LivelinessChanged to get the status
 | 
			
		||||
 *
 | 
			
		||||
 * @returns  0 - Success
 | 
			
		||||
 * @returns <0 - Failure (use dds_err_nr() to get error value).
 | 
			
		||||
 * @returns <0 - Failure
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_ERROR
 | 
			
		||||
 *                  An internal error has occurred.
 | 
			
		||||
| 
						 | 
				
			
			@ -374,7 +374,7 @@ dds_get_liveliness_changed_status (
 | 
			
		|||
 * @param[out] status  The pointer to \ref DCPS_Status_SampleRejected to get the status
 | 
			
		||||
 *
 | 
			
		||||
 * @returns  0 - Success
 | 
			
		||||
 * @returns <0 - Failure (use dds_err_nr() to get error value).
 | 
			
		||||
 * @returns <0 - Failure
 | 
			
		||||
 *
 | 
			
		||||
 * @retval DDS_RETCODE_ERROR
 | 
			
		||||
 *                  An internal error has occurred.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,108 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** @file
 | 
			
		||||
 *
 | 
			
		||||
 * @brief DDS C Stream API
 | 
			
		||||
 *
 | 
			
		||||
 * This header file defines the public API of the Streams in the
 | 
			
		||||
 * Eclipse Cyclone DDS C language binding.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef DDS_STREAM_H
 | 
			
		||||
#define DDS_STREAM_H
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/export.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct dds_sequence;
 | 
			
		||||
 | 
			
		||||
typedef union
 | 
			
		||||
{
 | 
			
		||||
  uint8_t * p8;
 | 
			
		||||
  uint16_t * p16;
 | 
			
		||||
  uint32_t * p32;
 | 
			
		||||
  uint64_t * p64;
 | 
			
		||||
  float * pf;
 | 
			
		||||
  double * pd;
 | 
			
		||||
  void * pv;
 | 
			
		||||
}
 | 
			
		||||
dds_uptr_t;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_stream
 | 
			
		||||
{
 | 
			
		||||
  dds_uptr_t m_buffer;  /* Union of pointers to start of buffer */
 | 
			
		||||
  uint32_t m_size;      /* Buffer size */
 | 
			
		||||
  uint32_t m_index;     /* Read/write offset from start of buffer */
 | 
			
		||||
  bool m_endian;        /* Endian: big (false) or little (true) */
 | 
			
		||||
  bool m_failed;        /* Attempt made to read beyond end of buffer */
 | 
			
		||||
}
 | 
			
		||||
dds_stream_t;
 | 
			
		||||
 | 
			
		||||
#define DDS_STREAM_BE false
 | 
			
		||||
#define DDS_STREAM_LE true
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_stream_t * dds_stream_create (uint32_t size);
 | 
			
		||||
DDS_EXPORT dds_stream_t * dds_stream_from_buffer (const void *buf, size_t sz, int bswap);
 | 
			
		||||
DDS_EXPORT void dds_stream_delete (dds_stream_t * st);
 | 
			
		||||
DDS_EXPORT void dds_stream_fini (dds_stream_t * st);
 | 
			
		||||
DDS_EXPORT void dds_stream_reset (dds_stream_t * st);
 | 
			
		||||
DDS_EXPORT void dds_stream_init (dds_stream_t * st, uint32_t size);
 | 
			
		||||
DDS_EXPORT void dds_stream_grow (dds_stream_t * st, uint32_t size);
 | 
			
		||||
DDS_EXPORT bool dds_stream_endian (void);
 | 
			
		||||
 | 
			
		||||
struct dds_topic_descriptor;
 | 
			
		||||
DDS_EXPORT void dds_stream_read_sample_w_desc (dds_stream_t * is, void * data, const struct dds_topic_descriptor * desc);
 | 
			
		||||
DDS_EXPORT bool dds_stream_read_bool (dds_stream_t * is);
 | 
			
		||||
DDS_EXPORT uint8_t dds_stream_read_uint8 (dds_stream_t * is);
 | 
			
		||||
DDS_EXPORT uint16_t dds_stream_read_uint16 (dds_stream_t * is);
 | 
			
		||||
DDS_EXPORT uint32_t dds_stream_read_uint32 (dds_stream_t * is);
 | 
			
		||||
DDS_EXPORT uint64_t dds_stream_read_uint64 (dds_stream_t * is);
 | 
			
		||||
DDS_EXPORT float dds_stream_read_float (dds_stream_t * is);
 | 
			
		||||
DDS_EXPORT double dds_stream_read_double (dds_stream_t * is);
 | 
			
		||||
DDS_EXPORT char * dds_stream_read_string (dds_stream_t * is);
 | 
			
		||||
DDS_EXPORT void dds_stream_read_buffer (dds_stream_t * is, uint8_t * buffer, uint32_t len);
 | 
			
		||||
 | 
			
		||||
inline char dds_stream_read_char (dds_stream_t *is) { return (char) dds_stream_read_uint8 (is); }
 | 
			
		||||
inline int8_t dds_stream_read_int8 (dds_stream_t *is) { return (int8_t) dds_stream_read_uint8 (is); }
 | 
			
		||||
inline int16_t dds_stream_read_int16 (dds_stream_t *is) { return (int16_t) dds_stream_read_uint16 (is); }
 | 
			
		||||
inline int32_t dds_stream_read_int32 (dds_stream_t *is) { return (int32_t) dds_stream_read_uint32 (is); }
 | 
			
		||||
inline int64_t dds_stream_read_int64 (dds_stream_t *is) { return (int64_t) dds_stream_read_uint64 (is); }
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_stream_write_bool (dds_stream_t * os, bool val);
 | 
			
		||||
DDS_EXPORT void dds_stream_write_uint8 (dds_stream_t * os, uint8_t val);
 | 
			
		||||
DDS_EXPORT void dds_stream_write_uint16 (dds_stream_t * os, uint16_t val);
 | 
			
		||||
DDS_EXPORT void dds_stream_write_uint32 (dds_stream_t * os, uint32_t val);
 | 
			
		||||
DDS_EXPORT void dds_stream_write_uint64 (dds_stream_t * os, uint64_t val);
 | 
			
		||||
DDS_EXPORT void dds_stream_write_float (dds_stream_t * os, float val);
 | 
			
		||||
DDS_EXPORT void dds_stream_write_double (dds_stream_t * os, double val);
 | 
			
		||||
DDS_EXPORT void dds_stream_write_string (dds_stream_t * os, const char * val);
 | 
			
		||||
DDS_EXPORT void dds_stream_write_buffer (dds_stream_t * os, uint32_t len, const uint8_t * buffer);
 | 
			
		||||
DDS_EXPORT void *dds_stream_address (dds_stream_t * s);
 | 
			
		||||
DDS_EXPORT void *dds_stream_alignto (dds_stream_t * s, uint32_t a);
 | 
			
		||||
 | 
			
		||||
inline void dds_stream_write_char (dds_stream_t * os, char val) { dds_stream_write_uint8 (os, (uint8_t) val); }
 | 
			
		||||
inline void dds_stream_write_int8 (dds_stream_t * os, int8_t val) { dds_stream_write_uint8 (os, (uint8_t) val); }
 | 
			
		||||
inline void dds_stream_write_int16 (dds_stream_t * os, int16_t val) { dds_stream_write_uint16 (os, (uint16_t) val); }
 | 
			
		||||
inline void dds_stream_write_int32 (dds_stream_t * os, int32_t val) { dds_stream_write_uint32 (os, (uint32_t) val); }
 | 
			
		||||
inline void dds_stream_write_int64 (dds_stream_t * os, int64_t val) { dds_stream_write_uint64 (os, (uint64_t) val); }
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -12,7 +12,7 @@
 | 
			
		|||
#ifndef _DDS_BUILTIN_H_
 | 
			
		||||
#define _DDS_BUILTIN_H_
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_builtin_topic_if.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C"
 | 
			
		||||
| 
						 | 
				
			
			@ -20,24 +20,19 @@ extern "C"
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
/* Get actual topic in related participant related to topic 'id'. */
 | 
			
		||||
dds_entity_t dds__get_builtin_topic ( dds_entity_t e, dds_entity_t topic);
 | 
			
		||||
dds_entity_t dds__get_builtin_topic (dds_entity_t e, dds_entity_t topic);
 | 
			
		||||
 | 
			
		||||
/* Subscriber singleton within related participant. */
 | 
			
		||||
dds_entity_t dds__get_builtin_subscriber(dds_entity_t e);
 | 
			
		||||
dds_entity_t dds__get_builtin_subscriber (dds_entity_t e);
 | 
			
		||||
 | 
			
		||||
/* Checks whether the reader QoS is valid for use with built-in topic TOPIC */
 | 
			
		||||
bool dds__validate_builtin_reader_qos(dds_entity_t topic, const dds_qos_t *qos);
 | 
			
		||||
bool dds__validate_builtin_reader_qos (const dds_domain *dom, dds_entity_t topic, const dds_qos_t *qos);
 | 
			
		||||
 | 
			
		||||
void dds__builtin_init (struct dds_domain *dom);
 | 
			
		||||
void dds__builtin_fini (struct dds_domain *dom);
 | 
			
		||||
 | 
			
		||||
struct entity_common;
 | 
			
		||||
struct nn_guid;
 | 
			
		||||
struct ddsi_tkmap_instance;
 | 
			
		||||
 | 
			
		||||
void dds__builtin_init (void);
 | 
			
		||||
void dds__builtin_fini (void);
 | 
			
		||||
bool dds__builtin_is_visible (nn_entityid_t entityid, bool onlylocal, nn_vendorid_t vendorid);
 | 
			
		||||
struct ddsi_tkmap_instance *dds__builtin_get_tkmap_entry (const struct nn_guid *guid);
 | 
			
		||||
struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn_wctime_t timestamp, bool alive);
 | 
			
		||||
void dds__builtin_write (const struct entity_common *e, nn_wctime_t timestamp, bool alive);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,11 +18,9 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern DDS_EXPORT const ddsrt_avl_treedef_t dds_domaintree_def;
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_domain * dds_domain_create (dds_domainid_t id);
 | 
			
		||||
DDS_EXPORT void dds_domain_free (dds_domain * domain);
 | 
			
		||||
DDS_EXPORT dds_domain * dds_domain_find_locked (dds_domainid_t id);
 | 
			
		||||
DDS_EXPORT dds_return_t dds_domain_create (dds_domain **domain_out, dds_domainid_t id);
 | 
			
		||||
DDS_EXPORT void dds_domain_free (dds_domain *domain);
 | 
			
		||||
DDS_EXPORT dds_domain *dds_domain_find_locked (dds_domainid_t id);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,20 +26,22 @@ dds_entity_init(
 | 
			
		|||
  dds_entity_kind_t kind,
 | 
			
		||||
  dds_qos_t * qos,
 | 
			
		||||
  const dds_listener_t *listener,
 | 
			
		||||
  uint32_t mask);
 | 
			
		||||
  status_mask_t mask);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void
 | 
			
		||||
dds_entity_add_ref(dds_entity *e);
 | 
			
		||||
dds_entity_register_child (
 | 
			
		||||
  dds_entity *parent,
 | 
			
		||||
  dds_entity *child);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void
 | 
			
		||||
dds_entity_add_ref_nolock(dds_entity *e);
 | 
			
		||||
dds_entity_add_ref_locked(dds_entity *e);
 | 
			
		||||
 | 
			
		||||
#define DEFINE_ENTITY_LOCK_UNLOCK(qualifier_, type_, kind_) \
 | 
			
		||||
  qualifier_ dds_retcode_t type_##_lock (dds_entity_t hdl, type_ **x) \
 | 
			
		||||
  qualifier_ dds_return_t type_##_lock (dds_entity_t hdl, type_ **x) \
 | 
			
		||||
  { \
 | 
			
		||||
    dds_retcode_t rc; \
 | 
			
		||||
    dds_return_t rc; \
 | 
			
		||||
    dds_entity *e; \
 | 
			
		||||
    if ((rc = dds_entity_lock (hdl, kind_, &e)) != DDS_RETCODE_OK) \
 | 
			
		||||
    if ((rc = dds_entity_lock (hdl, kind_, &e)) < 0) \
 | 
			
		||||
      return rc; \
 | 
			
		||||
    *x = (type_ *) e; \
 | 
			
		||||
    return DDS_RETCODE_OK; \
 | 
			
		||||
| 
						 | 
				
			
			@ -50,7 +52,7 @@ dds_entity_add_ref_nolock(dds_entity *e);
 | 
			
		|||
    dds_entity_unlock (&x->m_entity); \
 | 
			
		||||
  }
 | 
			
		||||
#define DECL_ENTITY_LOCK_UNLOCK(qualifier_, type_) \
 | 
			
		||||
  qualifier_ dds_retcode_t type_##_lock (dds_entity_t hdl, type_ **x); \
 | 
			
		||||
  qualifier_ dds_return_t type_##_lock (dds_entity_t hdl, type_ **x); \
 | 
			
		||||
  qualifier_ void type_##_unlock (type_ *x);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT inline dds_entity *dds_entity_from_handle_link (struct dds_handle_link *hdllink) {
 | 
			
		||||
| 
						 | 
				
			
			@ -61,33 +63,30 @@ DDS_EXPORT inline bool dds_entity_is_enabled (const dds_entity *e) {
 | 
			
		|||
  return (e->m_flags & DDS_ENTITY_ENABLED) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_entity_status_set (dds_entity *e, uint32_t t);
 | 
			
		||||
DDS_EXPORT void dds_entity_status_set (dds_entity *e, status_mask_t t);
 | 
			
		||||
DDS_EXPORT void dds_entity_trigger_set (dds_entity *e, uint32_t t);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT inline void dds_entity_status_reset (dds_entity *e, uint32_t t) {
 | 
			
		||||
  e->m_trigger &= ~t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT inline bool dds_entity_status_match (const dds_entity *e, uint32_t t) {
 | 
			
		||||
  return (e->m_trigger & t) != 0;
 | 
			
		||||
DDS_EXPORT inline void dds_entity_status_reset (dds_entity *e, status_mask_t t) {
 | 
			
		||||
  ddsrt_atomic_and32 (&e->m_status.m_status_and_mask, SAM_ENABLED_MASK | (status_mask_t) ~t);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT inline dds_entity_kind_t dds_entity_kind (const dds_entity *e) {
 | 
			
		||||
  return e->m_kind;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_entity_status_signal (dds_entity *e);
 | 
			
		||||
DDS_EXPORT void dds_entity_status_signal (dds_entity *e, uint32_t status);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_entity_invoke_listener (const dds_entity *entity, enum dds_status_id which, const void *vst);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_retcode_t
 | 
			
		||||
dds_entity_claim (
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_entity_pin (
 | 
			
		||||
  dds_entity_t hdl,
 | 
			
		||||
  dds_entity **eptr);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_entity_release (
 | 
			
		||||
DDS_EXPORT void dds_entity_unpin (
 | 
			
		||||
  dds_entity *e);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_retcode_t
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_entity_lock(
 | 
			
		||||
  dds_entity_t hdl,
 | 
			
		||||
  dds_entity_kind_t kind,
 | 
			
		||||
| 
						 | 
				
			
			@ -96,27 +95,17 @@ dds_entity_lock(
 | 
			
		|||
DDS_EXPORT void
 | 
			
		||||
dds_entity_unlock(dds_entity *e);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_retcode_t
 | 
			
		||||
dds_entity_observer_register_nl(
 | 
			
		||||
  dds_entity *observed,
 | 
			
		||||
  dds_entity_t observer,
 | 
			
		||||
  dds_entity_callback cb);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_retcode_t
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_entity_observer_register(
 | 
			
		||||
  dds_entity_t observed,
 | 
			
		||||
  dds_entity_t observer,
 | 
			
		||||
  dds_entity_callback cb);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_retcode_t
 | 
			
		||||
dds_entity_observer_unregister_nl(
 | 
			
		||||
  dds_entity *observed,
 | 
			
		||||
  dds_entity_t observer);
 | 
			
		||||
  dds_entity *observer,
 | 
			
		||||
  dds_entity_callback cb,
 | 
			
		||||
  dds_entity_delete_callback delete_cb);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_retcode_t
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_entity_observer_unregister(
 | 
			
		||||
  dds_entity_t observed,
 | 
			
		||||
  dds_entity_t observer);
 | 
			
		||||
  dds_entity *observed,
 | 
			
		||||
  dds_entity *observer);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_delete_impl(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										56
									
								
								src/core/ddsc/src/dds__get_status.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								src/core/ddsc/src/dds__get_status.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,56 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2019 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_GET_STATUS_H_
 | 
			
		||||
#define _DDS_GET_STATUS_H_
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/countargs.h"
 | 
			
		||||
 | 
			
		||||
#define DDS_GET_STATUS_LOCKED_RESET_1(status_, reset0_) \
 | 
			
		||||
  (ent->m_##status_##_status.reset0_ = 0);
 | 
			
		||||
#define DDS_GET_STATUS_LOCKED_RESET_2(status_, reset0_, reset1_) \
 | 
			
		||||
  (ent->m_##status_##_status.reset0_ = 0); \
 | 
			
		||||
  (ent->m_##status_##_status.reset1_ = 0);
 | 
			
		||||
#define DDS_GET_STATUS_LOCKED_RESET_MSVC_WORKAROUND(x) x
 | 
			
		||||
#define DDS_GET_STATUS_LOCKED_RESET_N1(n_, status_, ...)                \
 | 
			
		||||
  DDS_GET_STATUS_LOCKED_RESET_MSVC_WORKAROUND (DDS_GET_STATUS_LOCKED_RESET_##n_ (status_, __VA_ARGS__))
 | 
			
		||||
#define DDS_GET_STATUS_LOCKED_RESET_N(n_, status_, ...) DDS_GET_STATUS_LOCKED_RESET_N1 (n_, status_, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
#define DDS_GET_STATUS_LOCKED(ent_type_, status_, STATUS_, ...) \
 | 
			
		||||
  static void dds_get_##status_##_status_locked (dds_##ent_type_ *ent, dds_##status_##_status_t *status) \
 | 
			
		||||
  { \
 | 
			
		||||
    if (status) \
 | 
			
		||||
      *status = ent->m_##status_##_status; \
 | 
			
		||||
    if (ddsrt_atomic_ld32 (&ent->m_entity.m_status.m_status_and_mask) & (DDS_##STATUS_##_STATUS << SAM_ENABLED_SHIFT)) { \
 | 
			
		||||
      do { DDS_GET_STATUS_LOCKED_RESET_N (DDSRT_COUNT_ARGS (__VA_ARGS__), status_, __VA_ARGS__) } while (0); \
 | 
			
		||||
      dds_entity_status_reset (&ent->m_entity, DDS_##STATUS_##_STATUS); \
 | 
			
		||||
    } \
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#define DDS_GET_STATUS_COMMON(ent_type_, status_) \
 | 
			
		||||
  dds_return_t dds_get_##status_##_status (dds_entity_t entity, dds_##status_##_status_t *status) \
 | 
			
		||||
  { \
 | 
			
		||||
    dds_##ent_type_ *ent; \
 | 
			
		||||
    dds_return_t ret; \
 | 
			
		||||
    if ((ret = dds_##ent_type_##_lock (entity, &ent)) != DDS_RETCODE_OK) \
 | 
			
		||||
      return ret; \
 | 
			
		||||
    ddsrt_mutex_lock (&ent->m_entity.m_observers_lock); \
 | 
			
		||||
    dds_get_##status_##_status_locked (ent, status); \
 | 
			
		||||
    ddsrt_mutex_unlock (&ent->m_entity.m_observers_lock); \
 | 
			
		||||
    dds_##ent_type_##_unlock (ent); \
 | 
			
		||||
    return DDS_RETCODE_OK; \
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#define DDS_GET_STATUS(ent_type_, status_, STATUS_, ...) \
 | 
			
		||||
  DDS_GET_STATUS_LOCKED (ent_type_, status_, STATUS_, __VA_ARGS__) \
 | 
			
		||||
  DDS_GET_STATUS_COMMON (ent_type_, status_)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +78,7 @@ struct dds_handle_link {
 | 
			
		|||
 * Initialize handleserver singleton.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_handle_server_init(void (*free_via_gc) (void *x));
 | 
			
		||||
dds_handle_server_init(void);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -145,13 +145,13 @@ dds_handle_delete(
 | 
			
		|||
 * Returns OK when succeeded.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT int32_t
 | 
			
		||||
dds_handle_claim(
 | 
			
		||||
dds_handle_pin(
 | 
			
		||||
        dds_handle_t hdl,
 | 
			
		||||
        struct dds_handle_link **entity);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void
 | 
			
		||||
dds_handle_claim_inc(
 | 
			
		||||
dds_handle_repin(
 | 
			
		||||
        struct dds_handle_link *link);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -159,7 +159,7 @@ dds_handle_claim_inc(
 | 
			
		|||
 * The active claims count is decreased.
 | 
			
		||||
 */
 | 
			
		||||
DDS_EXPORT void
 | 
			
		||||
dds_handle_release(
 | 
			
		||||
dds_handle_unpin(
 | 
			
		||||
        struct dds_handle_link *link);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -177,6 +177,9 @@ dds_handle_is_closed(
 | 
			
		|||
        struct dds_handle_link *link);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_handle_add_ref (struct dds_handle_link *link);
 | 
			
		||||
DDS_EXPORT bool dds_handle_drop_ref (struct dds_handle_link *link);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,9 +18,6 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds__check_domain(dds_domainid_t domain);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *Description : Initialization function, called from main. This operation
 | 
			
		||||
 *initializes all the required DDS resources,
 | 
			
		||||
| 
						 | 
				
			
			@ -30,8 +27,7 @@ dds__check_domain(dds_domainid_t domain);
 | 
			
		|||
 *Arguments :
 | 
			
		||||
 *-# Returns 0 on success or a non-zero error status
 | 
			
		||||
 **/
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_init(dds_domainid_t domain);
 | 
			
		||||
dds_return_t dds_init (void);
 | 
			
		||||
 | 
			
		||||
/* Finalization function, called from main */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,16 +38,7 @@ dds_init(dds_domainid_t domain);
 | 
			
		|||
 *Arguments :
 | 
			
		||||
 *-# None
 | 
			
		||||
 **/
 | 
			
		||||
void
 | 
			
		||||
dds_fini(void);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Description : Function that provides the explicit ID of default domain
 | 
			
		||||
 * It should be called after DDS initialization.
 | 
			
		||||
 * @return Valid domain id. Undetermined behaviour if DDS is not initialized.
 | 
			
		||||
 */
 | 
			
		||||
dds_domainid_t dds_domain_default (void);
 | 
			
		||||
 | 
			
		||||
void dds_fini (void);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,35 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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_KEY_H_
 | 
			
		||||
#define _DDS_KEY_H_
 | 
			
		||||
 | 
			
		||||
#include "dds__types.h"
 | 
			
		||||
 | 
			
		||||
struct dds_key_hash;
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void dds_key_md5 (struct dds_key_hash * kh);
 | 
			
		||||
 | 
			
		||||
void dds_key_gen
 | 
			
		||||
(
 | 
			
		||||
  const dds_topic_descriptor_t * const desc,
 | 
			
		||||
  struct dds_key_hash * kh,
 | 
			
		||||
  const char * sample
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -12,24 +12,43 @@
 | 
			
		|||
#ifndef _DDS_QOS_H_
 | 
			
		||||
#define _DDS_QOS_H_
 | 
			
		||||
 | 
			
		||||
#include "dds__entity.h"
 | 
			
		||||
#include "dds/ddsi/q_xqos.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
#include "dds/ddsi/q_plist.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
bool validate_deadline_and_timebased_filter (const nn_duration_t deadline, const nn_duration_t minimum_separation);
 | 
			
		||||
bool validate_entityfactory_qospolicy (const nn_entity_factory_qospolicy_t * entityfactory);
 | 
			
		||||
bool validate_octetseq (const nn_octetseq_t* seq);
 | 
			
		||||
bool validate_partition_qospolicy (const nn_partition_qospolicy_t * partition);
 | 
			
		||||
bool validate_reliability_qospolicy (const nn_reliability_qospolicy_t * reliability);
 | 
			
		||||
bool validate_stringseq (const nn_stringseq_t* seq);
 | 
			
		||||
#define DDS_TOPIC_QOS_MASK                                              \
 | 
			
		||||
  (QP_TOPIC_DATA | QP_DURABILITY | QP_DURABILITY_SERVICE |              \
 | 
			
		||||
   QP_DEADLINE | QP_LATENCY_BUDGET | QP_OWNERSHIP | QP_LIVELINESS |     \
 | 
			
		||||
   QP_RELIABILITY | QP_TRANSPORT_PRIORITY | QP_LIFESPAN |               \
 | 
			
		||||
   QP_DESTINATION_ORDER | QP_HISTORY | QP_RESOURCE_LIMITS)
 | 
			
		||||
 | 
			
		||||
bool dds_qos_validate_common (const dds_qos_t *qos);
 | 
			
		||||
dds_return_t dds_qos_validate_mutable_common (const dds_qos_t *qos);
 | 
			
		||||
#define DDS_PARTICIPANT_QOS_MASK                                        \
 | 
			
		||||
  (QP_USER_DATA | QP_PRISMTECH_ENTITY_FACTORY | QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
 | 
			
		||||
#define DDS_PUBLISHER_QOS_MASK                                          \
 | 
			
		||||
  (QP_PARTITION | QP_PRESENTATION | QP_GROUP_DATA |                     \
 | 
			
		||||
   QP_PRISMTECH_ENTITY_FACTORY | QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
 | 
			
		||||
#define DDS_READER_QOS_MASK                                             \
 | 
			
		||||
  (QP_USER_DATA | QP_DURABILITY | QP_DEADLINE | QP_LATENCY_BUDGET |     \
 | 
			
		||||
   QP_OWNERSHIP | QP_LIVELINESS | QP_TIME_BASED_FILTER |                \
 | 
			
		||||
   QP_RELIABILITY | QP_DESTINATION_ORDER | QP_HISTORY |                 \
 | 
			
		||||
   QP_RESOURCE_LIMITS | QP_PRISMTECH_READER_DATA_LIFECYCLE |            \
 | 
			
		||||
   QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
 | 
			
		||||
#define DDS_SUBSCRIBER_QOS_MASK                                         \
 | 
			
		||||
  (QP_PARTITION | QP_PRESENTATION | QP_GROUP_DATA |                     \
 | 
			
		||||
   QP_PRISMTECH_ENTITY_FACTORY | QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
 | 
			
		||||
#define DDS_WRITER_QOS_MASK                                             \
 | 
			
		||||
  (QP_USER_DATA | QP_DURABILITY | QP_DURABILITY_SERVICE | QP_DEADLINE | \
 | 
			
		||||
   QP_LATENCY_BUDGET | QP_OWNERSHIP | QP_OWNERSHIP_STRENGTH |           \
 | 
			
		||||
   QP_LIVELINESS | QP_RELIABILITY | QP_TRANSPORT_PRIORITY |             \
 | 
			
		||||
   QP_LIFESPAN | QP_DESTINATION_ORDER | QP_HISTORY |                    \
 | 
			
		||||
   QP_RESOURCE_LIMITS | QP_PRISMTECH_WRITER_DATA_LIFECYCLE |            \
 | 
			
		||||
   QP_CYCLONE_IGNORELOCAL)
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,60 +12,81 @@
 | 
			
		|||
#ifndef _DDS_RHC_H_
 | 
			
		||||
#define _DDS_RHC_H_
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/static_assert.h"
 | 
			
		||||
#include "dds/ddsi/q_rhc.h"
 | 
			
		||||
#include "dds__types.h" /* for dds_readcond */
 | 
			
		||||
 | 
			
		||||
#define NO_STATE_MASK_SET   (DDS_ANY_STATE + 1)
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct rhc;
 | 
			
		||||
struct nn_xqos;
 | 
			
		||||
struct ddsi_serdata;
 | 
			
		||||
struct ddsi_tkmap_instance;
 | 
			
		||||
struct proxy_writer_info;
 | 
			
		||||
struct dds_rhc;
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT struct rhc *dds_rhc_new (dds_reader *reader, const struct ddsi_sertopic *topic);
 | 
			
		||||
DDS_EXPORT void dds_rhc_free (struct rhc *rhc);
 | 
			
		||||
typedef int (*dds_rhc_read_t) (struct dds_rhc *rhc, bool lock, void **values, dds_sample_info_t *info_seq, uint32_t max_samples, uint32_t mask, dds_instance_handle_t handle, struct dds_readcond *cond);
 | 
			
		||||
typedef int (*dds_rhc_take_t) (struct dds_rhc *rhc, bool lock, void **values, dds_sample_info_t *info_seq, uint32_t max_samples, uint32_t mask, dds_instance_handle_t handle, struct dds_readcond *cond);
 | 
			
		||||
typedef int (*dds_rhc_takecdr_t) (struct dds_rhc *rhc, bool lock, struct ddsi_serdata **values, dds_sample_info_t *info_seq, uint32_t max_samples, uint32_t sample_states, uint32_t view_states, uint32_t instance_states, dds_instance_handle_t handle);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT uint32_t dds_rhc_lock_samples (struct rhc *rhc);
 | 
			
		||||
typedef bool (*dds_rhc_add_readcondition_t) (struct dds_readcond *cond);
 | 
			
		||||
typedef void (*dds_rhc_remove_readcondition_t) (struct dds_readcond *cond);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT bool dds_rhc_store  (struct rhc * __restrict rhc, const struct proxy_writer_info * __restrict pwr_info, struct ddsi_serdata * __restrict sample, struct ddsi_tkmap_instance * __restrict tk);
 | 
			
		||||
DDS_EXPORT void dds_rhc_unregister_wr (struct rhc * __restrict rhc, const struct proxy_writer_info * __restrict pwr_info);
 | 
			
		||||
DDS_EXPORT void dds_rhc_relinquish_ownership (struct rhc * __restrict rhc, const uint64_t wr_iid);
 | 
			
		||||
typedef uint32_t (*dds_rhc_lock_samples_t) (struct dds_rhc *rhc);
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT int
 | 
			
		||||
dds_rhc_read(
 | 
			
		||||
        struct rhc *rhc,
 | 
			
		||||
        bool lock,
 | 
			
		||||
        void ** values,
 | 
			
		||||
        dds_sample_info_t *info_seq,
 | 
			
		||||
        uint32_t max_samples,
 | 
			
		||||
        uint32_t mask,
 | 
			
		||||
        dds_instance_handle_t handle,
 | 
			
		||||
        dds_readcond *cond);
 | 
			
		||||
DDS_EXPORT int
 | 
			
		||||
dds_rhc_take(
 | 
			
		||||
        struct rhc *rhc,
 | 
			
		||||
        bool lock,
 | 
			
		||||
        void ** values,
 | 
			
		||||
        dds_sample_info_t *info_seq,
 | 
			
		||||
        uint32_t max_samples,
 | 
			
		||||
        uint32_t mask,
 | 
			
		||||
        dds_instance_handle_t handle,
 | 
			
		||||
        dds_readcond *cond);
 | 
			
		||||
struct dds_rhc_ops {
 | 
			
		||||
  /* A copy of DDSI rhc ops comes first so we can use either interface without
 | 
			
		||||
     additional indirections */
 | 
			
		||||
  struct rhc_ops rhc_ops;
 | 
			
		||||
  dds_rhc_read_t read;
 | 
			
		||||
  dds_rhc_take_t take;
 | 
			
		||||
  dds_rhc_takecdr_t takecdr;
 | 
			
		||||
  dds_rhc_add_readcondition_t add_readcondition;
 | 
			
		||||
  dds_rhc_remove_readcondition_t remove_readcondition;
 | 
			
		||||
  dds_rhc_lock_samples_t lock_samples;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void dds_rhc_set_qos (struct rhc * rhc, const struct nn_xqos * qos);
 | 
			
		||||
struct dds_rhc {
 | 
			
		||||
  union {
 | 
			
		||||
    const struct dds_rhc_ops *ops;
 | 
			
		||||
    struct rhc rhc;
 | 
			
		||||
  } common;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT bool dds_rhc_add_readcondition (dds_readcond * cond);
 | 
			
		||||
DDS_EXPORT void dds_rhc_remove_readcondition (dds_readcond * cond);
 | 
			
		||||
DDSRT_STATIC_ASSERT (offsetof (struct dds_rhc, common.ops) == offsetof (struct rhc, ops));
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT int dds_rhc_takecdr
 | 
			
		||||
(
 | 
			
		||||
  struct rhc *rhc, bool lock, struct ddsi_serdata **values, dds_sample_info_t *info_seq,
 | 
			
		||||
  uint32_t max_samples, unsigned sample_states,
 | 
			
		||||
  unsigned view_states, unsigned instance_states,
 | 
			
		||||
  dds_instance_handle_t handle
 | 
			
		||||
);
 | 
			
		||||
DDS_EXPORT inline bool dds_rhc_store (struct dds_rhc * __restrict rhc, const struct proxy_writer_info * __restrict pwr_info, struct ddsi_serdata * __restrict sample, struct ddsi_tkmap_instance * __restrict tk) {
 | 
			
		||||
  return rhc->common.ops->rhc_ops.store (&rhc->common.rhc, pwr_info, sample, tk);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline void dds_rhc_unregister_wr (struct dds_rhc * __restrict rhc, const struct proxy_writer_info * __restrict pwr_info) {
 | 
			
		||||
  rhc->common.ops->rhc_ops.unregister_wr (&rhc->common.rhc, pwr_info);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline void dds_rhc_relinquish_ownership (struct dds_rhc * __restrict rhc, const uint64_t wr_iid) {
 | 
			
		||||
  rhc->common.ops->rhc_ops.relinquish_ownership (&rhc->common.rhc, wr_iid);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline void dds_rhc_set_qos (struct dds_rhc *rhc, const struct dds_qos *qos) {
 | 
			
		||||
  rhc->common.ops->rhc_ops.set_qos (&rhc->common.rhc, qos);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline void dds_rhc_free (struct dds_rhc *rhc) {
 | 
			
		||||
  rhc->common.ops->rhc_ops.free (&rhc->common.rhc);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline int dds_rhc_read (struct dds_rhc *rhc, bool lock, void **values, dds_sample_info_t *info_seq, uint32_t max_samples, uint32_t mask, dds_instance_handle_t handle, struct dds_readcond *cond) {
 | 
			
		||||
  return (rhc->common.ops->read) (rhc, lock, values, info_seq, max_samples, mask, handle, cond);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline int dds_rhc_take (struct dds_rhc *rhc, bool lock, void **values, dds_sample_info_t *info_seq, uint32_t max_samples, uint32_t mask, dds_instance_handle_t handle, struct dds_readcond *cond) {
 | 
			
		||||
  return rhc->common.ops->take (rhc, lock, values, info_seq, max_samples, mask, handle, cond);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline int dds_rhc_takecdr (struct dds_rhc *rhc, bool lock, struct ddsi_serdata **values, dds_sample_info_t *info_seq, uint32_t max_samples, uint32_t sample_states, uint32_t view_states, uint32_t instance_states, dds_instance_handle_t handle) {
 | 
			
		||||
  return rhc->common.ops->takecdr (rhc, lock, values, info_seq, max_samples, sample_states, view_states, instance_states, handle);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline bool dds_rhc_add_readcondition (struct dds_readcond *cond) {
 | 
			
		||||
  return cond->m_rhc->common.ops->add_readcondition (cond);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline void dds_rhc_remove_readcondition (struct dds_readcond *cond) {
 | 
			
		||||
  cond->m_rhc->common.ops->remove_readcondition (cond);
 | 
			
		||||
}
 | 
			
		||||
DDS_EXPORT inline uint32_t dds_rhc_lock_samples (struct dds_rhc *rhc) {
 | 
			
		||||
  return rhc->common.ops->lock_samples (rhc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,18 +9,20 @@
 | 
			
		|||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#ifndef _DDS_ERR_H_
 | 
			
		||||
#define _DDS_ERR_H_
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/retcode.h"
 | 
			
		||||
#ifndef _DDS_RHC_DEFAULT_H_
 | 
			
		||||
#define _DDS_RHC_DEFAULT_H_
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define DDS_ERRNO(err) (assert(err > DDS_RETCODE_OK), -(err))
 | 
			
		||||
struct dds_rhc;
 | 
			
		||||
struct dds_reader;
 | 
			
		||||
struct ddsi_sertopic;
 | 
			
		||||
struct q_globals;
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT struct dds_rhc *dds_rhc_default_new_xchecks (dds_reader *reader, struct q_globals *gv, const struct ddsi_sertopic *topic, bool xchecks);
 | 
			
		||||
DDS_EXPORT struct dds_rhc *dds_rhc_default_new (struct dds_reader *reader, const struct ddsi_sertopic *topic);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +24,7 @@ struct ddsi_serdata_builtintopic {
 | 
			
		|||
  struct ddsi_serdata c;
 | 
			
		||||
  nn_guid_t key;
 | 
			
		||||
  dds_instance_handle_t pphandle;
 | 
			
		||||
  nn_xqos_t xqos;
 | 
			
		||||
  dds_qos_t xqos;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum ddsi_sertopic_builtintopic_type {
 | 
			
		||||
| 
						 | 
				
			
			@ -33,15 +33,17 @@ enum ddsi_sertopic_builtintopic_type {
 | 
			
		|||
  DSBT_WRITER
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct q_globals;
 | 
			
		||||
struct ddsi_sertopic_builtintopic {
 | 
			
		||||
  struct ddsi_sertopic c;
 | 
			
		||||
  enum ddsi_sertopic_builtintopic_type type;
 | 
			
		||||
  struct q_globals *gv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern const struct ddsi_sertopic_ops ddsi_sertopic_ops_builtintopic;
 | 
			
		||||
extern const struct ddsi_serdata_ops ddsi_serdata_ops_builtintopic;
 | 
			
		||||
 | 
			
		||||
struct ddsi_sertopic *new_sertopic_builtintopic (enum ddsi_sertopic_builtintopic_type type, const char *name, const char *typename);
 | 
			
		||||
struct ddsi_sertopic *new_sertopic_builtintopic (enum ddsi_sertopic_builtintopic_type type, const char *name, const char *typename, struct q_globals *gv);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,47 +19,46 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void dds_stream_write_sample
 | 
			
		||||
(
 | 
			
		||||
  dds_stream_t * os,
 | 
			
		||||
  const void * data,
 | 
			
		||||
  const struct ddsi_sertopic_default * topic
 | 
			
		||||
);
 | 
			
		||||
void dds_stream_read_sample
 | 
			
		||||
(
 | 
			
		||||
  dds_stream_t * is,
 | 
			
		||||
  void * data,
 | 
			
		||||
  const struct ddsi_sertopic_default * topic
 | 
			
		||||
);
 | 
			
		||||
typedef struct dds_istream {
 | 
			
		||||
  const unsigned char *m_buffer;
 | 
			
		||||
  uint32_t m_size;      /* Buffer size */
 | 
			
		||||
  uint32_t m_index;     /* Read/write offset from start of buffer */
 | 
			
		||||
} dds_istream_t;
 | 
			
		||||
 | 
			
		||||
size_t dds_stream_check_optimize (const dds_topic_descriptor_t * desc);
 | 
			
		||||
void dds_stream_from_serdata_default (dds_stream_t * s, const struct ddsi_serdata_default *d);
 | 
			
		||||
void dds_stream_add_to_serdata_default (dds_stream_t * s, struct ddsi_serdata_default **d);
 | 
			
		||||
typedef struct dds_ostream {
 | 
			
		||||
  unsigned char *m_buffer;
 | 
			
		||||
  uint32_t m_size;      /* Buffer size */
 | 
			
		||||
  uint32_t m_index;     /* Read/write offset from start of buffer */
 | 
			
		||||
} dds_ostream_t;
 | 
			
		||||
 | 
			
		||||
void dds_stream_write_key (dds_stream_t * os, const char * sample, const struct ddsi_sertopic_default * topic);
 | 
			
		||||
uint32_t dds_stream_extract_key (dds_stream_t *is, dds_stream_t *os, const uint32_t *ops, const bool just_key);
 | 
			
		||||
void dds_stream_read_key
 | 
			
		||||
(
 | 
			
		||||
  dds_stream_t * is,
 | 
			
		||||
  char * sample,
 | 
			
		||||
  const dds_topic_descriptor_t * desc
 | 
			
		||||
);
 | 
			
		||||
void dds_stream_read_keyhash
 | 
			
		||||
(
 | 
			
		||||
  dds_stream_t * is,
 | 
			
		||||
  dds_key_hash_t * kh,
 | 
			
		||||
  const dds_topic_descriptor_t * desc,
 | 
			
		||||
  const bool just_key
 | 
			
		||||
);
 | 
			
		||||
char * dds_stream_reuse_string
 | 
			
		||||
(
 | 
			
		||||
  dds_stream_t * is,
 | 
			
		||||
  char * str,
 | 
			
		||||
  const uint32_t bound
 | 
			
		||||
);
 | 
			
		||||
DDS_EXPORT void dds_stream_swap (void * buff, uint32_t size, uint32_t num);
 | 
			
		||||
typedef struct dds_ostreamBE {
 | 
			
		||||
  dds_ostream_t x;
 | 
			
		||||
} dds_ostreamBE_t;
 | 
			
		||||
 | 
			
		||||
extern const uint32_t dds_op_size[5];
 | 
			
		||||
DDS_EXPORT void dds_ostream_init (dds_ostream_t * __restrict st, uint32_t size);
 | 
			
		||||
DDS_EXPORT void dds_ostream_fini (dds_ostream_t * __restrict st);
 | 
			
		||||
DDS_EXPORT void dds_ostreamBE_init (dds_ostreamBE_t * __restrict st, uint32_t size);
 | 
			
		||||
DDS_EXPORT void dds_ostreamBE_fini (dds_ostreamBE_t * __restrict st);
 | 
			
		||||
 | 
			
		||||
bool dds_stream_normalize (void * __restrict data, uint32_t size, bool bswap, const struct ddsi_sertopic_default * __restrict topic, bool just_key);
 | 
			
		||||
 | 
			
		||||
void dds_stream_write_sample (dds_ostream_t * __restrict os, const void * __restrict data, const struct ddsi_sertopic_default * __restrict topic);
 | 
			
		||||
void dds_stream_read_sample (dds_istream_t * __restrict is, void * __restrict data, const struct ddsi_sertopic_default * __restrict topic);
 | 
			
		||||
 | 
			
		||||
size_t dds_stream_check_optimize (const dds_topic_descriptor_t * __restrict desc);
 | 
			
		||||
void dds_istream_from_serdata_default (dds_istream_t * __restrict s, const struct ddsi_serdata_default * __restrict d);
 | 
			
		||||
void dds_ostream_from_serdata_default (dds_ostream_t * __restrict s, struct ddsi_serdata_default * __restrict d);
 | 
			
		||||
void dds_ostream_add_to_serdata_default (dds_ostream_t * __restrict s, struct ddsi_serdata_default ** __restrict d);
 | 
			
		||||
void dds_ostreamBE_from_serdata_default (dds_ostreamBE_t * __restrict s, struct ddsi_serdata_default * __restrict d);
 | 
			
		||||
void dds_ostreamBE_add_to_serdata_default (dds_ostreamBE_t * __restrict s, struct ddsi_serdata_default ** __restrict d);
 | 
			
		||||
 | 
			
		||||
void dds_stream_write_key (dds_ostream_t * __restrict os, const char * __restrict sample, const struct ddsi_sertopic_default * __restrict topic);
 | 
			
		||||
void dds_stream_write_keyBE (dds_ostreamBE_t * __restrict os, const char * __restrict sample, const struct ddsi_sertopic_default * __restrict topic);
 | 
			
		||||
void dds_stream_extract_key_from_data (dds_istream_t * __restrict is, dds_ostream_t * __restrict os, const struct ddsi_sertopic_default * __restrict topic);
 | 
			
		||||
void dds_stream_extract_keyBE_from_data (dds_istream_t * __restrict is, dds_ostreamBE_t * __restrict os, const struct ddsi_sertopic_default * __restrict topic);
 | 
			
		||||
void dds_stream_extract_keyhash (dds_istream_t * __restrict is, dds_keyhash_t * __restrict kh, const struct ddsi_sertopic_default * __restrict topic, const bool just_key);
 | 
			
		||||
 | 
			
		||||
void dds_stream_read_key (dds_istream_t * __restrict is, char * __restrict sample, const struct ddsi_sertopic_default * __restrict topic);
 | 
			
		||||
 | 
			
		||||
/* For marshalling op code handling */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -70,14 +69,14 @@ extern const uint32_t dds_op_size[5];
 | 
			
		|||
#define DDS_OP_FLAGS_MASK 0x000000ff
 | 
			
		||||
#define DDS_JEQ_TYPE_MASK 0x00ff0000
 | 
			
		||||
 | 
			
		||||
#define DDS_OP(o) ((o) & DDS_OP_MASK)
 | 
			
		||||
#define DDS_OP_TYPE(o) (((o) & DDS_OP_TYPE_MASK) >> 16)
 | 
			
		||||
#define DDS_OP_SUBTYPE(o) (((o) & DDS_OP_SUBTYPE_MASK) >> 8)
 | 
			
		||||
#define DDS_OP_FLAGS(o) ((o) & DDS_OP_FLAGS_MASK)
 | 
			
		||||
#define DDS_OP(o)         ((enum dds_stream_opcode) ((o) & DDS_OP_MASK))
 | 
			
		||||
#define DDS_OP_TYPE(o)    ((enum dds_stream_typecode) (((o) & DDS_OP_TYPE_MASK) >> 16))
 | 
			
		||||
#define DDS_OP_SUBTYPE(o) ((enum dds_stream_typecode) (((o) & DDS_OP_SUBTYPE_MASK) >> 8))
 | 
			
		||||
#define DDS_OP_FLAGS(o)   ((o) & DDS_OP_FLAGS_MASK)
 | 
			
		||||
#define DDS_OP_ADR_JSR(o) ((o) & DDS_OP_JMP_MASK)
 | 
			
		||||
#define DDS_OP_JUMP(o) ((int16_t) ((o) & DDS_OP_JMP_MASK))
 | 
			
		||||
#define DDS_OP_JUMP(o)    ((int16_t) ((o) & DDS_OP_JMP_MASK))
 | 
			
		||||
#define DDS_OP_ADR_JMP(o) ((o) >> 16)
 | 
			
		||||
#define DDS_JEQ_TYPE(o) (((o) & DDS_JEQ_TYPE_MASK) >> 16)
 | 
			
		||||
#define DDS_JEQ_TYPE(o)   ((enum dds_stream_typecode) (((o) & DDS_JEQ_TYPE_MASK) >> 16))
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@ DEFINE_ENTITY_LOCK_UNLOCK(inline, dds_subscriber, DDS_KIND_SUBSCRIBER)
 | 
			
		|||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds__create_subscriber_l(
 | 
			
		||||
  struct dds_entity *participant, /* entity-lock must be held */
 | 
			
		||||
  struct dds_participant *participant, /* entity-lock must be held */
 | 
			
		||||
  const dds_qos_t *qos,
 | 
			
		||||
  const dds_listener_t *listener);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,8 +21,8 @@ extern "C" {
 | 
			
		|||
 | 
			
		||||
DEFINE_ENTITY_LOCK_UNLOCK(inline, dds_topic, DDS_KIND_TOPIC)
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT struct ddsi_sertopic * dds_topic_lookup (dds_domain * domain, const char * name);
 | 
			
		||||
DDS_EXPORT void dds_topic_free (dds_domainid_t domainid, struct ddsi_sertopic * st);
 | 
			
		||||
DDS_EXPORT struct ddsi_sertopic * dds_topic_lookup (dds_domain * domain, const char * name) ddsrt_nonnull_all;
 | 
			
		||||
DDS_EXPORT void dds_topic_free (dds_domainid_t domainid, struct ddsi_sertopic * st) ddsrt_nonnull_all;
 | 
			
		||||
 | 
			
		||||
#ifndef DDS_TOPIC_INTERN_FILTER_FN_DEFINED
 | 
			
		||||
#define DDS_TOPIC_INTERN_FILTER_FN_DEFINED
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,9 @@
 | 
			
		|||
#include "dds/dds.h"
 | 
			
		||||
#include "dds/ddsrt/sync.h"
 | 
			
		||||
#include "dds/ddsi/q_rtps.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds/ddsrt/avl.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_builtin_topic_if.h"
 | 
			
		||||
#include "dds__handles.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
| 
						 | 
				
			
			@ -39,12 +41,11 @@ struct dds_statuscond;
 | 
			
		|||
struct ddsi_sertopic;
 | 
			
		||||
struct rhc;
 | 
			
		||||
 | 
			
		||||
/* Internal entity status flags */
 | 
			
		||||
 | 
			
		||||
#define DDS_INTERNAL_STATUS_MASK     (0xFF000000u)
 | 
			
		||||
 | 
			
		||||
#define DDS_WAITSET_TRIGGER_STATUS   (0x01000000u)
 | 
			
		||||
#define DDS_DELETING_STATUS          (0x02000000u)
 | 
			
		||||
typedef uint16_t status_mask_t;
 | 
			
		||||
typedef ddsrt_atomic_uint32_t status_and_enabled_t;
 | 
			
		||||
#define SAM_STATUS_MASK        0xffffu
 | 
			
		||||
#define SAM_ENABLED_MASK   0xffff0000u
 | 
			
		||||
#define SAM_ENABLED_SHIFT          16
 | 
			
		||||
 | 
			
		||||
/* This can be used when polling for various states.
 | 
			
		||||
 * Obviously, it is encouraged to use condition variables and such. But
 | 
			
		||||
| 
						 | 
				
			
			@ -92,96 +93,143 @@ struct dds_listener {
 | 
			
		|||
#define DDS_ENTITY_ENABLED      0x0001u
 | 
			
		||||
#define DDS_ENTITY_IMPLICIT     0x0002u
 | 
			
		||||
 | 
			
		||||
typedef struct dds_domain
 | 
			
		||||
{
 | 
			
		||||
typedef struct dds_domain {
 | 
			
		||||
  /* FIXME: protected by dds_global.lock -- for now */
 | 
			
		||||
  ddsrt_avl_node_t m_node;
 | 
			
		||||
  dds_domainid_t m_id;
 | 
			
		||||
  ddsrt_avl_tree_t m_topics;
 | 
			
		||||
  ddsrt_avl_tree_t m_ppants;
 | 
			
		||||
  uint32_t m_refc;
 | 
			
		||||
}
 | 
			
		||||
dds_domain;
 | 
			
		||||
  struct cfgst *cfgst;
 | 
			
		||||
 | 
			
		||||
  struct ddsi_sertopic *builtin_participant_topic;
 | 
			
		||||
  struct ddsi_sertopic *builtin_reader_topic;
 | 
			
		||||
  struct ddsi_sertopic *builtin_writer_topic;
 | 
			
		||||
 | 
			
		||||
  struct local_orphan_writer *builtintopic_writer_participant;
 | 
			
		||||
  struct local_orphan_writer *builtintopic_writer_publications;
 | 
			
		||||
  struct local_orphan_writer *builtintopic_writer_subscriptions;
 | 
			
		||||
 | 
			
		||||
  struct ddsi_builtin_topic_interface btif;
 | 
			
		||||
  struct q_globals gv;
 | 
			
		||||
} dds_domain;
 | 
			
		||||
 | 
			
		||||
struct dds_entity;
 | 
			
		||||
typedef struct dds_entity_deriver {
 | 
			
		||||
    /* Close can be used to terminate (blocking) actions on a entity before actually deleting it. */
 | 
			
		||||
    dds_return_t (*close)(struct dds_entity *e);
 | 
			
		||||
    /* Delete is used to actually free the entity. */
 | 
			
		||||
    dds_return_t (*delete)(struct dds_entity *e);
 | 
			
		||||
    dds_return_t (*set_qos)(struct dds_entity *e, const dds_qos_t *qos, bool enabled);
 | 
			
		||||
    dds_return_t (*validate_status)(uint32_t mask);
 | 
			
		||||
    dds_return_t (*get_instance_hdl)(struct dds_entity *e, dds_instance_handle_t *i);
 | 
			
		||||
}
 | 
			
		||||
dds_entity_deriver;
 | 
			
		||||
  /* Close can be used to terminate (blocking) actions on a entity before actually deleting it. */
 | 
			
		||||
  dds_return_t (*close)(struct dds_entity *e) ddsrt_nonnull_all;
 | 
			
		||||
  /* Delete is used to actually free the entity. */
 | 
			
		||||
  dds_return_t (*delete)(struct dds_entity *e) ddsrt_nonnull_all;
 | 
			
		||||
  dds_return_t (*set_qos)(struct dds_entity *e, const dds_qos_t *qos, bool enabled) ddsrt_nonnull_all;
 | 
			
		||||
  dds_return_t (*validate_status)(uint32_t mask);
 | 
			
		||||
} dds_entity_deriver;
 | 
			
		||||
 | 
			
		||||
typedef void (*dds_entity_callback)(dds_entity_t observer, dds_entity_t observed, uint32_t status);
 | 
			
		||||
typedef void (*dds_entity_callback)(struct dds_entity *observer, dds_entity_t observed, uint32_t status);
 | 
			
		||||
typedef void (*dds_entity_delete_callback)(struct dds_entity *observer, dds_entity_t observed);
 | 
			
		||||
 | 
			
		||||
typedef struct dds_entity_observer
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_callback m_cb;
 | 
			
		||||
    dds_entity_t m_observer;
 | 
			
		||||
    struct dds_entity_observer *m_next;
 | 
			
		||||
}
 | 
			
		||||
dds_entity_observer;
 | 
			
		||||
typedef struct dds_entity_observer {
 | 
			
		||||
  dds_entity_callback m_cb;
 | 
			
		||||
  dds_entity_delete_callback m_delete_cb;
 | 
			
		||||
  struct dds_entity *m_observer;
 | 
			
		||||
  struct dds_entity_observer *m_next;
 | 
			
		||||
} dds_entity_observer;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_entity
 | 
			
		||||
{
 | 
			
		||||
  struct dds_handle_link m_hdllink;
 | 
			
		||||
  dds_entity_kind_t m_kind;
 | 
			
		||||
  dds_entity_deriver m_deriver;
 | 
			
		||||
  uint32_t m_refc;
 | 
			
		||||
  struct dds_entity * m_next;
 | 
			
		||||
  struct dds_entity * m_parent;
 | 
			
		||||
  struct dds_entity * m_children;
 | 
			
		||||
  struct dds_entity * m_participant;
 | 
			
		||||
  struct dds_domain * m_domain;
 | 
			
		||||
  dds_qos_t * m_qos;
 | 
			
		||||
  dds_domainid_t m_domainid;
 | 
			
		||||
  nn_guid_t m_guid;
 | 
			
		||||
  uint32_t m_flags;
 | 
			
		||||
typedef struct dds_entity {
 | 
			
		||||
  struct dds_handle_link m_hdllink; /* handle is constant, cnt_flags private to dds_handle.c */
 | 
			
		||||
  dds_entity_kind_t m_kind;         /* constant */
 | 
			
		||||
  struct dds_entity *m_next;        /* [m_mutex] */
 | 
			
		||||
  struct dds_entity *m_parent;      /* constant */
 | 
			
		||||
  ddsrt_avl_node_t m_avlnode_child; /* [m_mutex of m_parent] */
 | 
			
		||||
  ddsrt_avl_tree_t m_children;      /* [m_mutex] tree on m_iid using m_avlnode_child */
 | 
			
		||||
  struct dds_entity *m_participant; /* constant */
 | 
			
		||||
  struct dds_domain *m_domain;      /* constant */
 | 
			
		||||
  dds_qos_t *m_qos;                 /* [m_mutex] */
 | 
			
		||||
  nn_guid_t m_guid;                 /* unique (if not 0) and constant; FIXME: set during creation, but possibly after becoming visible */
 | 
			
		||||
  dds_instance_handle_t m_iid;      /* unique for all time, constant; FIXME: like GUID */
 | 
			
		||||
  uint32_t m_flags;                 /* [m_mutex] */
 | 
			
		||||
 | 
			
		||||
  /* Allowed:
 | 
			
		||||
     - locking parent->...->m_mutex while holding m_mutex
 | 
			
		||||
     - locking topic::m_mutex while holding {publisher,subscriber}::m_mutex
 | 
			
		||||
       (no hierarchical relationship there)
 | 
			
		||||
     - locking topic::m_mutex while holding {reader,writer}::m_mutex
 | 
			
		||||
     - locking observers_lock while holding m_mutex
 | 
			
		||||
   */
 | 
			
		||||
  ddsrt_mutex_t m_mutex;
 | 
			
		||||
  ddsrt_cond_t m_cond;
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_t m_observers_lock;
 | 
			
		||||
  union {
 | 
			
		||||
    status_and_enabled_t m_status_and_mask; /* for most entities */
 | 
			
		||||
    ddsrt_atomic_uint32_t m_trigger;        /* for conditions & waitsets */
 | 
			
		||||
  } m_status;
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_t m_observers_lock;   /* locking parent->...->m_observers_lock while holding it is allowed */
 | 
			
		||||
  ddsrt_cond_t m_observers_cond;
 | 
			
		||||
  dds_listener_t m_listener;
 | 
			
		||||
  uint32_t m_trigger;
 | 
			
		||||
  uint32_t m_status_enable;
 | 
			
		||||
  uint32_t m_cb_count;
 | 
			
		||||
  dds_entity_observer *m_observers;
 | 
			
		||||
}
 | 
			
		||||
dds_entity;
 | 
			
		||||
  dds_listener_t m_listener;        /* [m_observers_lock] */
 | 
			
		||||
  uint32_t m_cb_count;              /* [m_observers_lock] */
 | 
			
		||||
  dds_entity_observer *m_observers; /* [m_observers_lock] */
 | 
			
		||||
} dds_entity;
 | 
			
		||||
 | 
			
		||||
extern const ddsrt_avl_treedef_t dds_topictree_def;
 | 
			
		||||
extern const ddsrt_avl_treedef_t dds_entity_children_td;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_subscriber
 | 
			
		||||
{
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_topic;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_participant;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_reader;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_writer;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_subscriber;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_publisher;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_readcondition;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_guardcondition;
 | 
			
		||||
extern const struct dds_entity_deriver dds_entity_deriver_waitset;
 | 
			
		||||
extern const struct dds_entity_deriver *dds_entity_deriver_table[];
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_entity_deriver_dummy_close (struct dds_entity *e);
 | 
			
		||||
dds_return_t dds_entity_deriver_dummy_delete (struct dds_entity *e);
 | 
			
		||||
dds_return_t dds_entity_deriver_dummy_set_qos (struct dds_entity *e, const dds_qos_t *qos, bool enabled);
 | 
			
		||||
dds_return_t dds_entity_deriver_dummy_validate_status (uint32_t mask);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
inline dds_return_t dds_entity_deriver_close (struct dds_entity *e) {
 | 
			
		||||
  return (dds_entity_deriver_table[e->m_kind]->close) (e);
 | 
			
		||||
}
 | 
			
		||||
dds_subscriber;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_publisher
 | 
			
		||||
{
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
inline dds_return_t dds_entity_deriver_delete (struct dds_entity *e) {
 | 
			
		||||
  return dds_entity_deriver_table[e->m_kind]->delete (e);
 | 
			
		||||
}
 | 
			
		||||
inline dds_return_t dds_entity_deriver_set_qos (struct dds_entity *e, const dds_qos_t *qos, bool enabled) {
 | 
			
		||||
  return dds_entity_deriver_table[e->m_kind]->set_qos (e, qos, enabled);
 | 
			
		||||
}
 | 
			
		||||
inline dds_return_t dds_entity_deriver_validate_status (struct dds_entity *e, uint32_t mask) {
 | 
			
		||||
  return dds_entity_deriver_table[e->m_kind]->validate_status (mask);
 | 
			
		||||
}
 | 
			
		||||
inline bool dds_entity_supports_set_qos (struct dds_entity *e) {
 | 
			
		||||
  return dds_entity_deriver_table[e->m_kind]->set_qos != dds_entity_deriver_dummy_set_qos;
 | 
			
		||||
}
 | 
			
		||||
inline bool dds_entity_supports_validate_status (struct dds_entity *e) {
 | 
			
		||||
  return dds_entity_deriver_table[e->m_kind]->validate_status != dds_entity_deriver_dummy_validate_status;
 | 
			
		||||
}
 | 
			
		||||
dds_publisher;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_participant
 | 
			
		||||
{
 | 
			
		||||
typedef struct dds_subscriber {
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
} dds_subscriber;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_publisher {
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
} dds_publisher;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_participant {
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
  struct dds_entity * m_dur_reader;
 | 
			
		||||
  struct dds_entity * m_dur_writer;
 | 
			
		||||
  dds_entity_t m_builtin_subscriber;
 | 
			
		||||
}
 | 
			
		||||
dds_participant;
 | 
			
		||||
} dds_participant;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_reader
 | 
			
		||||
{
 | 
			
		||||
typedef struct dds_reader {
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
  const struct dds_topic * m_topic;
 | 
			
		||||
  struct reader * m_rd;
 | 
			
		||||
  const struct dds_topic *m_topic;
 | 
			
		||||
  struct dds_rhc *m_rhc; /* aliases m_rd->rhc with a wider interface, FIXME: but m_rd owns it for resource management */
 | 
			
		||||
  struct reader *m_rd;
 | 
			
		||||
  bool m_data_on_readers;
 | 
			
		||||
  bool m_loan_out;
 | 
			
		||||
  void * m_loan;
 | 
			
		||||
  void *m_loan;
 | 
			
		||||
  uint32_t m_loan_size;
 | 
			
		||||
 | 
			
		||||
  /* Status metrics */
 | 
			
		||||
| 
						 | 
				
			
			@ -192,16 +240,15 @@ typedef struct dds_reader
 | 
			
		|||
  dds_requested_incompatible_qos_status_t m_requested_incompatible_qos_status;
 | 
			
		||||
  dds_sample_lost_status_t m_sample_lost_status;
 | 
			
		||||
  dds_subscription_matched_status_t m_subscription_matched_status;
 | 
			
		||||
}
 | 
			
		||||
dds_reader;
 | 
			
		||||
} dds_reader;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_writer
 | 
			
		||||
{
 | 
			
		||||
typedef struct dds_writer {
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
  const struct dds_topic * m_topic;
 | 
			
		||||
  struct nn_xpack * m_xp;
 | 
			
		||||
  struct writer * m_wr;
 | 
			
		||||
  const struct dds_topic *m_topic;
 | 
			
		||||
  struct nn_xpack *m_xp;
 | 
			
		||||
  struct writer *m_wr;
 | 
			
		||||
  struct whc *m_whc; /* FIXME: ownership still with underlying DDSI writer (cos of DDSI built-in writers )*/
 | 
			
		||||
  bool whc_batch; /* FIXME: channels + latency budget */
 | 
			
		||||
 | 
			
		||||
  /* Status metrics */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -209,84 +256,68 @@ typedef struct dds_writer
 | 
			
		|||
  dds_offered_deadline_missed_status_t m_offered_deadline_missed_status;
 | 
			
		||||
  dds_offered_incompatible_qos_status_t m_offered_incompatible_qos_status;
 | 
			
		||||
  dds_publication_matched_status_t m_publication_matched_status;
 | 
			
		||||
}
 | 
			
		||||
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
 | 
			
		||||
{
 | 
			
		||||
typedef struct dds_topic {
 | 
			
		||||
  struct dds_entity m_entity;
 | 
			
		||||
  struct ddsi_sertopic * m_stopic;
 | 
			
		||||
  struct ddsi_sertopic *m_stopic;
 | 
			
		||||
 | 
			
		||||
  dds_topic_intern_filter_fn filter_fn;
 | 
			
		||||
  void * filter_ctx;
 | 
			
		||||
  void *filter_ctx;
 | 
			
		||||
 | 
			
		||||
  /* Status metrics */
 | 
			
		||||
 | 
			
		||||
  dds_inconsistent_topic_status_t m_inconsistent_topic_status;
 | 
			
		||||
}
 | 
			
		||||
dds_topic;
 | 
			
		||||
} dds_topic;
 | 
			
		||||
 | 
			
		||||
typedef uint32_t dds_querycond_mask_t;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_readcond
 | 
			
		||||
{
 | 
			
		||||
typedef struct dds_readcond {
 | 
			
		||||
  dds_entity m_entity;
 | 
			
		||||
  struct rhc * m_rhc;
 | 
			
		||||
  struct dds_rhc *m_rhc;
 | 
			
		||||
  uint32_t m_qminv;
 | 
			
		||||
  uint32_t m_sample_states;
 | 
			
		||||
  uint32_t m_view_states;
 | 
			
		||||
  uint32_t m_instance_states;
 | 
			
		||||
  nn_guid_t m_rd_guid;
 | 
			
		||||
  struct dds_readcond * m_next;
 | 
			
		||||
  struct
 | 
			
		||||
  {
 | 
			
		||||
      dds_querycondition_filter_fn m_filter;
 | 
			
		||||
      dds_querycond_mask_t m_qcmask; /* condition mask in RHC*/
 | 
			
		||||
  struct dds_readcond *m_next;
 | 
			
		||||
  struct {
 | 
			
		||||
    dds_querycondition_filter_fn m_filter;
 | 
			
		||||
    dds_querycond_mask_t m_qcmask; /* condition mask in RHC*/
 | 
			
		||||
  } m_query;
 | 
			
		||||
}
 | 
			
		||||
dds_readcond;
 | 
			
		||||
} dds_readcond;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_guardcond
 | 
			
		||||
{
 | 
			
		||||
typedef struct dds_guardcond {
 | 
			
		||||
  dds_entity m_entity;
 | 
			
		||||
}
 | 
			
		||||
dds_guardcond;
 | 
			
		||||
} dds_guardcond;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_attachment
 | 
			
		||||
{
 | 
			
		||||
    dds_entity  *entity;
 | 
			
		||||
    dds_attach_t arg;
 | 
			
		||||
    struct dds_attachment* next;
 | 
			
		||||
}
 | 
			
		||||
dds_attachment;
 | 
			
		||||
typedef struct dds_attachment {
 | 
			
		||||
  dds_entity *entity;
 | 
			
		||||
  dds_entity_t handle;
 | 
			
		||||
  dds_attach_t arg;
 | 
			
		||||
} dds_attachment;
 | 
			
		||||
 | 
			
		||||
typedef struct dds_waitset
 | 
			
		||||
{
 | 
			
		||||
typedef struct dds_waitset {
 | 
			
		||||
  dds_entity m_entity;
 | 
			
		||||
  dds_attachment *observed;
 | 
			
		||||
  dds_attachment *triggered;
 | 
			
		||||
}
 | 
			
		||||
dds_waitset;
 | 
			
		||||
  size_t nentities;         /* [m_entity.m_mutex] */
 | 
			
		||||
  size_t ntriggered;        /* [m_entity.m_mutex] */
 | 
			
		||||
  dds_attachment *entities; /* [m_entity.m_mutex] 0 .. ntriggered are triggred, ntriggred .. nentities are not */
 | 
			
		||||
} dds_waitset;
 | 
			
		||||
 | 
			
		||||
/* Globals */
 | 
			
		||||
 | 
			
		||||
typedef struct dds_globals
 | 
			
		||||
{
 | 
			
		||||
  dds_domainid_t m_default_domain;
 | 
			
		||||
typedef struct dds_globals {
 | 
			
		||||
  int32_t m_init_count;
 | 
			
		||||
  void (*m_dur_reader) (struct dds_reader * reader, struct rhc * rhc);
 | 
			
		||||
  int (*m_dur_wait) (struct dds_reader * reader, dds_duration_t timeout);
 | 
			
		||||
  void (*m_dur_init) (void);
 | 
			
		||||
  void (*m_dur_fini) (void);
 | 
			
		||||
  ddsrt_avl_tree_t m_domains;
 | 
			
		||||
  ddsrt_mutex_t m_mutex;
 | 
			
		||||
}
 | 
			
		||||
dds_globals;
 | 
			
		||||
  uint32_t threadmon_count;
 | 
			
		||||
  struct ddsi_threadmon *threadmon;
 | 
			
		||||
} dds_globals;
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT extern dds_globals dds_global;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,8 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct whc *whc_new (int is_transient_local, unsigned hdepth, unsigned tldepth);
 | 
			
		||||
struct q_globals;
 | 
			
		||||
struct whc *whc_new (struct q_globals *gv, int is_transient_local, uint32_t hdepth, uint32_t tldepth);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct whc *builtintopic_whc_new (enum ddsi_sertopic_builtintopic_type type);
 | 
			
		||||
struct whc *builtintopic_whc_new (enum ddsi_sertopic_builtintopic_type type, const struct ephash *guid_hash);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ typedef enum {
 | 
			
		|||
 | 
			
		||||
dds_return_t dds_write_impl (dds_writer *wr, const void *data, dds_time_t tstamp, dds_write_action action);
 | 
			
		||||
dds_return_t dds_writecdr_impl (dds_writer *wr, struct ddsi_serdata *d, dds_time_t tstamp, dds_write_action action);
 | 
			
		||||
dds_return_t dds_writecdr_impl_lowlevel (struct writer *ddsi_wr, struct nn_xpack *xp, struct ddsi_serdata *d);
 | 
			
		||||
dds_return_t dds_writecdr_impl_lowlevel (struct writer *ddsi_wr, struct nn_xpack *xp, struct ddsi_serdata *d, bool flush);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ void dds_string_free (char * str)
 | 
			
		|||
  dds_free (str);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_sample_free_contents (char * data, const uint32_t * ops)
 | 
			
		||||
void dds_sample_free_contents (char *data, const uint32_t * ops)
 | 
			
		||||
{
 | 
			
		||||
  uint32_t op;
 | 
			
		||||
  uint32_t type;
 | 
			
		||||
| 
						 | 
				
			
			@ -179,6 +179,8 @@ void dds_sample_free_contents (char * data, const uint32_t * ops)
 | 
			
		|||
            if (seq->_release)
 | 
			
		||||
            {
 | 
			
		||||
              dds_free (seq->_buffer);
 | 
			
		||||
              seq->_maximum = 0;
 | 
			
		||||
              seq->_length = 0;
 | 
			
		||||
              seq->_buffer = NULL;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,14 +11,15 @@
 | 
			
		|||
 */
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "dds/ddsrt/string.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds/ddsi/q_plist.h" /* for nn_keyhash */
 | 
			
		||||
#include "dds__init.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds__domain.h"
 | 
			
		||||
#include "dds__participant.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds__types.h"
 | 
			
		||||
#include "dds__builtin.h"
 | 
			
		||||
#include "dds__subscriber.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -29,13 +30,6 @@
 | 
			
		|||
#include "dds/ddsi/q_qosmatch.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
 | 
			
		||||
static struct ddsi_sertopic *builtin_participant_topic;
 | 
			
		||||
static struct ddsi_sertopic *builtin_reader_topic;
 | 
			
		||||
static struct ddsi_sertopic *builtin_writer_topic;
 | 
			
		||||
static struct local_orphan_writer *builtintopic_writer_participant;
 | 
			
		||||
static struct local_orphan_writer *builtintopic_writer_publications;
 | 
			
		||||
static struct local_orphan_writer *builtintopic_writer_subscriptions;
 | 
			
		||||
 | 
			
		||||
static dds_qos_t *dds__create_builtin_qos (void)
 | 
			
		||||
{
 | 
			
		||||
  const char *partition = "__BUILT-IN PARTITION__";
 | 
			
		||||
| 
						 | 
				
			
			@ -47,93 +41,87 @@ static dds_qos_t *dds__create_builtin_qos (void)
 | 
			
		|||
  return qos;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds__builtin_init (void)
 | 
			
		||||
dds_entity_t dds__get_builtin_topic (dds_entity_t entity, dds_entity_t topic)
 | 
			
		||||
{
 | 
			
		||||
  dds_qos_t *qos = dds__create_builtin_qos ();
 | 
			
		||||
 | 
			
		||||
  builtin_participant_topic = new_sertopic_builtintopic (DSBT_PARTICIPANT, "DCPSParticipant", "org::eclipse::cyclonedds::builtin::DCPSParticipant");
 | 
			
		||||
  builtin_reader_topic = new_sertopic_builtintopic (DSBT_READER, "DCPSSubscription", "org::eclipse::cyclonedds::builtin::DCPSSubscription");
 | 
			
		||||
  builtin_writer_topic = new_sertopic_builtintopic (DSBT_WRITER, "DCPSPublication", "org::eclipse::cyclonedds::builtin::DCPSPublication");
 | 
			
		||||
 | 
			
		||||
  builtintopic_writer_participant = new_local_orphan_writer (to_entityid (NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER), builtin_participant_topic, qos, builtintopic_whc_new (DSBT_PARTICIPANT));
 | 
			
		||||
  builtintopic_writer_publications = new_local_orphan_writer (to_entityid (NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER), builtin_writer_topic, qos, builtintopic_whc_new (DSBT_WRITER));
 | 
			
		||||
  builtintopic_writer_subscriptions = new_local_orphan_writer (to_entityid (NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER), builtin_reader_topic, qos, builtintopic_whc_new (DSBT_READER));
 | 
			
		||||
 | 
			
		||||
  dds_delete_qos (qos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds__builtin_fini (void)
 | 
			
		||||
{
 | 
			
		||||
  /* No more sources for builtin topic samples */
 | 
			
		||||
  thread_state_awake (lookup_thread_state ());
 | 
			
		||||
  delete_local_orphan_writer (builtintopic_writer_participant);
 | 
			
		||||
  delete_local_orphan_writer (builtintopic_writer_publications);
 | 
			
		||||
  delete_local_orphan_writer (builtintopic_writer_subscriptions);
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
 | 
			
		||||
  ddsi_sertopic_unref (builtin_participant_topic);
 | 
			
		||||
  ddsi_sertopic_unref (builtin_reader_topic);
 | 
			
		||||
  ddsi_sertopic_unref (builtin_writer_topic);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds__get_builtin_topic (dds_entity_t e, dds_entity_t topic)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity_t pp;
 | 
			
		||||
  dds_entity_t tp;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  dds_entity *e;
 | 
			
		||||
 | 
			
		||||
  if ((pp = dds_get_participant (e)) <= 0)
 | 
			
		||||
    return pp;
 | 
			
		||||
  if ((rc = dds_entity_pin (entity, &e)) < 0)
 | 
			
		||||
    return rc;
 | 
			
		||||
 | 
			
		||||
  struct ddsi_sertopic *sertopic;
 | 
			
		||||
  if (topic == DDS_BUILTIN_TOPIC_DCPSPARTICIPANT) {
 | 
			
		||||
    sertopic = builtin_participant_topic;
 | 
			
		||||
  } else if (topic == DDS_BUILTIN_TOPIC_DCPSPUBLICATION) {
 | 
			
		||||
    sertopic = builtin_writer_topic;
 | 
			
		||||
  } else if (topic == DDS_BUILTIN_TOPIC_DCPSSUBSCRIPTION) {
 | 
			
		||||
    sertopic = builtin_reader_topic;
 | 
			
		||||
  } else {
 | 
			
		||||
    assert (0);
 | 
			
		||||
    return DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  switch (topic)
 | 
			
		||||
  {
 | 
			
		||||
    case DDS_BUILTIN_TOPIC_DCPSPARTICIPANT:
 | 
			
		||||
      sertopic = e->m_domain->builtin_participant_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    case DDS_BUILTIN_TOPIC_DCPSPUBLICATION:
 | 
			
		||||
      sertopic = e->m_domain->builtin_writer_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    case DDS_BUILTIN_TOPIC_DCPSSUBSCRIPTION:
 | 
			
		||||
      sertopic = e->m_domain->builtin_reader_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      assert (0);
 | 
			
		||||
      dds_entity_unpin (e);
 | 
			
		||||
      return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  dds_qos_t *qos = dds__create_builtin_qos ();
 | 
			
		||||
  tp = dds_create_topic_arbitrary (pp, sertopic, qos, NULL, NULL);
 | 
			
		||||
  tp = dds_create_topic_arbitrary (e->m_participant->m_hdllink.hdl, sertopic, qos, NULL, NULL);
 | 
			
		||||
  dds_delete_qos (qos);
 | 
			
		||||
  dds_entity_unpin (e);
 | 
			
		||||
  return tp;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool qos_has_resource_limits (const dds_qos_t *qos)
 | 
			
		||||
{
 | 
			
		||||
  assert (qos->present & QP_RESOURCE_LIMITS);
 | 
			
		||||
  return (qos->resource_limits.max_samples != DDS_LENGTH_UNLIMITED ||
 | 
			
		||||
          qos->resource_limits.max_instances != DDS_LENGTH_UNLIMITED ||
 | 
			
		||||
          qos->resource_limits.max_samples_per_instance != DDS_LENGTH_UNLIMITED);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool dds__validate_builtin_reader_qos (dds_entity_t topic, const dds_qos_t *qos)
 | 
			
		||||
bool dds__validate_builtin_reader_qos (const dds_domain *dom, dds_entity_t topic, const dds_qos_t *qos)
 | 
			
		||||
{
 | 
			
		||||
  if (qos == NULL)
 | 
			
		||||
    /* default QoS inherited from topic is ok by definition */
 | 
			
		||||
    return true;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    /* failing writes on built-in topics are unwelcome complications, so we simply forbid the creation of
 | 
			
		||||
       a reader matching a built-in topics writer that has resource limits */
 | 
			
		||||
    /* failing writes on built-in topics are unwelcome complications, so we simply
 | 
			
		||||
       forbid the creation of a reader matching a built-in topics writer that has
 | 
			
		||||
       resource limits */
 | 
			
		||||
    struct local_orphan_writer *bwr;
 | 
			
		||||
    if (topic == DDS_BUILTIN_TOPIC_DCPSPARTICIPANT) {
 | 
			
		||||
      bwr = builtintopic_writer_participant;
 | 
			
		||||
    } else if (topic == DDS_BUILTIN_TOPIC_DCPSPUBLICATION) {
 | 
			
		||||
      bwr = builtintopic_writer_publications;
 | 
			
		||||
    } else if (topic == DDS_BUILTIN_TOPIC_DCPSSUBSCRIPTION) {
 | 
			
		||||
      bwr = builtintopic_writer_subscriptions;
 | 
			
		||||
    } else {
 | 
			
		||||
      assert (0);
 | 
			
		||||
      return false;
 | 
			
		||||
    switch (topic)
 | 
			
		||||
    {
 | 
			
		||||
      case DDS_BUILTIN_TOPIC_DCPSPARTICIPANT:
 | 
			
		||||
        bwr = dom->builtintopic_writer_participant;
 | 
			
		||||
        break;
 | 
			
		||||
      case DDS_BUILTIN_TOPIC_DCPSPUBLICATION:
 | 
			
		||||
        bwr = dom->builtintopic_writer_publications;
 | 
			
		||||
        break;
 | 
			
		||||
      case DDS_BUILTIN_TOPIC_DCPSSUBSCRIPTION:
 | 
			
		||||
        bwr = dom->builtintopic_writer_subscriptions;
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        assert (0);
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    return qos_match_p (qos, bwr->wr.xqos) && !qos_has_resource_limits (qos);
 | 
			
		||||
 | 
			
		||||
    /* FIXME: DDSI-level readers, writers have topic, type name in their QoS, but
 | 
			
		||||
       DDSC-level ones don't and that gives an automatic mismatch when comparing
 | 
			
		||||
       the full QoS object ...  Here the two have the same topic by construction
 | 
			
		||||
       so ignoring them in the comparison makes things work.  The discrepancy
 | 
			
		||||
       should be addressed one day. */
 | 
			
		||||
    const uint64_t qmask = ~(QP_TOPIC_NAME | QP_TYPE_NAME);
 | 
			
		||||
    dds_qos_policy_id_t dummy;
 | 
			
		||||
    return qos_match_mask_p (qos, bwr->wr.xqos, qmask, &dummy) && !qos_has_resource_limits (qos);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_entity_t dds__create_builtin_subscriber (dds_entity *participant)
 | 
			
		||||
static dds_entity_t dds__create_builtin_subscriber (dds_participant *participant)
 | 
			
		||||
{
 | 
			
		||||
  dds_qos_t *qos = dds__create_builtin_qos ();
 | 
			
		||||
  dds_entity_t sub = dds__create_subscriber_l (participant, qos, NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -154,27 +142,37 @@ dds_entity_t dds__get_builtin_subscriber (dds_entity_t e)
 | 
			
		|||
    return ret;
 | 
			
		||||
 | 
			
		||||
  if (p->m_builtin_subscriber <= 0) {
 | 
			
		||||
    p->m_builtin_subscriber = dds__create_builtin_subscriber (&p->m_entity);
 | 
			
		||||
    p->m_builtin_subscriber = dds__create_builtin_subscriber (p);
 | 
			
		||||
  }
 | 
			
		||||
  sub = p->m_builtin_subscriber;
 | 
			
		||||
  dds_participant_unlock(p);
 | 
			
		||||
  return sub;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool dds__builtin_is_visible (nn_entityid_t entityid, bool onlylocal, nn_vendorid_t vendorid)
 | 
			
		||||
static bool dds__builtin_is_builtintopic (const struct ddsi_sertopic *tp, void *vdomain)
 | 
			
		||||
{
 | 
			
		||||
  return !(onlylocal || is_builtin_endpoint (entityid, vendorid));
 | 
			
		||||
  (void) vdomain;
 | 
			
		||||
  return tp->ops == &ddsi_sertopic_ops_builtintopic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ddsi_tkmap_instance *dds__builtin_get_tkmap_entry (const struct nn_guid *guid)
 | 
			
		||||
static bool dds__builtin_is_visible (const nn_guid_t *guid, nn_vendorid_t vendorid, void *vdomain)
 | 
			
		||||
{
 | 
			
		||||
  (void) vdomain;
 | 
			
		||||
  if (is_builtin_endpoint (guid->entityid, vendorid))
 | 
			
		||||
    return false;
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct ddsi_tkmap_instance *dds__builtin_get_tkmap_entry (const struct nn_guid *guid, void *vdomain)
 | 
			
		||||
{
 | 
			
		||||
  struct dds_domain *domain = vdomain;
 | 
			
		||||
  struct ddsi_tkmap_instance *tk;
 | 
			
		||||
  struct ddsi_serdata *sd;
 | 
			
		||||
  struct nn_keyhash kh;
 | 
			
		||||
  memcpy (&kh, guid, sizeof (kh));
 | 
			
		||||
  /* any random builtin topic will do (provided it has a GUID for a key), because what matters is the "class" of the topic, not the actual topic; also, this is called early in the initialisation of the entity with this GUID, which simply causes serdata_from_keyhash to create a key-only serdata because the key lookup fails. */
 | 
			
		||||
  sd = ddsi_serdata_from_keyhash (builtin_participant_topic, &kh);
 | 
			
		||||
  tk = ddsi_tkmap_find (sd, false, true);
 | 
			
		||||
  sd = ddsi_serdata_from_keyhash (domain->builtin_participant_topic, &kh);
 | 
			
		||||
  tk = ddsi_tkmap_find (domain->gv.m_tkmap, sd, true);
 | 
			
		||||
  ddsi_serdata_unref (sd);
 | 
			
		||||
  return tk;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -182,6 +180,7 @@ struct ddsi_tkmap_instance *dds__builtin_get_tkmap_entry (const struct nn_guid *
 | 
			
		|||
struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn_wctime_t timestamp, bool alive)
 | 
			
		||||
{
 | 
			
		||||
  /* initialize to avoid gcc warning ultimately caused by C's horrible type system */
 | 
			
		||||
  struct dds_domain *dom = e->gv->builtin_topic_interface->arg;
 | 
			
		||||
  struct ddsi_sertopic *topic = NULL;
 | 
			
		||||
  struct ddsi_serdata *serdata;
 | 
			
		||||
  struct nn_keyhash keyhash;
 | 
			
		||||
| 
						 | 
				
			
			@ -189,15 +188,15 @@ struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn
 | 
			
		|||
  {
 | 
			
		||||
    case EK_PARTICIPANT:
 | 
			
		||||
    case EK_PROXY_PARTICIPANT:
 | 
			
		||||
      topic = builtin_participant_topic;
 | 
			
		||||
      topic = dom->builtin_participant_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    case EK_WRITER:
 | 
			
		||||
    case EK_PROXY_WRITER:
 | 
			
		||||
      topic = builtin_writer_topic;
 | 
			
		||||
      topic = dom->builtin_writer_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    case EK_READER:
 | 
			
		||||
    case EK_PROXY_READER:
 | 
			
		||||
      topic = builtin_reader_topic;
 | 
			
		||||
      topic = dom->builtin_reader_topic;
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  assert (topic != NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -208,9 +207,10 @@ struct ddsi_serdata *dds__builtin_make_sample (const struct entity_common *e, nn
 | 
			
		|||
  return serdata;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds__builtin_write (const struct entity_common *e, nn_wctime_t timestamp, bool alive)
 | 
			
		||||
static void dds__builtin_write (const struct entity_common *e, nn_wctime_t timestamp, bool alive, void *vdomain)
 | 
			
		||||
{
 | 
			
		||||
  if (ddsi_plugin.builtintopic_is_visible (e->guid.entityid, e->onlylocal, get_entity_vendorid (e)))
 | 
			
		||||
  struct dds_domain *dom = vdomain;
 | 
			
		||||
  if (dds__builtin_is_visible (&e->guid, get_entity_vendorid (e), dom))
 | 
			
		||||
  {
 | 
			
		||||
    /* initialize to avoid gcc warning ultimately caused by C's horrible type system */
 | 
			
		||||
    struct local_orphan_writer *bwr = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -220,17 +220,54 @@ void dds__builtin_write (const struct entity_common *e, nn_wctime_t timestamp, b
 | 
			
		|||
    {
 | 
			
		||||
      case EK_PARTICIPANT:
 | 
			
		||||
      case EK_PROXY_PARTICIPANT:
 | 
			
		||||
        bwr = builtintopic_writer_participant;
 | 
			
		||||
        bwr = dom->builtintopic_writer_participant;
 | 
			
		||||
        break;
 | 
			
		||||
      case EK_WRITER:
 | 
			
		||||
      case EK_PROXY_WRITER:
 | 
			
		||||
        bwr = builtintopic_writer_publications;
 | 
			
		||||
        bwr = dom->builtintopic_writer_publications;
 | 
			
		||||
        break;
 | 
			
		||||
      case EK_READER:
 | 
			
		||||
      case EK_PROXY_READER:
 | 
			
		||||
        bwr = builtintopic_writer_subscriptions;
 | 
			
		||||
        bwr = dom->builtintopic_writer_subscriptions;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    dds_writecdr_impl_lowlevel (&bwr->wr, NULL, serdata);
 | 
			
		||||
    dds_writecdr_impl_lowlevel (&bwr->wr, NULL, serdata, true);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds__builtin_init (struct dds_domain *dom)
 | 
			
		||||
{
 | 
			
		||||
  dds_qos_t *qos = dds__create_builtin_qos ();
 | 
			
		||||
 | 
			
		||||
  dom->btif.arg = dom;
 | 
			
		||||
  dom->btif.builtintopic_get_tkmap_entry = dds__builtin_get_tkmap_entry;
 | 
			
		||||
  dom->btif.builtintopic_is_builtintopic = dds__builtin_is_builtintopic;
 | 
			
		||||
  dom->btif.builtintopic_is_visible = dds__builtin_is_visible;
 | 
			
		||||
  dom->btif.builtintopic_write = dds__builtin_write;
 | 
			
		||||
  dom->gv.builtin_topic_interface = &dom->btif;
 | 
			
		||||
 | 
			
		||||
  dom->builtin_participant_topic = new_sertopic_builtintopic (DSBT_PARTICIPANT, "DCPSParticipant", "org::eclipse::cyclonedds::builtin::DCPSParticipant", &dom->gv);
 | 
			
		||||
  dom->builtin_reader_topic = new_sertopic_builtintopic (DSBT_READER, "DCPSSubscription", "org::eclipse::cyclonedds::builtin::DCPSSubscription", &dom->gv);
 | 
			
		||||
  dom->builtin_writer_topic = new_sertopic_builtintopic (DSBT_WRITER, "DCPSPublication", "org::eclipse::cyclonedds::builtin::DCPSPublication", &dom->gv);
 | 
			
		||||
 | 
			
		||||
  const struct ephash *gh = dom->gv.guid_hash;
 | 
			
		||||
  dom->builtintopic_writer_participant = new_local_orphan_writer (&dom->gv, to_entityid (NN_ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER), dom->builtin_participant_topic, qos, builtintopic_whc_new (DSBT_PARTICIPANT, gh));
 | 
			
		||||
  dom->builtintopic_writer_publications = new_local_orphan_writer (&dom->gv, to_entityid (NN_ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER), dom->builtin_writer_topic, qos, builtintopic_whc_new (DSBT_WRITER, gh));
 | 
			
		||||
  dom->builtintopic_writer_subscriptions = new_local_orphan_writer (&dom->gv, to_entityid (NN_ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER), dom->builtin_reader_topic, qos, builtintopic_whc_new (DSBT_READER, gh));
 | 
			
		||||
 | 
			
		||||
  dds_delete_qos (qos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds__builtin_fini (struct dds_domain *dom)
 | 
			
		||||
{
 | 
			
		||||
  /* No more sources for builtin topic samples */
 | 
			
		||||
  thread_state_awake (lookup_thread_state (), &dom->gv);
 | 
			
		||||
  delete_local_orphan_writer (dom->builtintopic_writer_participant);
 | 
			
		||||
  delete_local_orphan_writer (dom->builtintopic_writer_publications);
 | 
			
		||||
  delete_local_orphan_writer (dom->builtintopic_writer_subscriptions);
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
 | 
			
		||||
  ddsi_sertopic_unref (dom->builtin_participant_topic);
 | 
			
		||||
  ddsi_sertopic_unref (dom->builtin_reader_topic);
 | 
			
		||||
  ddsi_sertopic_unref (dom->builtin_writer_topic);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,19 +15,14 @@
 | 
			
		|||
#include "dds__entity.h"
 | 
			
		||||
#include "dds__subscriber.h"
 | 
			
		||||
#include "dds__publisher.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_begin_coherent(
 | 
			
		||||
  dds_entity_t entity)
 | 
			
		||||
dds_return_t dds_begin_coherent (dds_entity_t entity)
 | 
			
		||||
{
 | 
			
		||||
  static const dds_entity_kind_t kinds[] = { DDS_KIND_READER, DDS_KIND_WRITER, DDS_KIND_PUBLISHER, DDS_KIND_SUBSCRIBER };
 | 
			
		||||
  return dds_generic_unimplemented_operation_manykinds (entity, sizeof (kinds) / sizeof (kinds[0]), kinds);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_end_coherent(
 | 
			
		||||
  dds_entity_t entity)
 | 
			
		||||
dds_return_t dds_end_coherent (dds_entity_t entity)
 | 
			
		||||
{
 | 
			
		||||
  static const dds_entity_kind_t kinds[] = { DDS_KIND_READER, DDS_KIND_WRITER, DDS_KIND_PUBLISHER, DDS_KIND_SUBSCRIBER };
 | 
			
		||||
  return dds_generic_unimplemented_operation_manykinds (entity, sizeof (kinds) / sizeof (kinds[0]), kinds);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2006 to 2018 ADLINK Technology Limited and others
 | 
			
		||||
 * Copyright(c) 2006 to 2019 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
 | 
			
		||||
| 
						 | 
				
			
			@ -9,51 +9,317 @@
 | 
			
		|||
 *
 | 
			
		||||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#include "dds__domain.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
static int dds_domain_compare (const int32_t * a, const int32_t * b)
 | 
			
		||||
#include "dds/ddsrt/environ.h"
 | 
			
		||||
#include "dds/ddsrt/process.h"
 | 
			
		||||
#include "dds/ddsrt/heap.h"
 | 
			
		||||
#include "dds__init.h"
 | 
			
		||||
#include "dds__rhc.h"
 | 
			
		||||
#include "dds__domain.h"
 | 
			
		||||
#include "dds__builtin.h"
 | 
			
		||||
#include "dds__whc_builtintopic.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_iid.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_serdata.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_threadmon.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_gc.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds/version.h"
 | 
			
		||||
 | 
			
		||||
static int dds_domain_compare (const void *va, const void *vb)
 | 
			
		||||
{
 | 
			
		||||
  const dds_domainid_t *a = va;
 | 
			
		||||
  const dds_domainid_t *b = vb;
 | 
			
		||||
  return (*a == *b) ? 0 : (*a < *b) ? -1 : 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const ddsrt_avl_treedef_t dds_domaintree_def = DDSRT_AVL_TREEDEF_INITIALIZER
 | 
			
		||||
(
 | 
			
		||||
  offsetof (dds_domain, m_node),
 | 
			
		||||
  offsetof (dds_domain, m_id),
 | 
			
		||||
  (int (*) (const void *, const void *)) dds_domain_compare,
 | 
			
		||||
  0
 | 
			
		||||
);
 | 
			
		||||
static const ddsrt_avl_treedef_t dds_domaintree_def = DDSRT_AVL_TREEDEF_INITIALIZER (
 | 
			
		||||
  offsetof (dds_domain, m_node), offsetof (dds_domain, m_id), dds_domain_compare, 0);
 | 
			
		||||
 | 
			
		||||
dds_domain * dds_domain_find_locked (dds_domainid_t id)
 | 
			
		||||
static dds_return_t dds_domain_init (dds_domain *domain, dds_domainid_t domain_id)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  char * uri = NULL;
 | 
			
		||||
  uint32_t len;
 | 
			
		||||
 | 
			
		||||
  domain->gv.tstart = now ();
 | 
			
		||||
  domain->m_refc = 1;
 | 
			
		||||
  ddsrt_avl_init (&dds_topictree_def, &domain->m_topics);
 | 
			
		||||
 | 
			
		||||
  /* | domain_id | domain id in config | result
 | 
			
		||||
     +-----------+---------------------+----------
 | 
			
		||||
     | DEFAULT   | any (or absent)     | 0
 | 
			
		||||
     | DEFAULT   | n                   | n
 | 
			
		||||
     | n         | any (or absent)     | n
 | 
			
		||||
     | n         | m = n               | n
 | 
			
		||||
     | n         | m /= n              | n, entire config ignored
 | 
			
		||||
 | 
			
		||||
     Config models:
 | 
			
		||||
     1: <CycloneDDS>
 | 
			
		||||
          <Domain id="X">...</Domain>
 | 
			
		||||
          <Domain .../>
 | 
			
		||||
        </CycloneDDS>
 | 
			
		||||
        where ... is all that can today be set in children of CycloneDDS
 | 
			
		||||
        with the exception of the id
 | 
			
		||||
     2: <CycloneDDS>
 | 
			
		||||
          <Domain><Id>X</Id></Domain>
 | 
			
		||||
          ...
 | 
			
		||||
        </CycloneDDS>
 | 
			
		||||
        legacy form, domain id must be the first element in the file with
 | 
			
		||||
        a value (if nothing has been set previously, it a warning is good
 | 
			
		||||
        enough) */
 | 
			
		||||
 | 
			
		||||
  (void) ddsrt_getenv ("CYCLONEDDS_URI", &uri);
 | 
			
		||||
  domain->cfgst = config_init (uri, &domain->gv.config, domain_id);
 | 
			
		||||
  if (domain->cfgst == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_ILOG (DDS_LC_CONFIG, domain_id, "Failed to parse configuration XML file %s\n", uri);
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
    goto fail_config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  assert (domain_id == DDS_DOMAIN_DEFAULT || domain_id == domain->gv.config.domainId);
 | 
			
		||||
  domain->m_id = domain->gv.config.domainId;
 | 
			
		||||
 | 
			
		||||
  if (rtps_config_prep (&domain->gv, domain->cfgst) != 0)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_ILOG (DDS_LC_CONFIG, domain->m_id, "Failed to configure RTPS\n");
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
    goto fail_rtps_config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (rtps_init (&domain->gv) < 0)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_ILOG (DDS_LC_CONFIG, domain->m_id, "Failed to initialize RTPS\n");
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
    goto fail_rtps_init;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Start monitoring the liveliness of threads if this is the first
 | 
			
		||||
     domain to configured to do so. */
 | 
			
		||||
  if (domain->gv.config.liveliness_monitoring)
 | 
			
		||||
  {
 | 
			
		||||
    if (dds_global.threadmon_count++ == 0)
 | 
			
		||||
    {
 | 
			
		||||
      /* FIXME: configure settings */
 | 
			
		||||
      dds_global.threadmon = ddsi_threadmon_new (DDS_MSECS (333), true);
 | 
			
		||||
      if (dds_global.threadmon == NULL)
 | 
			
		||||
      {
 | 
			
		||||
        DDS_ILOG (DDS_LC_CONFIG, domain->m_id, "Failed to create a thread liveliness monitor\n");
 | 
			
		||||
        ret = DDS_RETCODE_OUT_OF_RESOURCES;
 | 
			
		||||
        goto fail_threadmon_new;
 | 
			
		||||
      }
 | 
			
		||||
      /* FIXME: thread properties */
 | 
			
		||||
      if (ddsi_threadmon_start (dds_global.threadmon, "threadmon") < 0)
 | 
			
		||||
      {
 | 
			
		||||
        DDS_ILOG (DDS_LC_ERROR, domain->m_id, "Failed to start the thread liveliness monitor\n");
 | 
			
		||||
        ret = DDS_RETCODE_ERROR;
 | 
			
		||||
        goto fail_threadmon_start;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  dds__builtin_init (domain);
 | 
			
		||||
 | 
			
		||||
  /* Set additional default participant properties */
 | 
			
		||||
 | 
			
		||||
  char progname[50] = "UNKNOWN"; /* FIXME: once retrieving process names is back in */
 | 
			
		||||
  char hostname[64];
 | 
			
		||||
  domain->gv.default_local_plist_pp.process_id = (unsigned) ddsrt_getpid();
 | 
			
		||||
  domain->gv.default_local_plist_pp.present |= PP_PRISMTECH_PROCESS_ID;
 | 
			
		||||
  domain->gv.default_local_plist_pp.exec_name = dds_string_alloc(32);
 | 
			
		||||
  (void) snprintf (domain->gv.default_local_plist_pp.exec_name, 32, "CycloneDDS: %u", domain->gv.default_local_plist_pp.process_id);
 | 
			
		||||
  len = (uint32_t) (13 + strlen (domain->gv.default_local_plist_pp.exec_name));
 | 
			
		||||
  domain->gv.default_local_plist_pp.present |= PP_PRISMTECH_EXEC_NAME;
 | 
			
		||||
  if (ddsrt_gethostname (hostname, sizeof (hostname)) == DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    domain->gv.default_local_plist_pp.node_name = dds_string_dup (hostname);
 | 
			
		||||
    domain->gv.default_local_plist_pp.present |= PP_PRISMTECH_NODE_NAME;
 | 
			
		||||
  }
 | 
			
		||||
  domain->gv.default_local_plist_pp.entity_name = dds_alloc (len);
 | 
			
		||||
  (void) snprintf (domain->gv.default_local_plist_pp.entity_name, len, "%s<%u>", progname, domain->gv.default_local_plist_pp.process_id);
 | 
			
		||||
  domain->gv.default_local_plist_pp.present |= PP_ENTITY_NAME;
 | 
			
		||||
 | 
			
		||||
  if (rtps_start (&domain->gv) < 0)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_ILOG (DDS_LC_CONFIG, domain->m_id, "Failed to start RTPS\n");
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
    goto fail_rtps_start;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (domain->gv.config.liveliness_monitoring)
 | 
			
		||||
    ddsi_threadmon_register_domain (dds_global.threadmon, &domain->gv);
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
  rtps_stop (&domain->gv);
 | 
			
		||||
fail_rtps_start:
 | 
			
		||||
  if (domain->gv.config.liveliness_monitoring && dds_global.threadmon_count == 1)
 | 
			
		||||
    ddsi_threadmon_stop (dds_global.threadmon);
 | 
			
		||||
fail_threadmon_start:
 | 
			
		||||
  if (domain->gv.config.liveliness_monitoring && --dds_global.threadmon_count == 0)
 | 
			
		||||
  {
 | 
			
		||||
    ddsi_threadmon_free (dds_global.threadmon);
 | 
			
		||||
    dds_global.threadmon = NULL;
 | 
			
		||||
  }
 | 
			
		||||
fail_threadmon_new:
 | 
			
		||||
  rtps_fini (&domain->gv);
 | 
			
		||||
fail_rtps_init:
 | 
			
		||||
fail_rtps_config:
 | 
			
		||||
  config_fini (domain->cfgst);
 | 
			
		||||
fail_config:
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dds_domain_fini (struct dds_domain *domain)
 | 
			
		||||
{
 | 
			
		||||
  rtps_stop (&domain->gv);
 | 
			
		||||
  dds__builtin_fini (domain);
 | 
			
		||||
 | 
			
		||||
  if (domain->gv.config.liveliness_monitoring)
 | 
			
		||||
    ddsi_threadmon_unregister_domain (dds_global.threadmon, &domain->gv);
 | 
			
		||||
 | 
			
		||||
  rtps_fini (&domain->gv);
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
  if (domain->gv.config.liveliness_monitoring && --dds_global.threadmon_count == 0)
 | 
			
		||||
  {
 | 
			
		||||
    ddsi_threadmon_stop (dds_global.threadmon);
 | 
			
		||||
    ddsi_threadmon_free (dds_global.threadmon);
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
 | 
			
		||||
  config_fini (domain->cfgst);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_domain *dds_domain_find_locked (dds_domainid_t id)
 | 
			
		||||
{
 | 
			
		||||
  return ddsrt_avl_lookup (&dds_domaintree_def, &dds_global.m_domains, &id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_domain * dds_domain_create (dds_domainid_t id)
 | 
			
		||||
dds_return_t dds_domain_create (dds_domain **domain_out, dds_domainid_t id)
 | 
			
		||||
{
 | 
			
		||||
  dds_domain * domain;
 | 
			
		||||
  struct dds_domain *dom = NULL;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
  domain = dds_domain_find_locked (id);
 | 
			
		||||
  if (domain == NULL)
 | 
			
		||||
 | 
			
		||||
  /* FIXME: hack around default domain ids, not yet being able to handle multiple domains simultaneously */
 | 
			
		||||
  if (id != DDS_DOMAIN_DEFAULT)
 | 
			
		||||
  {
 | 
			
		||||
    domain = dds_alloc (sizeof (*domain));
 | 
			
		||||
    domain->m_id = id;
 | 
			
		||||
    ddsrt_avl_init (&dds_topictree_def, &domain->m_topics);
 | 
			
		||||
    ddsrt_avl_insert (&dds_domaintree_def, &dds_global.m_domains, domain);
 | 
			
		||||
    if ((dom = dds_domain_find_locked (id)) == NULL)
 | 
			
		||||
      ret = DDS_RETCODE_NOT_FOUND;
 | 
			
		||||
    else
 | 
			
		||||
      ret = DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    if ((dom = ddsrt_avl_find_min (&dds_domaintree_def, &dds_global.m_domains)) != NULL)
 | 
			
		||||
      ret = DDS_RETCODE_OK;
 | 
			
		||||
    else
 | 
			
		||||
      ret = DDS_RETCODE_NOT_FOUND;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  switch (ret)
 | 
			
		||||
  {
 | 
			
		||||
    case DDS_RETCODE_OK:
 | 
			
		||||
      dom->m_refc++;
 | 
			
		||||
      *domain_out = dom;
 | 
			
		||||
      break;
 | 
			
		||||
    case DDS_RETCODE_NOT_FOUND:
 | 
			
		||||
      dom = dds_alloc (sizeof (*dom));
 | 
			
		||||
      if ((ret = dds_domain_init (dom, id)) < 0)
 | 
			
		||||
        dds_free (dom);
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        ddsrt_avl_insert (&dds_domaintree_def, &dds_global.m_domains, dom);
 | 
			
		||||
        *domain_out = dom;
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case DDS_RETCODE_PRECONDITION_NOT_MET:
 | 
			
		||||
      DDS_ILOG (DDS_LC_ERROR, id, "Inconsistent domain configuration detected: domain on configuration: %"PRIu32", domain %"PRIu32"\n", dom->m_id, id);
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  domain->m_refc++;
 | 
			
		||||
  ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
  return domain;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_domain_free (dds_domain * domain)
 | 
			
		||||
void dds_domain_free (dds_domain *domain)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
  if (--domain->m_refc == 0)
 | 
			
		||||
  if (--domain->m_refc != 0)
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_avl_delete (&dds_domaintree_def, &dds_global.m_domains, domain);
 | 
			
		||||
    ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
    dds_domain_fini (domain);
 | 
			
		||||
    dds_free (domain);
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include "dds__entity.h"
 | 
			
		||||
static void pushdown_set_batch (struct dds_entity *e, bool enable)
 | 
			
		||||
{
 | 
			
		||||
  /* e is pinned, no locks held */
 | 
			
		||||
  dds_instance_handle_t last_iid = 0;
 | 
			
		||||
  struct dds_entity *c;
 | 
			
		||||
  ddsrt_mutex_lock (&e->m_mutex);
 | 
			
		||||
  while ((c = ddsrt_avl_lookup_succ (&dds_entity_children_td, &e->m_children, &last_iid)) != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    struct dds_entity *x;
 | 
			
		||||
    last_iid = c->m_iid;
 | 
			
		||||
    if (dds_entity_pin (c->m_hdllink.hdl, &x) < 0)
 | 
			
		||||
      continue;
 | 
			
		||||
    assert (x == c);
 | 
			
		||||
    ddsrt_mutex_unlock (&e->m_mutex);
 | 
			
		||||
    if (c->m_kind == DDS_KIND_PARTICIPANT)
 | 
			
		||||
      pushdown_set_batch (c, enable);
 | 
			
		||||
    else if (c->m_kind == DDS_KIND_WRITER)
 | 
			
		||||
    {
 | 
			
		||||
      struct dds_writer *w = (struct dds_writer *) c;
 | 
			
		||||
      w->whc_batch = enable;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&e->m_mutex);
 | 
			
		||||
    dds_entity_unpin (c);
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&e->m_mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_write_set_batch (bool enable)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: get channels + latency budget working and get rid of this; in the mean time, any ugly hack will do.  */
 | 
			
		||||
  struct dds_domain *dom;
 | 
			
		||||
  dds_domainid_t next_id = 0;
 | 
			
		||||
  dds_init ();
 | 
			
		||||
  ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
  while ((dom = ddsrt_avl_lookup_succ_eq (&dds_domaintree_def, &dds_global.m_domains, &next_id)) != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    /* Must be sure that the compiler doesn't reload curr_id from dom->m_id */
 | 
			
		||||
    dds_domainid_t curr_id = *((volatile dds_domainid_t *) &dom->m_id);
 | 
			
		||||
    next_id = curr_id + 1;
 | 
			
		||||
    dom->gv.config.whc_batch = enable;
 | 
			
		||||
 | 
			
		||||
    dds_instance_handle_t last_iid = 0;
 | 
			
		||||
    struct dds_entity *e;
 | 
			
		||||
    while (dom && (e = ddsrt_avl_lookup_succ (&dds_entity_children_td, &dom->m_ppants, &last_iid)) != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      struct dds_entity *x;
 | 
			
		||||
      last_iid = e->m_iid;
 | 
			
		||||
      if (dds_entity_pin (e->m_hdllink.hdl, &x) < 0)
 | 
			
		||||
        continue;
 | 
			
		||||
      assert (x == e);
 | 
			
		||||
      ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
      pushdown_set_batch (e, enable);
 | 
			
		||||
      ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
      dds_entity_unpin (e);
 | 
			
		||||
      dom = ddsrt_avl_lookup (&dds_domaintree_def, &dds_global.m_domains, &curr_id);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
  dds_fini ();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -14,24 +14,33 @@
 | 
			
		|||
#include "dds__reader.h"
 | 
			
		||||
#include "dds__guardcond.h"
 | 
			
		||||
#include "dds__participant.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_iid.h"
 | 
			
		||||
#include "dds/ddsi/q_ephash.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK(extern inline, dds_guardcond)
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK (extern inline, dds_guardcond)
 | 
			
		||||
 | 
			
		||||
const struct dds_entity_deriver dds_entity_deriver_guardcondition = {
 | 
			
		||||
  .close = dds_entity_deriver_dummy_close,
 | 
			
		||||
  .delete = dds_entity_deriver_dummy_delete,
 | 
			
		||||
  .set_qos = dds_entity_deriver_dummy_set_qos,
 | 
			
		||||
  .validate_status = dds_entity_deriver_dummy_validate_status
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_guardcondition (dds_entity_t participant)
 | 
			
		||||
{
 | 
			
		||||
  dds_participant *pp;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_participant_lock (participant, &pp)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (rc);
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_guardcond * gcond = dds_alloc (sizeof (*gcond));
 | 
			
		||||
    dds_guardcond *gcond = dds_alloc (sizeof (*gcond));
 | 
			
		||||
    dds_entity_t hdl = dds_entity_init (&gcond->m_entity, &pp->m_entity, DDS_KIND_COND_GUARD, NULL, NULL, 0);
 | 
			
		||||
    gcond->m_entity.m_iid = ddsi_iid_gen ();
 | 
			
		||||
    dds_entity_register_child (&pp->m_entity, &gcond->m_entity);
 | 
			
		||||
    dds_participant_unlock (pp);
 | 
			
		||||
    return hdl;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -40,18 +49,16 @@ dds_entity_t dds_create_guardcondition (dds_entity_t participant)
 | 
			
		|||
dds_return_t dds_set_guardcondition (dds_entity_t condition, bool triggered)
 | 
			
		||||
{
 | 
			
		||||
  dds_guardcond *gcond;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_guardcond_lock (condition, &gcond)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_lock (&gcond->m_entity.m_observers_lock);
 | 
			
		||||
    if (triggered)
 | 
			
		||||
      dds_entity_status_set (&gcond->m_entity, DDS_WAITSET_TRIGGER_STATUS);
 | 
			
		||||
      dds_entity_trigger_set (&gcond->m_entity, 1);
 | 
			
		||||
    else
 | 
			
		||||
      dds_entity_status_reset (&gcond->m_entity, DDS_WAITSET_TRIGGER_STATUS);
 | 
			
		||||
    ddsrt_mutex_unlock (&gcond->m_entity.m_observers_lock);
 | 
			
		||||
      ddsrt_atomic_st32 (&gcond->m_entity.m_status.m_trigger, 0);
 | 
			
		||||
    dds_guardcond_unlock (gcond);
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -60,19 +67,17 @@ dds_return_t dds_set_guardcondition (dds_entity_t condition, bool triggered)
 | 
			
		|||
dds_return_t dds_read_guardcondition (dds_entity_t condition, bool *triggered)
 | 
			
		||||
{
 | 
			
		||||
  dds_guardcond *gcond;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
 | 
			
		||||
  if (triggered == NULL)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  *triggered = false;
 | 
			
		||||
  if ((rc = dds_guardcond_lock (condition, &gcond)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_lock (&gcond->m_entity.m_observers_lock);
 | 
			
		||||
    *triggered = dds_entity_status_match (&gcond->m_entity, DDS_WAITSET_TRIGGER_STATUS);
 | 
			
		||||
    ddsrt_mutex_unlock (&gcond->m_entity.m_observers_lock);
 | 
			
		||||
    *triggered = (ddsrt_atomic_ld32 (&gcond->m_entity.m_status.m_trigger) != 0);
 | 
			
		||||
    dds_guardcond_unlock (gcond);
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -81,20 +86,17 @@ dds_return_t dds_read_guardcondition (dds_entity_t condition, bool *triggered)
 | 
			
		|||
dds_return_t dds_take_guardcondition (dds_entity_t condition, bool *triggered)
 | 
			
		||||
{
 | 
			
		||||
  dds_guardcond *gcond;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
 | 
			
		||||
  if (triggered == NULL)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  *triggered = false;
 | 
			
		||||
  if ((rc = dds_guardcond_lock (condition, &gcond)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_lock (&gcond->m_entity.m_observers_lock);
 | 
			
		||||
    *triggered = dds_entity_status_match (&gcond->m_entity, DDS_WAITSET_TRIGGER_STATUS);
 | 
			
		||||
    dds_entity_status_reset (&gcond->m_entity, DDS_WAITSET_TRIGGER_STATUS);
 | 
			
		||||
    ddsrt_mutex_unlock (&gcond->m_entity.m_observers_lock);
 | 
			
		||||
    *triggered = (ddsrt_atomic_and32_ov (&gcond->m_entity.m_status.m_trigger, 0) != 0);
 | 
			
		||||
    dds_guardcond_unlock (gcond);
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,6 @@
 | 
			
		|||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds__handles.h"
 | 
			
		||||
#include "dds__types.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
 | 
			
		||||
/* FIXME: this code isn't really correct when USE_CHH is set:
 | 
			
		||||
   - the DDS entity code doesn't really play by the awake/asleep mechanism
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +28,19 @@
 | 
			
		|||
#define USE_CHH 0
 | 
			
		||||
 | 
			
		||||
#define HDL_FLAG_CLOSED    (0x80000000u)
 | 
			
		||||
#define HDL_COUNT_MASK     (0x00ffffffu)
 | 
			
		||||
 | 
			
		||||
/* ref count: # outstanding references to this handle/object (not so sure it is
 | 
			
		||||
   ideal to have a one-to-one mapping between the two, but that is what the rest
 | 
			
		||||
   of the code assumes at the moment); so this limits one to having, e.g., no
 | 
			
		||||
   more than 64k endpoints referencing the same topic */
 | 
			
		||||
#define HDL_REFCOUNT_MASK  (0x0ffff000u)
 | 
			
		||||
#define HDL_REFCOUNT_UNIT  (0x00001000u)
 | 
			
		||||
#define HDL_REFCOUNT_SHIFT 12
 | 
			
		||||
 | 
			
		||||
/* pin count: # concurrent operations, so allowing up to 4096 threads had better
 | 
			
		||||
   be enough ... */
 | 
			
		||||
#define HDL_PINCOUNT_MASK  (0x00000fffu)
 | 
			
		||||
#define HDL_PINCOUNT_UNIT  (0x00000001u)
 | 
			
		||||
 | 
			
		||||
/* Maximum number of handles is INT32_MAX - 1, but as the allocator relies on a
 | 
			
		||||
   random generator for finding a free one, the time spent in the dds_handle_create
 | 
			
		||||
| 
						 | 
				
			
			@ -65,13 +76,12 @@ static int handle_equal (const void *va, const void *vb)
 | 
			
		|||
  return a->hdl == b->hdl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_handle_server_init (void (*free_via_gc) (void *x))
 | 
			
		||||
dds_return_t dds_handle_server_init (void)
 | 
			
		||||
{
 | 
			
		||||
#if USE_CHH
 | 
			
		||||
  handles.ht = ddsrt_chh_new (128, handle_hash, handle_equal, free_via_gc);
 | 
			
		||||
#else
 | 
			
		||||
  handles.ht = ddsrt_hh_new (128, handle_hash, handle_equal);
 | 
			
		||||
  (void) free_via_gc;
 | 
			
		||||
#endif
 | 
			
		||||
  handles.count = 0;
 | 
			
		||||
  ddsrt_mutex_init (&handles.lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +116,7 @@ static bool hhadd (struct ddsrt_hh *ht, void *elem) { return ddsrt_hh_add (ht, e
 | 
			
		|||
#endif
 | 
			
		||||
static dds_handle_t dds_handle_create_int (struct dds_handle_link *link)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_atomic_st32 (&link->cnt_flags, 0);
 | 
			
		||||
  ddsrt_atomic_st32 (&link->cnt_flags, HDL_REFCOUNT_UNIT);
 | 
			
		||||
  do {
 | 
			
		||||
    do {
 | 
			
		||||
      link->hdl = (int32_t) (ddsrt_random () & INT32_MAX);
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +138,7 @@ dds_handle_t dds_handle_create (struct dds_handle_link *link)
 | 
			
		|||
  if (handles.count == MAX_HANDLES)
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_unlock (&handles.lock);
 | 
			
		||||
    ret = DDS_ERRNO (DDS_RETCODE_OUT_OF_RESOURCES);
 | 
			
		||||
    ret = DDS_RETCODE_OUT_OF_RESOURCES;
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -160,11 +170,12 @@ int32_t dds_handle_delete (struct dds_handle_link *link, dds_duration_t timeout)
 | 
			
		|||
#endif
 | 
			
		||||
  assert (ddsrt_atomic_ld32 (&link->cnt_flags) & HDL_FLAG_CLOSED);
 | 
			
		||||
  ddsrt_mutex_lock (&handles.lock);
 | 
			
		||||
  if ((ddsrt_atomic_ld32 (&link->cnt_flags) & HDL_COUNT_MASK) != 0)
 | 
			
		||||
  if ((ddsrt_atomic_ld32 (&link->cnt_flags) & HDL_PINCOUNT_MASK) != 0)
 | 
			
		||||
  {
 | 
			
		||||
    /* FIXME: */
 | 
			
		||||
    /* FIXME: there is no sensible solution when this times out, so it must
 | 
			
		||||
       never do that ... */
 | 
			
		||||
    const dds_time_t abstimeout = dds_time () + timeout;
 | 
			
		||||
    while ((ddsrt_atomic_ld32 (&link->cnt_flags) & HDL_COUNT_MASK) != 0)
 | 
			
		||||
    while ((ddsrt_atomic_ld32 (&link->cnt_flags) & HDL_PINCOUNT_MASK) != 0)
 | 
			
		||||
    {
 | 
			
		||||
      if (!ddsrt_cond_waituntil (&handles.cond, &handles.lock, abstimeout))
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -189,7 +200,7 @@ int32_t dds_handle_delete (struct dds_handle_link *link, dds_duration_t timeout)
 | 
			
		|||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int32_t dds_handle_claim (dds_handle_t hdl, struct dds_handle_link **link)
 | 
			
		||||
int32_t dds_handle_pin (dds_handle_t hdl, struct dds_handle_link **link)
 | 
			
		||||
{
 | 
			
		||||
#if USE_CHH
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
| 
						 | 
				
			
			@ -197,7 +208,7 @@ int32_t dds_handle_claim (dds_handle_t hdl, struct dds_handle_link **link)
 | 
			
		|||
  struct dds_handle_link dummy = { .hdl = hdl };
 | 
			
		||||
  int32_t rc;
 | 
			
		||||
  /* it makes sense to check here for initialization: the first thing any operation
 | 
			
		||||
     (other than create_participant) does is to call dds_handle_claim on the supplied
 | 
			
		||||
     (other than create_participant) does is to call dds_handle_pin on the supplied
 | 
			
		||||
     entity, so checking here whether the library has been initialised helps avoid
 | 
			
		||||
     crashes if someone forgets to create a participant (or allows a program to
 | 
			
		||||
     continue after failing to create one).
 | 
			
		||||
| 
						 | 
				
			
			@ -229,7 +240,7 @@ int32_t dds_handle_claim (dds_handle_t hdl, struct dds_handle_link **link)
 | 
			
		|||
        rc = DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    } while (!ddsrt_atomic_cas32 (&(*link)->cnt_flags, cnt_flags, cnt_flags + 1));
 | 
			
		||||
    } while (!ddsrt_atomic_cas32 (&(*link)->cnt_flags, cnt_flags, cnt_flags + HDL_PINCOUNT_UNIT));
 | 
			
		||||
  }
 | 
			
		||||
#if USE_CHH
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
| 
						 | 
				
			
			@ -239,16 +250,18 @@ int32_t dds_handle_claim (dds_handle_t hdl, struct dds_handle_link **link)
 | 
			
		|||
  return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_handle_claim_inc (struct dds_handle_link *link)
 | 
			
		||||
void dds_handle_repin (struct dds_handle_link *link)
 | 
			
		||||
{
 | 
			
		||||
  DDSRT_STATIC_ASSERT (HDL_PINCOUNT_UNIT == 1);
 | 
			
		||||
  uint32_t x = ddsrt_atomic_inc32_nv (&link->cnt_flags);
 | 
			
		||||
  assert (!(x & HDL_FLAG_CLOSED));
 | 
			
		||||
  (void) x;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_handle_release (struct dds_handle_link *link)
 | 
			
		||||
void dds_handle_unpin (struct dds_handle_link *link)
 | 
			
		||||
{
 | 
			
		||||
  if (ddsrt_atomic_dec32_ov (&link->cnt_flags) == (HDL_FLAG_CLOSED | 1))
 | 
			
		||||
  DDSRT_STATIC_ASSERT (HDL_PINCOUNT_UNIT == 1);
 | 
			
		||||
  if ((ddsrt_atomic_dec32_ov (&link->cnt_flags) & (HDL_FLAG_CLOSED | HDL_PINCOUNT_MASK)) == (HDL_FLAG_CLOSED | HDL_PINCOUNT_UNIT))
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_lock (&handles.lock);
 | 
			
		||||
    ddsrt_cond_broadcast (&handles.cond);
 | 
			
		||||
| 
						 | 
				
			
			@ -256,6 +269,25 @@ void dds_handle_release (struct dds_handle_link *link)
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_handle_add_ref (struct dds_handle_link *link)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_atomic_add32 (&link->cnt_flags, HDL_REFCOUNT_UNIT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool dds_handle_drop_ref (struct dds_handle_link *link)
 | 
			
		||||
{
 | 
			
		||||
  assert ((ddsrt_atomic_ld32 (&link->cnt_flags) & HDL_REFCOUNT_MASK) != 0);
 | 
			
		||||
  uint32_t old, new;
 | 
			
		||||
  do {
 | 
			
		||||
    old = ddsrt_atomic_ld32 (&link->cnt_flags);
 | 
			
		||||
    if ((old & HDL_REFCOUNT_MASK) != HDL_REFCOUNT_UNIT)
 | 
			
		||||
      new = old - HDL_REFCOUNT_UNIT;
 | 
			
		||||
    else
 | 
			
		||||
      new = (old - HDL_REFCOUNT_UNIT) | HDL_FLAG_CLOSED;
 | 
			
		||||
  } while (!ddsrt_atomic_cas32 (&link->cnt_flags, old, new));
 | 
			
		||||
  return (new & HDL_REFCOUNT_MASK) == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool dds_handle_is_closed (struct dds_handle_link *link)
 | 
			
		||||
{
 | 
			
		||||
  return (ddsrt_atomic_ld32 (&link->cnt_flags) & HDL_FLAG_CLOSED) != 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,6 @@
 | 
			
		|||
#include "dds__init.h"
 | 
			
		||||
#include "dds__rhc.h"
 | 
			
		||||
#include "dds__domain.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds__builtin.h"
 | 
			
		||||
#include "dds__whc_builtintopic.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_iid.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -36,271 +35,58 @@
 | 
			
		|||
#define DOMAIN_ID_MIN 0
 | 
			
		||||
#define DOMAIN_ID_MAX 230
 | 
			
		||||
 | 
			
		||||
struct q_globals gv;
 | 
			
		||||
dds_globals dds_global;
 | 
			
		||||
 | 
			
		||||
dds_globals dds_global = { .m_default_domain = DDS_DOMAIN_DEFAULT };
 | 
			
		||||
static struct cfgst * dds_cfgst = NULL;
 | 
			
		||||
 | 
			
		||||
static void free_via_gc_cb (struct gcreq *gcreq)
 | 
			
		||||
dds_return_t dds_init (void)
 | 
			
		||||
{
 | 
			
		||||
  void *bs = gcreq->arg;
 | 
			
		||||
  gcreq_free (gcreq);
 | 
			
		||||
  ddsrt_free (bs);
 | 
			
		||||
}
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
static void free_via_gc (void *bs)
 | 
			
		||||
{
 | 
			
		||||
  struct gcreq *gcreq = gcreq_new (gv.gcreq_queue, free_via_gc_cb);
 | 
			
		||||
  gcreq->arg = bs;
 | 
			
		||||
  gcreq_enqueue (gcreq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_init(dds_domainid_t domain)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  char * uri = NULL;
 | 
			
		||||
  char progname[50] = "UNKNOWN"; /* FIXME: once retrieving process names is back in */
 | 
			
		||||
  char hostname[64];
 | 
			
		||||
  uint32_t len;
 | 
			
		||||
  ddsrt_mutex_t *init_mutex;
 | 
			
		||||
 | 
			
		||||
  /* Be sure the DDS lifecycle resources are initialized. */
 | 
			
		||||
  ddsrt_init();
 | 
			
		||||
  init_mutex = ddsrt_get_singleton_mutex();
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock(init_mutex);
 | 
			
		||||
 | 
			
		||||
  dds_global.m_init_count++;
 | 
			
		||||
  if (dds_global.m_init_count > 1)
 | 
			
		||||
  ddsrt_init ();
 | 
			
		||||
  ddsrt_mutex_t * const init_mutex = ddsrt_get_singleton_mutex ();
 | 
			
		||||
  ddsrt_mutex_lock (init_mutex);
 | 
			
		||||
  if (dds_global.m_init_count++ != 0)
 | 
			
		||||
  {
 | 
			
		||||
    goto skip;
 | 
			
		||||
    ddsrt_mutex_unlock (init_mutex);
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  gv.tstart = now ();
 | 
			
		||||
  gv.exception = false;
 | 
			
		||||
  ddsrt_mutex_init (&dds_global.m_mutex);
 | 
			
		||||
  thread_states_init_static();
 | 
			
		||||
  ddsi_iid_init ();
 | 
			
		||||
  thread_states_init_static ();
 | 
			
		||||
  thread_states_init (64);
 | 
			
		||||
  upgrade_main_thread ();
 | 
			
		||||
 | 
			
		||||
  (void)ddsrt_getenv (DDS_PROJECT_NAME_NOSPACE_CAPS"_URI", &uri);
 | 
			
		||||
  dds_cfgst = config_init (uri);
 | 
			
		||||
  if (dds_cfgst == NULL)
 | 
			
		||||
  if (dds_handle_server_init () != DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_LOG(DDS_LC_CONFIG, "Failed to parse configuration XML file %s\n", uri);
 | 
			
		||||
    ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    goto fail_config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* if a domain id was explicitly given, check & fix up the configuration */
 | 
			
		||||
  if (domain != DDS_DOMAIN_DEFAULT)
 | 
			
		||||
  {
 | 
			
		||||
    if (domain < 0 || domain > 230)
 | 
			
		||||
    {
 | 
			
		||||
      DDS_ERROR("requested domain id %"PRId32" is out of range\n", domain);
 | 
			
		||||
      ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
      goto fail_config_domainid;
 | 
			
		||||
    }
 | 
			
		||||
    else if (config.domainId.isdefault)
 | 
			
		||||
    {
 | 
			
		||||
      config.domainId.value = domain;
 | 
			
		||||
    }
 | 
			
		||||
    else if (domain != config.domainId.value)
 | 
			
		||||
    {
 | 
			
		||||
      DDS_ERROR("requested domain id %"PRId32" is inconsistent with configured value %"PRId32"\n", domain, config.domainId.value);
 | 
			
		||||
      ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
      goto fail_config_domainid;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* The config.domainId can change internally in DDSI. So, remember what the
 | 
			
		||||
   * main configured domain id is. */
 | 
			
		||||
  dds_global.m_default_domain = config.domainId.value;
 | 
			
		||||
 | 
			
		||||
  if (rtps_config_prep(dds_cfgst) != 0)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_LOG(DDS_LC_CONFIG, "Failed to configure RTPS\n");
 | 
			
		||||
    ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    goto fail_rtps_config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  upgrade_main_thread();
 | 
			
		||||
  ddsrt_avl_init(&dds_domaintree_def, &dds_global.m_domains);
 | 
			
		||||
 | 
			
		||||
  /* Start monitoring the liveliness of all threads. */
 | 
			
		||||
  if (!config.liveliness_monitoring)
 | 
			
		||||
    gv.threadmon = NULL;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    gv.threadmon = ddsi_threadmon_new ();
 | 
			
		||||
    if (gv.threadmon == NULL)
 | 
			
		||||
    {
 | 
			
		||||
      DDS_ERROR("Failed to create a thread monitor\n");
 | 
			
		||||
      ret = DDS_ERRNO(DDS_RETCODE_OUT_OF_RESOURCES);
 | 
			
		||||
      goto fail_threadmon_new;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (rtps_init () < 0)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_LOG(DDS_LC_CONFIG, "Failed to initialize RTPS\n");
 | 
			
		||||
    ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    goto fail_rtps_init;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (dds_handle_server_init (free_via_gc) != DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_ERROR("Failed to initialize internal handle server\n");
 | 
			
		||||
    ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    DDS_ERROR ("Failed to initialize internal handle server\n");
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
    goto fail_handleserver;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  dds__builtin_init ();
 | 
			
		||||
 | 
			
		||||
  if (rtps_start () < 0)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_LOG(DDS_LC_CONFIG, "Failed to start RTPS\n");
 | 
			
		||||
    ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    goto fail_rtps_start;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (gv.threadmon && ddsi_threadmon_start(gv.threadmon) < 0)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_ERROR("Failed to start the servicelease\n");
 | 
			
		||||
    ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    goto fail_threadmon_start;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Set additional default participant properties */
 | 
			
		||||
 | 
			
		||||
  gv.default_plist_pp.process_id = (unsigned)ddsrt_getpid();
 | 
			
		||||
  gv.default_plist_pp.present |= PP_PRISMTECH_PROCESS_ID;
 | 
			
		||||
  gv.default_plist_pp.exec_name = dds_string_alloc(32);
 | 
			
		||||
  (void) snprintf(gv.default_plist_pp.exec_name, 32, "%s: %u", DDS_PROJECT_NAME, gv.default_plist_pp.process_id);
 | 
			
		||||
  len = (uint32_t) (13 + strlen(gv.default_plist_pp.exec_name));
 | 
			
		||||
  gv.default_plist_pp.present |= PP_PRISMTECH_EXEC_NAME;
 | 
			
		||||
  if (ddsrt_gethostname(hostname, sizeof(hostname)) == DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    gv.default_plist_pp.node_name = dds_string_dup(hostname);
 | 
			
		||||
    gv.default_plist_pp.present |= PP_PRISMTECH_NODE_NAME;
 | 
			
		||||
  }
 | 
			
		||||
  gv.default_plist_pp.entity_name = dds_alloc(len);
 | 
			
		||||
  (void) snprintf(gv.default_plist_pp.entity_name, len, "%s<%u>", progname,
 | 
			
		||||
                  gv.default_plist_pp.process_id);
 | 
			
		||||
  gv.default_plist_pp.present |= PP_ENTITY_NAME;
 | 
			
		||||
 | 
			
		||||
skip:
 | 
			
		||||
  ddsrt_mutex_unlock(init_mutex);
 | 
			
		||||
  ddsrt_mutex_unlock (init_mutex);
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
fail_threadmon_start:
 | 
			
		||||
  if (gv.threadmon)
 | 
			
		||||
    ddsi_threadmon_stop (gv.threadmon);
 | 
			
		||||
  dds_handle_server_fini();
 | 
			
		||||
fail_handleserver:
 | 
			
		||||
  rtps_stop ();
 | 
			
		||||
fail_rtps_start:
 | 
			
		||||
  dds__builtin_fini ();
 | 
			
		||||
  rtps_fini ();
 | 
			
		||||
fail_rtps_init:
 | 
			
		||||
  if (gv.threadmon)
 | 
			
		||||
  {
 | 
			
		||||
    ddsi_threadmon_free (gv.threadmon);
 | 
			
		||||
    gv.threadmon = NULL;
 | 
			
		||||
  }
 | 
			
		||||
fail_threadmon_new:
 | 
			
		||||
  downgrade_main_thread ();
 | 
			
		||||
  thread_states_fini();
 | 
			
		||||
fail_rtps_config:
 | 
			
		||||
fail_config_domainid:
 | 
			
		||||
  dds_global.m_default_domain = DDS_DOMAIN_DEFAULT;
 | 
			
		||||
  config_fini (dds_cfgst);
 | 
			
		||||
  dds_cfgst = NULL;
 | 
			
		||||
fail_config:
 | 
			
		||||
  ddsrt_mutex_destroy (&dds_global.m_mutex);
 | 
			
		||||
  dds_global.m_init_count--;
 | 
			
		||||
  ddsrt_mutex_unlock(init_mutex);
 | 
			
		||||
  ddsrt_fini();
 | 
			
		||||
  ddsrt_mutex_unlock (init_mutex);
 | 
			
		||||
  ddsrt_fini ();
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern void dds_fini (void)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_mutex_t *init_mutex;
 | 
			
		||||
  init_mutex = ddsrt_get_singleton_mutex();
 | 
			
		||||
  ddsrt_mutex_lock(init_mutex);
 | 
			
		||||
  assert(dds_global.m_init_count > 0);
 | 
			
		||||
  dds_global.m_init_count--;
 | 
			
		||||
  if (dds_global.m_init_count == 0)
 | 
			
		||||
  ddsrt_mutex_t * const init_mutex = ddsrt_get_singleton_mutex ();
 | 
			
		||||
  ddsrt_mutex_lock (init_mutex);
 | 
			
		||||
  assert (dds_global.m_init_count > 0);
 | 
			
		||||
  if (--dds_global.m_init_count == 0)
 | 
			
		||||
  {
 | 
			
		||||
    if (gv.threadmon)
 | 
			
		||||
      ddsi_threadmon_stop (gv.threadmon);
 | 
			
		||||
    dds_handle_server_fini();
 | 
			
		||||
    rtps_stop ();
 | 
			
		||||
    dds__builtin_fini ();
 | 
			
		||||
    rtps_fini ();
 | 
			
		||||
    if (gv.threadmon)
 | 
			
		||||
      ddsi_threadmon_free (gv.threadmon);
 | 
			
		||||
    gv.threadmon = NULL;
 | 
			
		||||
    dds_handle_server_fini ();
 | 
			
		||||
    downgrade_main_thread ();
 | 
			
		||||
    thread_states_fini ();
 | 
			
		||||
 | 
			
		||||
    config_fini (dds_cfgst);
 | 
			
		||||
    dds_cfgst = NULL;
 | 
			
		||||
    ddsi_iid_fini ();
 | 
			
		||||
    ddsrt_mutex_destroy (&dds_global.m_mutex);
 | 
			
		||||
    dds_global.m_default_domain = DDS_DOMAIN_DEFAULT;
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock(init_mutex);
 | 
			
		||||
  ddsrt_fini();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int dds__init_plugin (void)
 | 
			
		||||
{
 | 
			
		||||
  if (dds_global.m_dur_init) (dds_global.m_dur_init) ();
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void dds__fini_plugin (void)
 | 
			
		||||
{
 | 
			
		||||
  if (dds_global.m_dur_fini) (dds_global.m_dur_fini) ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ddsi_plugin_init (void)
 | 
			
		||||
{
 | 
			
		||||
  ddsi_plugin.init_fn = dds__init_plugin;
 | 
			
		||||
  ddsi_plugin.fini_fn = dds__fini_plugin;
 | 
			
		||||
 | 
			
		||||
  ddsi_plugin.builtintopic_is_visible = dds__builtin_is_visible;
 | 
			
		||||
  ddsi_plugin.builtintopic_get_tkmap_entry = dds__builtin_get_tkmap_entry;
 | 
			
		||||
  ddsi_plugin.builtintopic_write = dds__builtin_write;
 | 
			
		||||
 | 
			
		||||
  ddsi_plugin.rhc_plugin.rhc_free_fn = dds_rhc_free;
 | 
			
		||||
  ddsi_plugin.rhc_plugin.rhc_store_fn = dds_rhc_store;
 | 
			
		||||
  ddsi_plugin.rhc_plugin.rhc_unregister_wr_fn = dds_rhc_unregister_wr;
 | 
			
		||||
  ddsi_plugin.rhc_plugin.rhc_relinquish_ownership_fn = dds_rhc_relinquish_ownership;
 | 
			
		||||
  ddsi_plugin.rhc_plugin.rhc_set_qos_fn = dds_rhc_set_qos;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//provides explicit default domain id.
 | 
			
		||||
dds_domainid_t dds_domain_default (void)
 | 
			
		||||
{
 | 
			
		||||
  return dds_global.m_default_domain;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds__check_domain(
 | 
			
		||||
  dds_domainid_t domain)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  /* If domain is default: use configured id. */
 | 
			
		||||
  if (domain != DDS_DOMAIN_DEFAULT)
 | 
			
		||||
  {
 | 
			
		||||
    /* Specific domain has to be the same as the configured domain. */
 | 
			
		||||
    if (domain != dds_global.m_default_domain)
 | 
			
		||||
    {
 | 
			
		||||
      DDS_ERROR("Inconsistent domain configuration detected: domain on "
 | 
			
		||||
                "configuration: %"PRId32", domain %"PRId32"\n", dds_global.m_default_domain, domain);
 | 
			
		||||
      ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return ret;
 | 
			
		||||
  ddsrt_mutex_unlock (init_mutex);
 | 
			
		||||
  ddsrt_fini ();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,421 +17,308 @@
 | 
			
		|||
#include "dds__write.h"
 | 
			
		||||
#include "dds__writer.h"
 | 
			
		||||
#include "dds__rhc.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_serdata.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_writedispose(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    const void *data)
 | 
			
		||||
dds_return_t dds_writedispose (dds_entity_t writer, const void *data)
 | 
			
		||||
{
 | 
			
		||||
    return dds_writedispose_ts(writer, data, dds_time());
 | 
			
		||||
  return dds_writedispose_ts (writer, data, dds_time ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_dispose(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    const void *data)
 | 
			
		||||
dds_return_t dds_dispose (dds_entity_t writer, const void *data)
 | 
			
		||||
{
 | 
			
		||||
    return dds_dispose_ts(writer, data, dds_time());
 | 
			
		||||
  return dds_dispose_ts (writer, data, dds_time ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_dispose_ih(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_instance_handle_t handle)
 | 
			
		||||
dds_return_t dds_dispose_ih (dds_entity_t writer, dds_instance_handle_t handle)
 | 
			
		||||
{
 | 
			
		||||
    return dds_dispose_ih_ts(writer, handle, dds_time());
 | 
			
		||||
  return dds_dispose_ih_ts (writer, handle, dds_time ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct ddsi_tkmap_instance*
 | 
			
		||||
dds_instance_find(
 | 
			
		||||
    const dds_topic *topic,
 | 
			
		||||
    const void *data,
 | 
			
		||||
    const bool create)
 | 
			
		||||
static struct ddsi_tkmap_instance *dds_instance_find (const dds_topic *topic, const void *data, const bool create)
 | 
			
		||||
{
 | 
			
		||||
    struct ddsi_serdata *sd = ddsi_serdata_from_sample (topic->m_stopic, SDK_KEY, data);
 | 
			
		||||
    struct ddsi_tkmap_instance * inst = ddsi_tkmap_find (sd, false, create);
 | 
			
		||||
    ddsi_serdata_unref (sd);
 | 
			
		||||
    return inst;
 | 
			
		||||
  struct ddsi_serdata *sd = ddsi_serdata_from_sample (topic->m_stopic, SDK_KEY, data);
 | 
			
		||||
  struct ddsi_tkmap_instance *inst = ddsi_tkmap_find (topic->m_entity.m_domain->gv.m_tkmap, sd, create);
 | 
			
		||||
  ddsi_serdata_unref (sd);
 | 
			
		||||
  return inst;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
dds_instance_remove(
 | 
			
		||||
    const dds_topic *topic,
 | 
			
		||||
    const void *data,
 | 
			
		||||
    dds_instance_handle_t handle)
 | 
			
		||||
static void dds_instance_remove (struct dds_domain *dom, const dds_topic *topic, const void *data, dds_instance_handle_t handle)
 | 
			
		||||
{
 | 
			
		||||
    struct ddsi_tkmap_instance * inst;
 | 
			
		||||
 | 
			
		||||
    if (handle != DDS_HANDLE_NIL)
 | 
			
		||||
    {
 | 
			
		||||
        inst = ddsi_tkmap_find_by_id (gv.m_tkmap, handle);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
       assert (data);
 | 
			
		||||
       inst = dds_instance_find (topic, data, false);
 | 
			
		||||
    }
 | 
			
		||||
    if (inst)
 | 
			
		||||
    {
 | 
			
		||||
        ddsi_tkmap_instance_unref (inst);
 | 
			
		||||
    }
 | 
			
		||||
  struct ddsi_tkmap_instance *inst;
 | 
			
		||||
  if (handle != DDS_HANDLE_NIL)
 | 
			
		||||
    inst = ddsi_tkmap_find_by_id (dom->gv.m_tkmap, handle);
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    assert (data);
 | 
			
		||||
    inst = dds_instance_find (topic, data, false);
 | 
			
		||||
  }
 | 
			
		||||
  if (inst)
 | 
			
		||||
  {
 | 
			
		||||
    ddsi_tkmap_instance_unref (dom->gv.m_tkmap, inst);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const dds_topic *dds_instance_info (dds_entity *e)
 | 
			
		||||
dds_return_t dds_register_instance (dds_entity_t writer, dds_instance_handle_t *handle, const void *data)
 | 
			
		||||
{
 | 
			
		||||
    const dds_topic *topic;
 | 
			
		||||
    switch (dds_entity_kind (e))
 | 
			
		||||
    {
 | 
			
		||||
        case DDS_KIND_READER:
 | 
			
		||||
            topic = ((dds_reader*) e)->m_topic;
 | 
			
		||||
            break;
 | 
			
		||||
        case DDS_KIND_WRITER:
 | 
			
		||||
            topic = ((dds_writer*) e)->m_topic;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            assert (0);
 | 
			
		||||
            topic = NULL;
 | 
			
		||||
    }
 | 
			
		||||
    return topic;
 | 
			
		||||
}
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
static const dds_topic * dds_instance_info_by_hdl (dds_entity_t e)
 | 
			
		||||
{
 | 
			
		||||
    const dds_topic * topic = NULL;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_entity *w_or_r;
 | 
			
		||||
  if (data == NULL || handle == NULL)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
    rc = dds_entity_lock(e, DDS_KIND_WRITER, &w_or_r);
 | 
			
		||||
    if (rc == DDS_RETCODE_ILLEGAL_OPERATION)
 | 
			
		||||
    {
 | 
			
		||||
        rc = dds_entity_lock(e, DDS_KIND_READER, &w_or_r);
 | 
			
		||||
    }
 | 
			
		||||
    if (rc != DDS_RETCODE_OK)
 | 
			
		||||
    {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    topic = dds_instance_info(w_or_r);
 | 
			
		||||
    dds_entity_unlock(w_or_r);
 | 
			
		||||
    return topic;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_register_instance(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_instance_handle_t *handle,
 | 
			
		||||
    const void *data)
 | 
			
		||||
{
 | 
			
		||||
    struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
    struct ddsi_tkmap_instance * inst;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
 | 
			
		||||
    if(data == NULL){
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    if(handle == NULL){
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    thread_state_awake (ts1);
 | 
			
		||||
    inst = dds_instance_find (wr->m_topic, data, true);
 | 
			
		||||
    if(inst != NULL){
 | 
			
		||||
        *handle = inst->m_iid;
 | 
			
		||||
        ret = DDS_RETCODE_OK;
 | 
			
		||||
    } else {
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    }
 | 
			
		||||
    thread_state_asleep (ts1);
 | 
			
		||||
    dds_writer_unlock(wr);
 | 
			
		||||
err:
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1, &wr->m_entity.m_domain->gv);
 | 
			
		||||
  struct ddsi_tkmap_instance * const inst = dds_instance_find (wr->m_topic, data, true);
 | 
			
		||||
  if (inst == NULL)
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    *handle = inst->m_iid;
 | 
			
		||||
    ret = DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  dds_writer_unlock (wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_unregister_instance(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    const void *data)
 | 
			
		||||
dds_return_t dds_unregister_instance (dds_entity_t writer, const void *data)
 | 
			
		||||
{
 | 
			
		||||
    return dds_unregister_instance_ts (writer, data, dds_time());
 | 
			
		||||
  return dds_unregister_instance_ts (writer, data, dds_time ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_unregister_instance_ih(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_instance_handle_t handle)
 | 
			
		||||
dds_return_t dds_unregister_instance_ih (dds_entity_t writer, dds_instance_handle_t handle)
 | 
			
		||||
{
 | 
			
		||||
    return dds_unregister_instance_ih_ts(writer, handle, dds_time());
 | 
			
		||||
  return dds_unregister_instance_ih_ts (writer, handle, dds_time ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_unregister_instance_ts(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    const void *data,
 | 
			
		||||
    dds_time_t timestamp)
 | 
			
		||||
dds_return_t dds_unregister_instance_ts (dds_entity_t writer, const void *data, dds_time_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
    struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    bool autodispose = true;
 | 
			
		||||
    dds_write_action action = DDS_WR_ACTION_UNREGISTER;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  bool autodispose = true;
 | 
			
		||||
  dds_write_action action = DDS_WR_ACTION_UNREGISTER;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
    if (data == NULL){
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    if(timestamp < 0){
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
  if (data == NULL || timestamp < 0)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
    if (wr->m_entity.m_qos) {
 | 
			
		||||
        dds_qget_writer_data_lifecycle (wr->m_entity.m_qos, &autodispose);
 | 
			
		||||
    }
 | 
			
		||||
    thread_state_awake (ts1);
 | 
			
		||||
    if (autodispose) {
 | 
			
		||||
        dds_instance_remove (wr->m_topic, data, DDS_HANDLE_NIL);
 | 
			
		||||
        action |= DDS_WR_DISPOSE_BIT;
 | 
			
		||||
    }
 | 
			
		||||
    ret = dds_write_impl (wr, data, timestamp, action);
 | 
			
		||||
    thread_state_asleep (ts1);
 | 
			
		||||
    dds_writer_unlock(wr);
 | 
			
		||||
err:
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  if (wr->m_entity.m_qos)
 | 
			
		||||
    dds_qget_writer_data_lifecycle (wr->m_entity.m_qos, &autodispose);
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1, &wr->m_entity.m_domain->gv);
 | 
			
		||||
  if (autodispose)
 | 
			
		||||
  {
 | 
			
		||||
    dds_instance_remove (wr->m_entity.m_domain, wr->m_topic, data, DDS_HANDLE_NIL);
 | 
			
		||||
    action |= DDS_WR_DISPOSE_BIT;
 | 
			
		||||
  }
 | 
			
		||||
  ret = dds_write_impl (wr, data, timestamp, action);
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  dds_writer_unlock (wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_unregister_instance_ih_ts(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_instance_handle_t handle,
 | 
			
		||||
    dds_time_t timestamp)
 | 
			
		||||
dds_return_t dds_unregister_instance_ih_ts (dds_entity_t writer, dds_instance_handle_t handle, dds_time_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
    struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    bool autodispose = true;
 | 
			
		||||
    dds_write_action action = DDS_WR_ACTION_UNREGISTER;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
    struct ddsi_tkmap_instance *tk;
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  bool autodispose = true;
 | 
			
		||||
  dds_write_action action = DDS_WR_ACTION_UNREGISTER;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
  struct ddsi_tkmap_instance *tk;
 | 
			
		||||
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (wr->m_entity.m_qos) {
 | 
			
		||||
        dds_qget_writer_data_lifecycle (wr->m_entity.m_qos, &autodispose);
 | 
			
		||||
    }
 | 
			
		||||
    if (autodispose) {
 | 
			
		||||
        dds_instance_remove (wr->m_topic, NULL, handle);
 | 
			
		||||
        action |= DDS_WR_DISPOSE_BIT;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    thread_state_awake (ts1);
 | 
			
		||||
    tk = ddsi_tkmap_find_by_id (gv.m_tkmap, handle);
 | 
			
		||||
    if (tk) {
 | 
			
		||||
        struct ddsi_sertopic *tp = wr->m_topic->m_stopic;
 | 
			
		||||
        void *sample = ddsi_sertopic_alloc_sample (tp);
 | 
			
		||||
        ddsi_serdata_topicless_to_sample (tp, tk->m_sample, sample, NULL, NULL);
 | 
			
		||||
        ddsi_tkmap_instance_unref (tk);
 | 
			
		||||
        ret = dds_write_impl (wr, sample, timestamp, action);
 | 
			
		||||
        ddsi_sertopic_free_sample (tp, sample, DDS_FREE_ALL);
 | 
			
		||||
    } else {
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    }
 | 
			
		||||
    thread_state_asleep (ts1);
 | 
			
		||||
    dds_writer_unlock(wr);
 | 
			
		||||
err:
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  if (wr->m_entity.m_qos)
 | 
			
		||||
    dds_qget_writer_data_lifecycle (wr->m_entity.m_qos, &autodispose);
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1, &wr->m_entity.m_domain->gv);
 | 
			
		||||
  if (autodispose)
 | 
			
		||||
  {
 | 
			
		||||
    dds_instance_remove (wr->m_entity.m_domain, wr->m_topic, NULL, handle);
 | 
			
		||||
    action |= DDS_WR_DISPOSE_BIT;
 | 
			
		||||
  }
 | 
			
		||||
  if ((tk = ddsi_tkmap_find_by_id (wr->m_entity.m_domain->gv.m_tkmap, handle)) == NULL)
 | 
			
		||||
    ret = DDS_RETCODE_PRECONDITION_NOT_MET;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    struct ddsi_sertopic *tp = wr->m_topic->m_stopic;
 | 
			
		||||
    void *sample = ddsi_sertopic_alloc_sample (tp);
 | 
			
		||||
    ddsi_serdata_topicless_to_sample (tp, tk->m_sample, sample, NULL, NULL);
 | 
			
		||||
    ddsi_tkmap_instance_unref (wr->m_entity.m_domain->gv.m_tkmap, tk);
 | 
			
		||||
    ret = dds_write_impl (wr, sample, timestamp, action);
 | 
			
		||||
    ddsi_sertopic_free_sample (tp, sample, DDS_FREE_ALL);
 | 
			
		||||
  }
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  dds_writer_unlock (wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_writedispose_ts(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    const void *data,
 | 
			
		||||
    dds_time_t timestamp)
 | 
			
		||||
dds_return_t dds_writedispose_ts (dds_entity_t writer, const void *data, dds_time_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
    struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        thread_state_awake (ts1);
 | 
			
		||||
        ret = dds_write_impl (wr, data, timestamp, DDS_WR_ACTION_WRITE_DISPOSE);
 | 
			
		||||
        if (ret == DDS_RETCODE_OK) {
 | 
			
		||||
            dds_instance_remove (wr->m_topic, data, DDS_HANDLE_NIL);
 | 
			
		||||
        }
 | 
			
		||||
        thread_state_asleep (ts1);
 | 
			
		||||
        dds_writer_unlock(wr);
 | 
			
		||||
    } else {
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1, &wr->m_entity.m_domain->gv);
 | 
			
		||||
  if ((ret = dds_write_impl (wr, data, timestamp, DDS_WR_ACTION_WRITE_DISPOSE)) == DDS_RETCODE_OK)
 | 
			
		||||
    dds_instance_remove (wr->m_entity.m_domain, wr->m_topic, data, DDS_HANDLE_NIL);
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  dds_writer_unlock (wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_dispose_impl(
 | 
			
		||||
    dds_writer *wr,
 | 
			
		||||
    const void *data,
 | 
			
		||||
    dds_instance_handle_t handle,
 | 
			
		||||
    dds_time_t timestamp)
 | 
			
		||||
static dds_return_t dds_dispose_impl (dds_writer *wr, const void *data, dds_instance_handle_t handle, dds_time_t timestamp) ddsrt_nonnull_all;
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_dispose_impl (dds_writer *wr, const void *data, dds_instance_handle_t handle, dds_time_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    assert(thread_is_awake ());
 | 
			
		||||
    assert(wr);
 | 
			
		||||
    ret = dds_write_impl(wr, data, timestamp, DDS_WR_ACTION_DISPOSE);
 | 
			
		||||
    if (ret == DDS_RETCODE_OK) {
 | 
			
		||||
        dds_instance_remove (wr->m_topic, data, handle);
 | 
			
		||||
    }
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  assert (thread_is_awake ());
 | 
			
		||||
  if ((ret = dds_write_impl (wr, data, timestamp, DDS_WR_ACTION_DISPOSE)) == DDS_RETCODE_OK)
 | 
			
		||||
    dds_instance_remove (wr->m_entity.m_domain, wr->m_topic, data, handle);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_dispose_ts (dds_entity_t writer, const void *data, dds_time_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1, &wr->m_entity.m_domain->gv);
 | 
			
		||||
  ret = dds_dispose_impl (wr, data, DDS_HANDLE_NIL, timestamp);
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  dds_writer_unlock(wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_dispose_ts(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    const void *data,
 | 
			
		||||
    dds_time_t timestamp)
 | 
			
		||||
dds_return_t dds_dispose_ih_ts (dds_entity_t writer, dds_instance_handle_t handle, dds_time_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
    struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        thread_state_awake (ts1);
 | 
			
		||||
        ret = dds_dispose_impl(wr, data, DDS_HANDLE_NIL, timestamp);
 | 
			
		||||
        thread_state_asleep (ts1);
 | 
			
		||||
        dds_writer_unlock(wr);
 | 
			
		||||
    } else {
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  struct ddsi_tkmap_instance *tk;
 | 
			
		||||
  thread_state_awake (ts1, &wr->m_entity.m_domain->gv);
 | 
			
		||||
  if ((tk = ddsi_tkmap_find_by_id (wr->m_entity.m_domain->gv.m_tkmap, handle)) == NULL)
 | 
			
		||||
    ret = DDS_RETCODE_PRECONDITION_NOT_MET;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    struct ddsi_sertopic *tp = wr->m_topic->m_stopic;
 | 
			
		||||
    void *sample = ddsi_sertopic_alloc_sample (tp);
 | 
			
		||||
    ddsi_serdata_topicless_to_sample (tp, tk->m_sample, sample, NULL, NULL);
 | 
			
		||||
    ddsi_tkmap_instance_unref (wr->m_entity.m_domain->gv.m_tkmap, tk);
 | 
			
		||||
    ret = dds_dispose_impl (wr, sample, handle, timestamp);
 | 
			
		||||
    ddsi_sertopic_free_sample (tp, sample, DDS_FREE_ALL);
 | 
			
		||||
  }
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  dds_writer_unlock (wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_dispose_ih_ts(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_instance_handle_t handle,
 | 
			
		||||
    dds_time_t timestamp)
 | 
			
		||||
dds_instance_handle_t dds_lookup_instance (dds_entity_t entity, const void *data)
 | 
			
		||||
{
 | 
			
		||||
    struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_instance_handle_t ih = DDS_HANDLE_NIL;
 | 
			
		||||
  const dds_topic *topic;
 | 
			
		||||
  struct ddsi_serdata *sd;
 | 
			
		||||
  dds_entity *w_or_r;
 | 
			
		||||
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        struct ddsi_tkmap_instance *tk;
 | 
			
		||||
        thread_state_awake (ts1);
 | 
			
		||||
        if ((tk = ddsi_tkmap_find_by_id (gv.m_tkmap, handle)) != NULL) {
 | 
			
		||||
            struct ddsi_sertopic *tp = wr->m_topic->m_stopic;
 | 
			
		||||
            void *sample = ddsi_sertopic_alloc_sample (tp);
 | 
			
		||||
            ddsi_serdata_topicless_to_sample (tp, tk->m_sample, sample, NULL, NULL);
 | 
			
		||||
            ddsi_tkmap_instance_unref (tk);
 | 
			
		||||
            ret = dds_dispose_impl (wr, sample, handle, timestamp);
 | 
			
		||||
            ddsi_sertopic_free_sample (tp, sample, DDS_FREE_ALL);
 | 
			
		||||
        } else {
 | 
			
		||||
            ret = DDS_ERRNO(DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
        }
 | 
			
		||||
        thread_state_asleep (ts1);
 | 
			
		||||
        dds_writer_unlock(wr);
 | 
			
		||||
    } else {
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
    return DDS_HANDLE_NIL;
 | 
			
		||||
 | 
			
		||||
  if (dds_entity_lock (entity, DDS_KIND_DONTCARE, &w_or_r) < 0)
 | 
			
		||||
    return DDS_HANDLE_NIL;
 | 
			
		||||
  switch (dds_entity_kind (w_or_r))
 | 
			
		||||
  {
 | 
			
		||||
    case DDS_KIND_WRITER:
 | 
			
		||||
      topic = ((dds_writer *) w_or_r)->m_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    case DDS_KIND_READER:
 | 
			
		||||
      topic = ((dds_reader *) w_or_r)->m_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      dds_entity_unlock (w_or_r);
 | 
			
		||||
      return DDS_HANDLE_NIL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1, &w_or_r->m_domain->gv);
 | 
			
		||||
  sd = ddsi_serdata_from_sample (topic->m_stopic, SDK_KEY, data);
 | 
			
		||||
  ih = ddsi_tkmap_lookup (w_or_r->m_domain->gv.m_tkmap, sd);
 | 
			
		||||
  ddsi_serdata_unref (sd);
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  dds_entity_unlock (w_or_r);
 | 
			
		||||
  return ih;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_instance_handle_t dds_instance_lookup (dds_entity_t entity, const void *data)
 | 
			
		||||
{
 | 
			
		||||
  return dds_lookup_instance (entity, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_instance_get_key (dds_entity_t entity, dds_instance_handle_t ih, void *data)
 | 
			
		||||
{
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  const dds_topic *topic;
 | 
			
		||||
  struct ddsi_tkmap_instance *tk;
 | 
			
		||||
  dds_entity *e;
 | 
			
		||||
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_entity_lock (entity, DDS_KIND_DONTCARE, &e)) < 0)
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_instance_handle_t
 | 
			
		||||
dds_lookup_instance(
 | 
			
		||||
    dds_entity_t entity,
 | 
			
		||||
    const void *data)
 | 
			
		||||
{
 | 
			
		||||
    struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
    dds_instance_handle_t ih = DDS_HANDLE_NIL;
 | 
			
		||||
    const dds_topic * topic;
 | 
			
		||||
    struct ddsi_tkmap * map = gv.m_tkmap;
 | 
			
		||||
    struct ddsi_serdata *sd;
 | 
			
		||||
 | 
			
		||||
    if(data == NULL){
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    topic = dds_instance_info_by_hdl (entity);
 | 
			
		||||
    if (topic) {
 | 
			
		||||
        thread_state_awake (ts1);
 | 
			
		||||
        sd = ddsi_serdata_from_sample (topic->m_stopic, SDK_KEY, data);
 | 
			
		||||
        ih = ddsi_tkmap_lookup (map, sd);
 | 
			
		||||
        ddsi_serdata_unref (sd);
 | 
			
		||||
        thread_state_asleep (ts1);
 | 
			
		||||
    }
 | 
			
		||||
err:
 | 
			
		||||
    return ih;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_instance_handle_t
 | 
			
		||||
dds_instance_lookup (
 | 
			
		||||
    dds_entity_t entity,
 | 
			
		||||
    const void *data)
 | 
			
		||||
{
 | 
			
		||||
    return dds_lookup_instance(entity, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_instance_get_key(
 | 
			
		||||
    dds_entity_t entity,
 | 
			
		||||
    dds_instance_handle_t ih,
 | 
			
		||||
    void *data)
 | 
			
		||||
{
 | 
			
		||||
    struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    const dds_topic * topic;
 | 
			
		||||
    struct ddsi_tkmap_instance * tk;
 | 
			
		||||
 | 
			
		||||
    if(data == NULL){
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    topic = dds_instance_info_by_hdl (entity);
 | 
			
		||||
    if(topic == NULL){
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    thread_state_awake (ts1);
 | 
			
		||||
    if ((tk = ddsi_tkmap_find_by_id(gv.m_tkmap, ih)) != NULL) {
 | 
			
		||||
        ddsi_sertopic_zero_sample (topic->m_stopic, data);
 | 
			
		||||
        ddsi_serdata_topicless_to_sample (topic->m_stopic, tk->m_sample, data, NULL, NULL);
 | 
			
		||||
        ddsi_tkmap_instance_unref (tk);
 | 
			
		||||
        ret = DDS_RETCODE_OK;
 | 
			
		||||
    } else {
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    }
 | 
			
		||||
    thread_state_asleep (ts1);
 | 
			
		||||
err:
 | 
			
		||||
    return ret;
 | 
			
		||||
  switch (dds_entity_kind (e))
 | 
			
		||||
  {
 | 
			
		||||
    case DDS_KIND_WRITER:
 | 
			
		||||
      topic = ((dds_writer *) e)->m_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    case DDS_KIND_READER:
 | 
			
		||||
      topic = ((dds_reader *) e)->m_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    case DDS_KIND_COND_READ:
 | 
			
		||||
    case DDS_KIND_COND_QUERY:
 | 
			
		||||
      topic = ((dds_reader *) e->m_parent)->m_topic;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      dds_entity_unlock (e);
 | 
			
		||||
      return DDS_RETCODE_ILLEGAL_OPERATION;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1, &e->m_domain->gv);
 | 
			
		||||
  if ((tk = ddsi_tkmap_find_by_id (e->m_domain->gv.m_tkmap, ih)) == NULL)
 | 
			
		||||
    ret = DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    ddsi_sertopic_zero_sample (topic->m_stopic, data);
 | 
			
		||||
    ddsi_serdata_topicless_to_sample (topic->m_stopic, tk->m_sample, data, NULL, NULL);
 | 
			
		||||
    ddsi_tkmap_instance_unref (e->m_domain->gv.m_tkmap, tk);
 | 
			
		||||
    ret = DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  dds_entity_unlock (e);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,126 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 */
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/md5.h"
 | 
			
		||||
#include "dds__key.h"
 | 
			
		||||
#include "dds__stream.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_serdata.h"
 | 
			
		||||
#include "dds/ddsi/q_bswap.h"
 | 
			
		||||
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
static bool keyhash_is_reset(const dds_key_hash_t *kh)
 | 
			
		||||
{
 | 
			
		||||
  return !kh->m_set;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  dds_key_gen: Generates key and keyhash for a sample.
 | 
			
		||||
  See section 9.6.3.3 of DDSI spec.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
static void dds_key_gen_stream (const dds_topic_descriptor_t * const desc, dds_stream_t *os, const char *sample)
 | 
			
		||||
{
 | 
			
		||||
  const char * src;
 | 
			
		||||
  const uint32_t * op;
 | 
			
		||||
  uint32_t i;
 | 
			
		||||
  uint32_t len = 0;
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < desc->m_nkeys; i++)
 | 
			
		||||
  {
 | 
			
		||||
    op = desc->m_ops + desc->m_keys[i].m_index;
 | 
			
		||||
    src = sample + op[1];
 | 
			
		||||
    assert ((*op & DDS_OP_FLAG_KEY) && ((DDS_OP_MASK & *op) == DDS_OP_ADR));
 | 
			
		||||
 | 
			
		||||
    switch (DDS_OP_TYPE (*op))
 | 
			
		||||
    {
 | 
			
		||||
      case DDS_OP_VAL_1BY:
 | 
			
		||||
      {
 | 
			
		||||
        dds_stream_write_uint8 (os, *((const uint8_t *) src));
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      case DDS_OP_VAL_2BY:
 | 
			
		||||
      {
 | 
			
		||||
        dds_stream_write_uint16 (os, *((const uint16_t *) src));
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      case DDS_OP_VAL_4BY:
 | 
			
		||||
      {
 | 
			
		||||
        dds_stream_write_uint32 (os, *((const uint32_t *) src));
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      case DDS_OP_VAL_8BY:
 | 
			
		||||
      {
 | 
			
		||||
        dds_stream_write_uint64 (os, *((const uint64_t *) src));
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      case DDS_OP_VAL_STR:
 | 
			
		||||
      {
 | 
			
		||||
        src = *((char**) src);
 | 
			
		||||
      }
 | 
			
		||||
        /* FALLS THROUGH */
 | 
			
		||||
      case DDS_OP_VAL_BST:
 | 
			
		||||
      {
 | 
			
		||||
        len = (uint32_t) (strlen (src) + 1);
 | 
			
		||||
        dds_stream_write_uint32 (os, len);
 | 
			
		||||
        dds_stream_write_buffer (os, len, (const uint8_t *) src);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      case DDS_OP_VAL_ARR:
 | 
			
		||||
      {
 | 
			
		||||
        uint32_t size = dds_op_size[DDS_OP_SUBTYPE (*op)];
 | 
			
		||||
        char *dst;
 | 
			
		||||
        len = size * op[2];
 | 
			
		||||
        dst = dds_stream_alignto (os, op[2]);
 | 
			
		||||
        dds_stream_write_buffer (os, len, (const uint8_t *) src);
 | 
			
		||||
        if (dds_stream_endian () && (size != 1u))
 | 
			
		||||
          dds_stream_swap (dst, size, op[2]);
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      default: assert (0);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_key_gen (const dds_topic_descriptor_t * const desc, dds_key_hash_t * kh, const char * sample)
 | 
			
		||||
{
 | 
			
		||||
  assert(keyhash_is_reset(kh));
 | 
			
		||||
 | 
			
		||||
  kh->m_set = 1;
 | 
			
		||||
  if (desc->m_nkeys == 0)
 | 
			
		||||
    kh->m_iskey = 1;
 | 
			
		||||
  else if (desc->m_flagset & DDS_TOPIC_FIXED_KEY)
 | 
			
		||||
  {
 | 
			
		||||
    dds_stream_t os;
 | 
			
		||||
    kh->m_iskey = 1;
 | 
			
		||||
    dds_stream_init(&os, 0);
 | 
			
		||||
    os.m_endian = 0;
 | 
			
		||||
    os.m_buffer.pv = kh->m_hash;
 | 
			
		||||
    os.m_size = 16;
 | 
			
		||||
    dds_key_gen_stream (desc, &os, sample);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_stream_t os;
 | 
			
		||||
    ddsrt_md5_state_t md5st;
 | 
			
		||||
    kh->m_iskey = 0;
 | 
			
		||||
    dds_stream_init(&os, 64);
 | 
			
		||||
    os.m_endian = 0;
 | 
			
		||||
    dds_key_gen_stream (desc, &os, sample);
 | 
			
		||||
    ddsrt_md5_init (&md5st);
 | 
			
		||||
    ddsrt_md5_append (&md5st, os.m_buffer.p8, os.m_index);
 | 
			
		||||
    ddsrt_md5_finish (&md5st, (unsigned char *) kh->m_hash);
 | 
			
		||||
    dds_stream_fini (&os);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -207,324 +207,169 @@ void dds_merge_listener (dds_listener_t * __restrict dst, const dds_listener_t *
 | 
			
		|||
 | 
			
		||||
void dds_listener_merge (dds_listener_t * __restrict dst, const dds_listener_t * __restrict src)
 | 
			
		||||
{
 | 
			
		||||
  dds_merge_listener(dst, src);
 | 
			
		||||
  dds_merge_listener (dst, src);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/************************************************************************************************
 | 
			
		||||
 *  Setters
 | 
			
		||||
 ************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_data_available (dds_listener_t * __restrict listener, dds_on_data_available_fn callback)
 | 
			
		||||
void dds_lset_data_available (dds_listener_t * __restrict listener, dds_on_data_available_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_data_available = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_data_available = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_data_on_readers (dds_listener_t * __restrict listener, dds_on_data_on_readers_fn callback)
 | 
			
		||||
void dds_lset_data_on_readers (dds_listener_t * __restrict listener, dds_on_data_on_readers_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_data_on_readers = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_data_on_readers = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_inconsistent_topic (dds_listener_t * __restrict listener, dds_on_inconsistent_topic_fn callback)
 | 
			
		||||
void dds_lset_inconsistent_topic (dds_listener_t * __restrict listener, dds_on_inconsistent_topic_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_inconsistent_topic = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_inconsistent_topic = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_liveliness_changed (dds_listener_t * __restrict listener, dds_on_liveliness_changed_fn callback)
 | 
			
		||||
void dds_lset_liveliness_changed (dds_listener_t * __restrict listener, dds_on_liveliness_changed_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_liveliness_changed = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_liveliness_changed = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_liveliness_lost (dds_listener_t * __restrict listener, dds_on_liveliness_lost_fn callback)
 | 
			
		||||
void dds_lset_liveliness_lost (dds_listener_t * __restrict listener, dds_on_liveliness_lost_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_liveliness_lost = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_liveliness_lost = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_offered_deadline_missed (dds_listener_t * __restrict listener, dds_on_offered_deadline_missed_fn callback)
 | 
			
		||||
void dds_lset_offered_deadline_missed (dds_listener_t * __restrict listener, dds_on_offered_deadline_missed_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_offered_deadline_missed = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_offered_deadline_missed = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_offered_incompatible_qos (dds_listener_t * __restrict listener, dds_on_offered_incompatible_qos_fn callback)
 | 
			
		||||
void dds_lset_offered_incompatible_qos (dds_listener_t * __restrict listener, dds_on_offered_incompatible_qos_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_offered_incompatible_qos = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_offered_incompatible_qos = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_publication_matched (dds_listener_t * __restrict listener, dds_on_publication_matched_fn callback)
 | 
			
		||||
void dds_lset_publication_matched (dds_listener_t * __restrict listener, dds_on_publication_matched_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_publication_matched = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_publication_matched = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_requested_deadline_missed (dds_listener_t * __restrict listener, dds_on_requested_deadline_missed_fn callback)
 | 
			
		||||
void dds_lset_requested_deadline_missed (dds_listener_t * __restrict listener, dds_on_requested_deadline_missed_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_requested_deadline_missed = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_requested_deadline_missed = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_requested_incompatible_qos (dds_listener_t * __restrict listener, dds_on_requested_incompatible_qos_fn callback)
 | 
			
		||||
void dds_lset_requested_incompatible_qos (dds_listener_t * __restrict listener, dds_on_requested_incompatible_qos_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_requested_incompatible_qos = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_requested_incompatible_qos = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_sample_lost (dds_listener_t * __restrict listener, dds_on_sample_lost_fn callback)
 | 
			
		||||
void dds_lset_sample_lost (dds_listener_t * __restrict listener, dds_on_sample_lost_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_sample_lost = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_sample_lost = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_sample_rejected (dds_listener_t * __restrict listener, dds_on_sample_rejected_fn callback)
 | 
			
		||||
void dds_lset_sample_rejected (dds_listener_t * __restrict listener, dds_on_sample_rejected_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_sample_rejected = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_sample_rejected = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lset_subscription_matched (dds_listener_t * __restrict listener, dds_on_subscription_matched_fn callback)
 | 
			
		||||
void dds_lset_subscription_matched (dds_listener_t * __restrict listener, dds_on_subscription_matched_fn callback)
 | 
			
		||||
{
 | 
			
		||||
    if (listener) {
 | 
			
		||||
        listener->on_subscription_matched = callback;
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
    }
 | 
			
		||||
  if (listener)
 | 
			
		||||
    listener->on_subscription_matched = callback;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/************************************************************************************************
 | 
			
		||||
 *  Getters
 | 
			
		||||
 ************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_data_available (const dds_listener_t * __restrict listener, dds_on_data_available_fn *callback)
 | 
			
		||||
void dds_lget_data_available (const dds_listener_t * __restrict listener, dds_on_data_available_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback){
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_data_available;
 | 
			
		||||
  if (callback != NULL)
 | 
			
		||||
    *callback = listener ? listener->on_data_available : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_data_on_readers (const dds_listener_t * __restrict listener, dds_on_data_on_readers_fn *callback)
 | 
			
		||||
void dds_lget_data_on_readers (const dds_listener_t * __restrict listener, dds_on_data_on_readers_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback){
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_data_on_readers;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_data_on_readers : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_lget_inconsistent_topic (const dds_listener_t * __restrict listener, dds_on_inconsistent_topic_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback){
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_inconsistent_topic;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_inconsistent_topic : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_liveliness_changed (const dds_listener_t * __restrict listener, dds_on_liveliness_changed_fn *callback)
 | 
			
		||||
void dds_lget_liveliness_changed (const dds_listener_t * __restrict listener, dds_on_liveliness_changed_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback){
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_liveliness_changed;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_liveliness_changed : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_liveliness_lost (const dds_listener_t * __restrict listener, dds_on_liveliness_lost_fn *callback)
 | 
			
		||||
void dds_lget_liveliness_lost (const dds_listener_t * __restrict listener, dds_on_liveliness_lost_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback){
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_liveliness_lost;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_liveliness_lost : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_offered_deadline_missed (const dds_listener_t * __restrict listener, dds_on_offered_deadline_missed_fn *callback)
 | 
			
		||||
void dds_lget_offered_deadline_missed (const dds_listener_t * __restrict listener, dds_on_offered_deadline_missed_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback){
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_offered_deadline_missed;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_offered_deadline_missed : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_offered_incompatible_qos (const dds_listener_t * __restrict listener, dds_on_offered_incompatible_qos_fn *callback)
 | 
			
		||||
void dds_lget_offered_incompatible_qos (const dds_listener_t * __restrict listener, dds_on_offered_incompatible_qos_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback){
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_offered_incompatible_qos;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_offered_incompatible_qos : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_publication_matched (const dds_listener_t * __restrict listener, dds_on_publication_matched_fn *callback)
 | 
			
		||||
void dds_lget_publication_matched (const dds_listener_t * __restrict listener, dds_on_publication_matched_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback){
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_publication_matched;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_publication_matched : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_requested_deadline_missed (const dds_listener_t * __restrict listener, dds_on_requested_deadline_missed_fn *callback)
 | 
			
		||||
void dds_lget_requested_deadline_missed (const dds_listener_t * __restrict listener, dds_on_requested_deadline_missed_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback) {
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_requested_deadline_missed;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_requested_deadline_missed : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_requested_incompatible_qos (const dds_listener_t * __restrict listener, dds_on_requested_incompatible_qos_fn *callback)
 | 
			
		||||
void dds_lget_requested_incompatible_qos (const dds_listener_t * __restrict listener, dds_on_requested_incompatible_qos_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback) {
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_requested_incompatible_qos;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_requested_incompatible_qos : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_sample_lost (const dds_listener_t *__restrict listener, dds_on_sample_lost_fn *callback)
 | 
			
		||||
void dds_lget_sample_lost (const dds_listener_t *__restrict listener, dds_on_sample_lost_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback) {
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_sample_lost;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_sample_lost : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_sample_rejected (const dds_listener_t  *__restrict listener, dds_on_sample_rejected_fn *callback)
 | 
			
		||||
void dds_lget_sample_rejected (const dds_listener_t  *__restrict listener, dds_on_sample_rejected_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback) {
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_sample_rejected;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_sample_rejected : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
dds_lget_subscription_matched (const dds_listener_t * __restrict listener, dds_on_subscription_matched_fn *callback)
 | 
			
		||||
void dds_lget_subscription_matched (const dds_listener_t * __restrict listener, dds_on_subscription_matched_fn *callback)
 | 
			
		||||
{
 | 
			
		||||
    if(!callback) {
 | 
			
		||||
        DDS_ERROR("Argument callback is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    if (!listener) {
 | 
			
		||||
        DDS_ERROR("Argument listener is NULL\n");
 | 
			
		||||
        return ;
 | 
			
		||||
    }
 | 
			
		||||
    *callback = listener->on_subscription_matched;
 | 
			
		||||
  if (callback)
 | 
			
		||||
    *callback = listener ? listener->on_subscription_matched : 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										223
									
								
								src/core/ddsc/src/dds_matched.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								src/core/ddsc/src/dds_matched.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,223 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2019 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
 | 
			
		||||
 */
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
 | 
			
		||||
#include "dds/dds.h"
 | 
			
		||||
#include "dds/version.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/q_bswap.h"
 | 
			
		||||
#include "dds__writer.h"
 | 
			
		||||
#include "dds__reader.h"
 | 
			
		||||
#include "dds__topic.h"
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_get_matched_subscriptions (dds_entity_t writer, dds_instance_handle_t *rds, size_t nrds)
 | 
			
		||||
{
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if (rds == NULL && nrds > 0)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  if ((rc = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    const struct ephash *gh = wr->m_entity.m_domain->gv.guid_hash;
 | 
			
		||||
    const int32_t nrds_max = (nrds > INT32_MAX) ? INT32_MAX : (int32_t) nrds;
 | 
			
		||||
    int32_t nrds_act = 0;
 | 
			
		||||
    ddsrt_avl_iter_t it;
 | 
			
		||||
    /* FIXME: this ought not be so tightly coupled to the lower layer */
 | 
			
		||||
    thread_state_awake (lookup_thread_state (), &wr->m_entity.m_domain->gv);
 | 
			
		||||
    ddsrt_mutex_lock (&wr->m_wr->e.lock);
 | 
			
		||||
    for (const struct wr_prd_match *m = ddsrt_avl_iter_first (&wr_readers_treedef, &wr->m_wr->readers, &it);
 | 
			
		||||
         m != NULL;
 | 
			
		||||
         m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct proxy_reader *prd;
 | 
			
		||||
      if ((prd = ephash_lookup_proxy_reader_guid (gh, &m->prd_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        if (nrds_act < nrds_max)
 | 
			
		||||
          rds[nrds_act] = prd->e.iid;
 | 
			
		||||
        nrds_act++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    for (const struct wr_rd_match *m = ddsrt_avl_iter_first (&wr_local_readers_treedef, &wr->m_wr->local_readers, &it);
 | 
			
		||||
         m != NULL;
 | 
			
		||||
         m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct reader *rd;
 | 
			
		||||
      if ((rd = ephash_lookup_reader_guid (gh, &m->rd_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        if (nrds_act < nrds_max)
 | 
			
		||||
          rds[nrds_act] = rd->e.iid;
 | 
			
		||||
        nrds_act++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->m_wr->e.lock);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    dds_writer_unlock (wr);
 | 
			
		||||
    return nrds_act;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_get_matched_publications (dds_entity_t reader, dds_instance_handle_t *wrs, size_t nwrs)
 | 
			
		||||
{
 | 
			
		||||
  dds_reader *rd;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if (wrs == NULL && nwrs > 0)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  if ((rc = dds_reader_lock (reader, &rd)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    const struct ephash *gh = rd->m_entity.m_domain->gv.guid_hash;
 | 
			
		||||
    const int32_t nwrs_max = (nwrs > INT32_MAX) ? INT32_MAX : (int32_t) nwrs;
 | 
			
		||||
    int32_t nwrs_act = 0;
 | 
			
		||||
    ddsrt_avl_iter_t it;
 | 
			
		||||
    /* FIXME: this ought not be so tightly coupled to the lower layer */
 | 
			
		||||
    thread_state_awake (lookup_thread_state (), &rd->m_entity.m_domain->gv);
 | 
			
		||||
    ddsrt_mutex_lock (&rd->m_rd->e.lock);
 | 
			
		||||
    for (const struct rd_pwr_match *m = ddsrt_avl_iter_first (&rd_writers_treedef, &rd->m_rd->writers, &it);
 | 
			
		||||
         m != NULL;
 | 
			
		||||
         m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct proxy_writer *pwr;
 | 
			
		||||
      if ((pwr = ephash_lookup_proxy_writer_guid (gh, &m->pwr_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        if (nwrs_act < nwrs_max)
 | 
			
		||||
          wrs[nwrs_act] = pwr->e.iid;
 | 
			
		||||
        nwrs_act++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    for (const struct rd_wr_match *m = ddsrt_avl_iter_first (&rd_local_writers_treedef, &rd->m_rd->local_writers, &it);
 | 
			
		||||
         m != NULL;
 | 
			
		||||
         m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct writer *wr;
 | 
			
		||||
      if ((wr = ephash_lookup_writer_guid (gh, &m->wr_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        if (nwrs_act < nwrs_max)
 | 
			
		||||
          wrs[nwrs_act] = wr->e.iid;
 | 
			
		||||
        nwrs_act++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_rd->e.lock);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    dds_reader_unlock (rd);
 | 
			
		||||
    return nwrs_act;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_builtintopic_endpoint_t *make_builtintopic_endpoint (const nn_guid_t *guid, const nn_guid_t *ppguid, dds_instance_handle_t ppiid, const dds_qos_t *qos)
 | 
			
		||||
{
 | 
			
		||||
  dds_builtintopic_endpoint_t *ep;
 | 
			
		||||
  nn_guid_t tmp;
 | 
			
		||||
  ep = dds_alloc (sizeof (*ep));
 | 
			
		||||
  tmp = nn_hton_guid (*guid);
 | 
			
		||||
  memcpy (&ep->key, &tmp, sizeof (ep->key));
 | 
			
		||||
  ep->participant_instance_handle = ppiid;
 | 
			
		||||
  tmp = nn_hton_guid (*ppguid);
 | 
			
		||||
  memcpy (&ep->participant_key, &tmp, sizeof (ep->participant_key));
 | 
			
		||||
  ep->qos = dds_create_qos ();
 | 
			
		||||
  nn_xqos_mergein_missing (ep->qos, qos, ~(QP_TOPIC_NAME | QP_TYPE_NAME));
 | 
			
		||||
  ep->topic_name = dds_string_dup (qos->topic_name);
 | 
			
		||||
  ep->type_name = dds_string_dup (qos->type_name);
 | 
			
		||||
  return ep;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_builtintopic_endpoint_t *dds_get_matched_subscription_data (dds_entity_t writer, dds_instance_handle_t ih)
 | 
			
		||||
{
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if ((rc = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return NULL;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    const struct ephash *gh = wr->m_entity.m_domain->gv.guid_hash;
 | 
			
		||||
    dds_builtintopic_endpoint_t *ret = NULL;
 | 
			
		||||
    ddsrt_avl_iter_t it;
 | 
			
		||||
    /* FIXME: this ought not be so tightly coupled to the lower layer, and not be so inefficient besides */
 | 
			
		||||
    thread_state_awake (lookup_thread_state (), &wr->m_entity.m_domain->gv);
 | 
			
		||||
    ddsrt_mutex_lock (&wr->m_wr->e.lock);
 | 
			
		||||
    for (const struct wr_prd_match *m = ddsrt_avl_iter_first (&wr_readers_treedef, &wr->m_wr->readers, &it);
 | 
			
		||||
         m != NULL && ret == NULL;
 | 
			
		||||
         m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct proxy_reader *prd;
 | 
			
		||||
      if ((prd = ephash_lookup_proxy_reader_guid (gh, &m->prd_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        if (prd->e.iid == ih)
 | 
			
		||||
          ret = make_builtintopic_endpoint (&prd->e.guid, &prd->c.proxypp->e.guid, prd->c.proxypp->e.iid, prd->c.xqos);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    for (const struct wr_rd_match *m = ddsrt_avl_iter_first (&wr_local_readers_treedef, &wr->m_wr->local_readers, &it);
 | 
			
		||||
         m != NULL && ret == NULL;
 | 
			
		||||
         m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct reader *rd;
 | 
			
		||||
      if ((rd = ephash_lookup_reader_guid (gh, &m->rd_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        if (rd->e.iid == ih)
 | 
			
		||||
          ret = make_builtintopic_endpoint (&rd->e.guid, &rd->c.pp->e.guid, rd->c.pp->e.iid, rd->xqos);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->m_wr->e.lock);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    dds_writer_unlock (wr);
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_builtintopic_endpoint_t *dds_get_matched_publication_data (dds_entity_t reader, dds_instance_handle_t ih)
 | 
			
		||||
{
 | 
			
		||||
  dds_reader *rd;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if ((rc = dds_reader_lock (reader, &rd)) != DDS_RETCODE_OK)
 | 
			
		||||
    return NULL;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    const struct ephash *gh = rd->m_entity.m_domain->gv.guid_hash;
 | 
			
		||||
    dds_builtintopic_endpoint_t *ret = NULL;
 | 
			
		||||
    ddsrt_avl_iter_t it;
 | 
			
		||||
    /* FIXME: this ought not be so tightly coupled to the lower layer, and not be so inefficient besides */
 | 
			
		||||
    thread_state_awake (lookup_thread_state (), &rd->m_entity.m_domain->gv);
 | 
			
		||||
    ddsrt_mutex_lock (&rd->m_rd->e.lock);
 | 
			
		||||
    for (const struct rd_pwr_match *m = ddsrt_avl_iter_first (&rd_writers_treedef, &rd->m_rd->writers, &it);
 | 
			
		||||
         m != NULL && ret == NULL;
 | 
			
		||||
         m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct proxy_writer *pwr;
 | 
			
		||||
      if ((pwr = ephash_lookup_proxy_writer_guid (gh, &m->pwr_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        if (pwr->e.iid == ih)
 | 
			
		||||
          ret = make_builtintopic_endpoint (&pwr->e.guid, &pwr->c.proxypp->e.guid, pwr->c.proxypp->e.iid, pwr->c.xqos);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    for (const struct rd_wr_match *m = ddsrt_avl_iter_first (&rd_local_writers_treedef, &rd->m_rd->local_writers, &it);
 | 
			
		||||
         m != NULL && ret == NULL;
 | 
			
		||||
         m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct writer *wr;
 | 
			
		||||
      if ((wr = ephash_lookup_writer_guid (gh, &m->wr_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        if (wr->e.iid == ih)
 | 
			
		||||
          ret = make_builtintopic_endpoint (&wr->e.guid, &wr->c.pp->e.guid, wr->c.pp->e.iid, wr->xqos);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_rd->e.lock);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    dds_reader_unlock (rd);
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -15,267 +15,165 @@
 | 
			
		|||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_plist.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds__init.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds__domain.h"
 | 
			
		||||
#include "dds__participant.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds__builtin.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK(extern inline, dds_participant)
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK (extern inline, dds_participant)
 | 
			
		||||
 | 
			
		||||
#define DDS_PARTICIPANT_STATUS_MASK    0u
 | 
			
		||||
#define DDS_PARTICIPANT_STATUS_MASK    (0u)
 | 
			
		||||
 | 
			
		||||
/* List of created participants */
 | 
			
		||||
 | 
			
		||||
static dds_entity * dds_pp_head = NULL;
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_participant_status_validate(
 | 
			
		||||
    uint32_t mask)
 | 
			
		||||
static dds_return_t dds_participant_status_validate (uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    if (mask & ~(DDS_PARTICIPANT_STATUS_MASK)) {
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
  return (mask & ~DDS_PARTICIPANT_STATUS_MASK) ? DDS_RETCODE_BAD_PARAMETER : DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_participant_delete(
 | 
			
		||||
    dds_entity *e)
 | 
			
		||||
static dds_return_t dds_participant_delete (dds_entity *e) ddsrt_nonnull_all;
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_participant_delete (dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity *prev = NULL;
 | 
			
		||||
    dds_entity *iter;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  assert (dds_entity_kind (e) == DDS_KIND_PARTICIPANT);
 | 
			
		||||
 | 
			
		||||
    assert(e);
 | 
			
		||||
    assert(dds_entity_kind(e) == DDS_KIND_PARTICIPANT);
 | 
			
		||||
  thread_state_awake (lookup_thread_state (), &e->m_domain->gv);
 | 
			
		||||
  if ((ret = delete_participant (&e->m_domain->gv, &e->m_guid)) < 0)
 | 
			
		||||
    DDS_CERROR (&e->m_domain->gv.logconfig, "dds_participant_delete: internal error %"PRId32"\n", ret);
 | 
			
		||||
  ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
  ddsrt_avl_delete (&dds_entity_children_td, &e->m_domain->m_ppants, e);
 | 
			
		||||
  ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
 | 
			
		||||
    thread_state_awake (lookup_thread_state ());
 | 
			
		||||
  /* Every dds_init needs a dds_fini. */
 | 
			
		||||
  dds_domain_free (e->m_domain);
 | 
			
		||||
  dds_fini ();
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    dds_domain_free (e->m_domain);
 | 
			
		||||
static dds_return_t dds_participant_qos_set (dds_entity *e, const dds_qos_t *qos, bool enabled)
 | 
			
		||||
{
 | 
			
		||||
  /* note: e->m_qos is still the old one to allow for failure here */
 | 
			
		||||
  if (enabled)
 | 
			
		||||
  {
 | 
			
		||||
    struct participant *pp;
 | 
			
		||||
    thread_state_awake (lookup_thread_state (), &e->m_domain->gv);
 | 
			
		||||
    if ((pp = ephash_lookup_participant_guid (e->m_domain->gv.guid_hash, &e->m_guid)) != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      nn_plist_t plist;
 | 
			
		||||
      nn_plist_init_empty (&plist);
 | 
			
		||||
      plist.qos.present = plist.qos.aliased = qos->present;
 | 
			
		||||
      plist.qos = *qos;
 | 
			
		||||
      update_participant_plist (pp, &plist);
 | 
			
		||||
    }
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
  }
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct dds_entity_deriver dds_entity_deriver_participant = {
 | 
			
		||||
  .close = dds_entity_deriver_dummy_close,
 | 
			
		||||
  .delete = dds_participant_delete,
 | 
			
		||||
  .set_qos = dds_participant_qos_set,
 | 
			
		||||
  .validate_status = dds_participant_status_validate
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_participant (const dds_domainid_t domain, const dds_qos_t *qos, const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
  dds_domain *dom;
 | 
			
		||||
  dds_entity_t ret;
 | 
			
		||||
  nn_guid_t guid;
 | 
			
		||||
  dds_participant * pp;
 | 
			
		||||
  nn_plist_t plist;
 | 
			
		||||
  dds_qos_t *new_qos = NULL;
 | 
			
		||||
 | 
			
		||||
  /* Make sure DDS instance is initialized. */
 | 
			
		||||
  if ((ret = dds_init ()) < 0)
 | 
			
		||||
    goto err_dds_init;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_domain_create (&dom, domain)) < 0)
 | 
			
		||||
    goto err_domain_create;
 | 
			
		||||
 | 
			
		||||
  new_qos = dds_create_qos ();
 | 
			
		||||
  if (qos != NULL)
 | 
			
		||||
    nn_xqos_mergein_missing (new_qos, qos, DDS_PARTICIPANT_QOS_MASK);
 | 
			
		||||
  nn_xqos_mergein_missing (new_qos, &dom->gv.default_local_plist_pp.qos, ~(uint64_t)0);
 | 
			
		||||
  if ((ret = nn_xqos_valid (&dom->gv.logconfig, new_qos)) < 0)
 | 
			
		||||
    goto err_qos_validation;
 | 
			
		||||
 | 
			
		||||
  /* Translate qos */
 | 
			
		||||
  nn_plist_init_empty (&plist);
 | 
			
		||||
  dds_merge_qos (&plist.qos, new_qos);
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (lookup_thread_state (), &dom->gv);
 | 
			
		||||
  ret = new_participant (&guid, &dom->gv, 0, &plist);
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
  nn_plist_fini (&plist);
 | 
			
		||||
  if (ret < 0)
 | 
			
		||||
  {
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
    goto err_new_participant;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  pp = dds_alloc (sizeof (*pp));
 | 
			
		||||
  if ((ret = dds_entity_init (&pp->m_entity, NULL, DDS_KIND_PARTICIPANT, new_qos, listener, DDS_PARTICIPANT_STATUS_MASK)) < 0)
 | 
			
		||||
    goto err_entity_init;
 | 
			
		||||
 | 
			
		||||
  pp->m_entity.m_guid = guid;
 | 
			
		||||
  pp->m_entity.m_iid = get_entity_instance_id (&dom->gv, &guid);
 | 
			
		||||
  pp->m_entity.m_domain = dom;
 | 
			
		||||
  pp->m_builtin_subscriber = 0;
 | 
			
		||||
 | 
			
		||||
  /* Add participant to extent */
 | 
			
		||||
  ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
  ddsrt_avl_insert (&dds_entity_children_td, &dom->m_ppants, &pp->m_entity);
 | 
			
		||||
  ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
  return ret;
 | 
			
		||||
 | 
			
		||||
err_entity_init:
 | 
			
		||||
  dds_free (pp);
 | 
			
		||||
err_new_participant:
 | 
			
		||||
err_qos_validation:
 | 
			
		||||
  dds_delete_qos (new_qos);
 | 
			
		||||
  dds_domain_free (dom);
 | 
			
		||||
err_domain_create:
 | 
			
		||||
  dds_fini ();
 | 
			
		||||
err_dds_init:
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_lookup_participant (dds_domainid_t domain_id, dds_entity_t *participants, size_t size)
 | 
			
		||||
{
 | 
			
		||||
  if ((participants != NULL && (size <= 0 || size >= INT32_MAX)) || (participants == NULL && size != 0))
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  ddsrt_init ();
 | 
			
		||||
  ddsrt_mutex_t * const init_mutex = ddsrt_get_singleton_mutex ();
 | 
			
		||||
 | 
			
		||||
  if (participants)
 | 
			
		||||
    participants[0] = 0;
 | 
			
		||||
 | 
			
		||||
  dds_return_t ret = 0;
 | 
			
		||||
  ddsrt_mutex_lock (init_mutex);
 | 
			
		||||
  if (dds_global.m_init_count > 0)
 | 
			
		||||
  {
 | 
			
		||||
    struct dds_domain *dom;
 | 
			
		||||
    ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
    iter = dds_pp_head;
 | 
			
		||||
    while (iter) {
 | 
			
		||||
        if (iter == e) {
 | 
			
		||||
            if (prev) {
 | 
			
		||||
                prev->m_next = iter->m_next;
 | 
			
		||||
            } else {
 | 
			
		||||
                  dds_pp_head = iter->m_next;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        prev = iter;
 | 
			
		||||
        iter = iter->m_next;
 | 
			
		||||
    if ((dom = dds_domain_find_locked (domain_id)) != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      ddsrt_avl_iter_t it;
 | 
			
		||||
      for (dds_entity *e = ddsrt_avl_iter_first (&dds_entity_children_td, &dom->m_ppants, &it); e != NULL; e = ddsrt_avl_iter_next (&it))
 | 
			
		||||
      {
 | 
			
		||||
        if ((size_t) ret < size)
 | 
			
		||||
          participants[ret] = e->m_hdllink.hdl;
 | 
			
		||||
        ret++;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
 | 
			
		||||
    assert (iter);
 | 
			
		||||
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
 | 
			
		||||
    /* Every dds_init needs a dds_fini. */
 | 
			
		||||
    dds_fini();
 | 
			
		||||
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_participant_instance_hdl(
 | 
			
		||||
    dds_entity *e,
 | 
			
		||||
    dds_instance_handle_t *i)
 | 
			
		||||
{
 | 
			
		||||
    assert(e);
 | 
			
		||||
    assert(i);
 | 
			
		||||
    *i = (dds_instance_handle_t)participant_instance_id(&e->m_guid);
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_participant_qos_validate(
 | 
			
		||||
    const dds_qos_t *qos,
 | 
			
		||||
    bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
    assert(qos);
 | 
			
		||||
    (void)enabled;
 | 
			
		||||
 | 
			
		||||
    /* Check consistency. */
 | 
			
		||||
    if ((qos->present & QP_USER_DATA) && !validate_octetseq(&qos->user_data)) {
 | 
			
		||||
        DDS_ERROR("User data QoS policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if ((qos->present & QP_PRISMTECH_ENTITY_FACTORY) && !validate_entityfactory_qospolicy(&qos->entity_factory)) {
 | 
			
		||||
        DDS_ERROR("Prismtech entity factory QoS policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_participant_qos_set(
 | 
			
		||||
    dds_entity *e,
 | 
			
		||||
    const dds_qos_t *qos,
 | 
			
		||||
    bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = dds_participant_qos_validate(qos, enabled);
 | 
			
		||||
    (void)e;
 | 
			
		||||
    if (ret == DDS_RETCODE_OK) {
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            /* TODO: CHAM-95: DDSI does not support changing QoS policies. */
 | 
			
		||||
            DDS_ERROR("Changing the participant QoS is not supported\n");
 | 
			
		||||
            ret = DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds_create_participant(
 | 
			
		||||
    const dds_domainid_t domain,
 | 
			
		||||
    const dds_qos_t *qos,
 | 
			
		||||
    const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
    int q_rc;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_entity_t e;
 | 
			
		||||
    nn_guid_t guid;
 | 
			
		||||
    dds_participant * pp;
 | 
			
		||||
    nn_plist_t plist;
 | 
			
		||||
    dds_qos_t * new_qos = NULL;
 | 
			
		||||
 | 
			
		||||
    /* Make sure DDS instance is initialized. */
 | 
			
		||||
    ret = dds_init(domain);
 | 
			
		||||
    if (ret != DDS_RETCODE_OK) {
 | 
			
		||||
        e = (dds_entity_t)ret;
 | 
			
		||||
        goto fail_dds_init;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Check domain id */
 | 
			
		||||
    ret = dds__check_domain (domain);
 | 
			
		||||
    if (ret != DDS_RETCODE_OK) {
 | 
			
		||||
        e = (dds_entity_t)ret;
 | 
			
		||||
        goto fail_domain_check;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Validate qos */
 | 
			
		||||
    if (qos) {
 | 
			
		||||
        ret = dds_participant_qos_validate (qos, false);
 | 
			
		||||
        if (ret != DDS_RETCODE_OK) {
 | 
			
		||||
            e = (dds_entity_t)ret;
 | 
			
		||||
            goto fail_qos_validation;
 | 
			
		||||
        }
 | 
			
		||||
        new_qos = dds_create_qos ();
 | 
			
		||||
        /* Only returns failure when one of the qos args is NULL, which
 | 
			
		||||
         * is not the case here. */
 | 
			
		||||
        (void)dds_copy_qos(new_qos, qos);
 | 
			
		||||
    } else {
 | 
			
		||||
        /* Use default qos. */
 | 
			
		||||
        new_qos = dds_create_qos ();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Translate qos */
 | 
			
		||||
    nn_plist_init_empty(&plist);
 | 
			
		||||
    dds_merge_qos (&plist.qos, new_qos);
 | 
			
		||||
 | 
			
		||||
    thread_state_awake (lookup_thread_state ());
 | 
			
		||||
    q_rc = new_participant (&guid, 0, &plist);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    nn_plist_fini (&plist);
 | 
			
		||||
    if (q_rc != 0) {
 | 
			
		||||
        DDS_ERROR("Internal error");
 | 
			
		||||
        e = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
        goto fail_new_participant;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pp = dds_alloc (sizeof (*pp));
 | 
			
		||||
    e = dds_entity_init (&pp->m_entity, NULL, DDS_KIND_PARTICIPANT, new_qos, listener, DDS_PARTICIPANT_STATUS_MASK);
 | 
			
		||||
    if (e < 0) {
 | 
			
		||||
        goto fail_entity_init;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pp->m_entity.m_guid = guid;
 | 
			
		||||
    pp->m_entity.m_domain = dds_domain_create (dds_domain_default());
 | 
			
		||||
    pp->m_entity.m_domainid = dds_domain_default();
 | 
			
		||||
    pp->m_entity.m_deriver.delete = dds_participant_delete;
 | 
			
		||||
    pp->m_entity.m_deriver.set_qos = dds_participant_qos_set;
 | 
			
		||||
    pp->m_entity.m_deriver.get_instance_hdl = dds_participant_instance_hdl;
 | 
			
		||||
    pp->m_entity.m_deriver.validate_status = dds_participant_status_validate;
 | 
			
		||||
    pp->m_builtin_subscriber = 0;
 | 
			
		||||
 | 
			
		||||
    /* Add participant to extent */
 | 
			
		||||
    ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
    pp->m_entity.m_next = dds_pp_head;
 | 
			
		||||
    dds_pp_head = &pp->m_entity;
 | 
			
		||||
    ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
 | 
			
		||||
    return e;
 | 
			
		||||
 | 
			
		||||
fail_entity_init:
 | 
			
		||||
    dds_free(pp);
 | 
			
		||||
fail_new_participant:
 | 
			
		||||
    dds_delete_qos(new_qos);
 | 
			
		||||
fail_qos_validation:
 | 
			
		||||
fail_domain_check:
 | 
			
		||||
    dds_fini();
 | 
			
		||||
fail_dds_init:
 | 
			
		||||
    return e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds_lookup_participant(
 | 
			
		||||
    dds_domainid_t domain_id,
 | 
			
		||||
    dds_entity_t *participants,
 | 
			
		||||
    size_t size)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = 0;
 | 
			
		||||
    ddsrt_mutex_t *init_mutex;
 | 
			
		||||
 | 
			
		||||
    /* Be sure the DDS lifecycle resources are initialized. */
 | 
			
		||||
    ddsrt_init();
 | 
			
		||||
    init_mutex = ddsrt_get_singleton_mutex();
 | 
			
		||||
 | 
			
		||||
    if ((participants != NULL) && ((size <= 0) || (size >= INT32_MAX))) {
 | 
			
		||||
        DDS_ERROR("Array is given, but with invalid size\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
    if ((participants == NULL) && (size != 0)) {
 | 
			
		||||
        DDS_ERROR("Size is given, but no array\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        goto err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(participants){
 | 
			
		||||
        participants[0] = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ddsrt_mutex_lock (init_mutex);
 | 
			
		||||
 | 
			
		||||
    /* Check if dds is intialized. */
 | 
			
		||||
    if (dds_global.m_init_count > 0) {
 | 
			
		||||
        dds_entity* iter;
 | 
			
		||||
        ddsrt_mutex_lock (&dds_global.m_mutex);
 | 
			
		||||
        iter = dds_pp_head;
 | 
			
		||||
        while (iter) {
 | 
			
		||||
            if (iter->m_domainid == domain_id) {
 | 
			
		||||
                if ((size_t)ret < size) {
 | 
			
		||||
                    participants[ret] = iter->m_hdllink.hdl;
 | 
			
		||||
                }
 | 
			
		||||
                ret++;
 | 
			
		||||
            }
 | 
			
		||||
            iter = iter->m_next;
 | 
			
		||||
        }
 | 
			
		||||
        ddsrt_mutex_unlock (&dds_global.m_mutex);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ddsrt_mutex_unlock (init_mutex);
 | 
			
		||||
 | 
			
		||||
err:
 | 
			
		||||
    ddsrt_fini();
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (init_mutex);
 | 
			
		||||
  ddsrt_fini ();
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,179 +13,90 @@
 | 
			
		|||
#include <string.h>
 | 
			
		||||
#include "dds/ddsrt/misc.h"
 | 
			
		||||
#include "dds__listener.h"
 | 
			
		||||
#include "dds__participant.h"
 | 
			
		||||
#include "dds__publisher.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_iid.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds/version.h"
 | 
			
		||||
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK(extern inline, dds_publisher)
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK (extern inline, dds_publisher)
 | 
			
		||||
 | 
			
		||||
#define DDS_PUBLISHER_STATUS_MASK   0u
 | 
			
		||||
#define DDS_PUBLISHER_STATUS_MASK   (0u)
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_publisher_instance_hdl(
 | 
			
		||||
    dds_entity *e,
 | 
			
		||||
    dds_instance_handle_t *i)
 | 
			
		||||
static dds_return_t dds_publisher_qos_set (dds_entity *e, const dds_qos_t *qos, bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    (void)e;
 | 
			
		||||
    (void)i;
 | 
			
		||||
    /* TODO: Get/generate proper handle. */
 | 
			
		||||
    DDS_ERROR("Getting publisher instance handle is not supported\n");
 | 
			
		||||
    return DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_publisher_qos_validate(
 | 
			
		||||
    const dds_qos_t *qos,
 | 
			
		||||
    bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
    assert(qos);
 | 
			
		||||
 | 
			
		||||
    /* Check consistency. */
 | 
			
		||||
    if((qos->present & QP_GROUP_DATA) && !validate_octetseq(&qos->group_data)){
 | 
			
		||||
        DDS_ERROR("Group data policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_PRESENTATION) && (validate_presentation_qospolicy(&qos->presentation) != 0)){
 | 
			
		||||
        DDS_ERROR("Presentation policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_PARTITION) && !validate_stringseq(&qos->partition)){
 | 
			
		||||
        DDS_ERROR("Partition policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_PRISMTECH_ENTITY_FACTORY) && !validate_entityfactory_qospolicy(&qos->entity_factory)){
 | 
			
		||||
        DDS_ERROR("Prismtech entity factory policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if(ret == DDS_RETCODE_OK && enabled && (qos->present & QP_PRESENTATION)){
 | 
			
		||||
        /* TODO: Improve/check immutable check. */
 | 
			
		||||
        DDS_ERROR("Presentation policy is immutable\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_IMMUTABLE_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_publisher_qos_set(
 | 
			
		||||
    dds_entity *e,
 | 
			
		||||
    const dds_qos_t *qos,
 | 
			
		||||
    bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = dds_publisher_qos_validate(qos, enabled);
 | 
			
		||||
    (void)e;
 | 
			
		||||
    if (ret == DDS_RETCODE_OK) {
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            /* TODO: CHAM-95: DDSI does not support changing QoS policies. */
 | 
			
		||||
            DDS_ERROR(DDS_PROJECT_NAME" does not support changing QoS policies yet\n");
 | 
			
		||||
            ret = DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
  /* note: e->m_qos is still the old one to allow for failure here */
 | 
			
		||||
  (void) e; (void) qos; (void) enabled;
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_publisher_status_validate (uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  return (mask & ~DDS_PUBLISHER_STATUS_MASK) ? DDS_RETCODE_BAD_PARAMETER : DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    if (mask & ~(DDS_PUBLISHER_STATUS_MASK)) {
 | 
			
		||||
        DDS_ERROR("Invalid status mask\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    }
 | 
			
		||||
const struct dds_entity_deriver dds_entity_deriver_publisher = {
 | 
			
		||||
  .close = dds_entity_deriver_dummy_close,
 | 
			
		||||
  .delete = dds_entity_deriver_dummy_delete,
 | 
			
		||||
  .set_qos = dds_publisher_qos_set,
 | 
			
		||||
  .validate_status = dds_publisher_status_validate
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_publisher (dds_entity_t participant, const dds_qos_t *qos, const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
  dds_participant *par;
 | 
			
		||||
  dds_publisher *pub;
 | 
			
		||||
  dds_entity_t hdl;
 | 
			
		||||
  dds_qos_t *new_qos;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_participant_lock (participant, &par)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  new_qos = dds_create_qos ();
 | 
			
		||||
  if (qos)
 | 
			
		||||
    nn_xqos_mergein_missing (new_qos, qos, DDS_PUBLISHER_QOS_MASK);
 | 
			
		||||
  nn_xqos_mergein_missing (new_qos, &par->m_entity.m_domain->gv.default_xqos_pub, ~(uint64_t)0);
 | 
			
		||||
  if ((ret = nn_xqos_valid (&par->m_entity.m_domain->gv.logconfig, new_qos)) != DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    dds_participant_unlock (par);
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  pub = dds_alloc (sizeof (*pub));
 | 
			
		||||
  hdl = dds_entity_init (&pub->m_entity, &par->m_entity, DDS_KIND_PUBLISHER, new_qos, listener, DDS_PUBLISHER_STATUS_MASK);
 | 
			
		||||
  pub->m_entity.m_iid = ddsi_iid_gen ();
 | 
			
		||||
  dds_entity_register_child (&par->m_entity, &pub->m_entity);
 | 
			
		||||
  dds_participant_unlock (par);
 | 
			
		||||
  return hdl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds_create_publisher(
 | 
			
		||||
    dds_entity_t participant,
 | 
			
		||||
    const dds_qos_t *qos,
 | 
			
		||||
    const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity * par;
 | 
			
		||||
    dds_publisher * pub;
 | 
			
		||||
    dds_entity_t hdl;
 | 
			
		||||
    dds_qos_t * new_qos = NULL;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
 | 
			
		||||
    rc = dds_entity_lock(participant, DDS_KIND_PARTICIPANT, &par);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking participant\n");
 | 
			
		||||
        hdl = DDS_ERRNO(rc);
 | 
			
		||||
        goto lock_err;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Validate qos */
 | 
			
		||||
    if (qos) {
 | 
			
		||||
        ret = dds_publisher_qos_validate(qos, false);
 | 
			
		||||
        if (ret != DDS_RETCODE_OK) {
 | 
			
		||||
            hdl = ret;
 | 
			
		||||
            goto qos_err;
 | 
			
		||||
        }
 | 
			
		||||
        new_qos = dds_create_qos ();
 | 
			
		||||
        /* Only returns failure when one of the qos args is NULL, which
 | 
			
		||||
         * is not the case here. */
 | 
			
		||||
        (void)dds_copy_qos(new_qos, qos);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Create publisher */
 | 
			
		||||
    pub = dds_alloc (sizeof (*pub));
 | 
			
		||||
    hdl = dds_entity_init (&pub->m_entity, par, DDS_KIND_PUBLISHER, new_qos, listener, DDS_PUBLISHER_STATUS_MASK);
 | 
			
		||||
    pub->m_entity.m_deriver.set_qos = dds_publisher_qos_set;
 | 
			
		||||
    pub->m_entity.m_deriver.get_instance_hdl = dds_publisher_instance_hdl;
 | 
			
		||||
    pub->m_entity.m_deriver.validate_status = dds_publisher_status_validate;
 | 
			
		||||
 | 
			
		||||
qos_err:
 | 
			
		||||
    dds_entity_unlock(par);
 | 
			
		||||
lock_err:
 | 
			
		||||
    return hdl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_suspend(
 | 
			
		||||
    dds_entity_t publisher)
 | 
			
		||||
dds_return_t dds_suspend (dds_entity_t publisher)
 | 
			
		||||
{
 | 
			
		||||
  return dds_generic_unimplemented_operation (publisher, DDS_KIND_PUBLISHER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_resume(
 | 
			
		||||
    dds_entity_t publisher)
 | 
			
		||||
dds_return_t dds_resume (dds_entity_t publisher)
 | 
			
		||||
{
 | 
			
		||||
  return dds_generic_unimplemented_operation (publisher, DDS_KIND_PUBLISHER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_wait_for_acks(
 | 
			
		||||
    dds_entity_t publisher_or_writer,
 | 
			
		||||
    dds_duration_t timeout)
 | 
			
		||||
dds_return_t dds_wait_for_acks (dds_entity_t publisher_or_writer, dds_duration_t timeout)
 | 
			
		||||
{
 | 
			
		||||
  if (timeout < 0)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  static const dds_entity_kind_t kinds[] = { DDS_KIND_WRITER, DDS_KIND_PUBLISHER };
 | 
			
		||||
  return dds_generic_unimplemented_operation_manykinds (publisher_or_writer, sizeof (kinds) / sizeof (kinds[0]), kinds);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_publisher_begin_coherent(
 | 
			
		||||
    dds_entity_t e)
 | 
			
		||||
dds_return_t dds_publisher_begin_coherent (dds_entity_t publisher)
 | 
			
		||||
{
 | 
			
		||||
    /* TODO: CHAM-124 Currently unsupported. */
 | 
			
		||||
    (void)e;
 | 
			
		||||
    DDS_ERROR("Using coherency to get a coherent data set is not being supported yet\n");
 | 
			
		||||
    return DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  return dds_generic_unimplemented_operation (publisher, DDS_KIND_PUBLISHER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_publisher_end_coherent(
 | 
			
		||||
    dds_entity_t e)
 | 
			
		||||
dds_return_t dds_publisher_end_coherent (dds_entity_t publisher)
 | 
			
		||||
{
 | 
			
		||||
    /* TODO: CHAM-124 Currently unsupported. */
 | 
			
		||||
    (void)e;
 | 
			
		||||
    DDS_ERROR("Using coherency to get a coherent data set is not being supported yet\n");
 | 
			
		||||
    return DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  return dds_generic_unimplemented_operation (publisher, DDS_KIND_PUBLISHER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -18,36 +18,23 @@
 | 
			
		|||
#include "dds__topic.h"
 | 
			
		||||
#include "dds__querycond.h"
 | 
			
		||||
#include "dds__readcond.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_serdata.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_sertopic.h"
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_entity_t
 | 
			
		||||
dds_create_querycondition(
 | 
			
		||||
    dds_entity_t reader,
 | 
			
		||||
    uint32_t mask,
 | 
			
		||||
    dds_querycondition_filter_fn filter)
 | 
			
		||||
dds_entity_t dds_create_querycondition (dds_entity_t reader, uint32_t mask, dds_querycondition_filter_fn filter)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  dds_reader *r;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_reader_lock (reader, &r)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_t hdl;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_reader *r;
 | 
			
		||||
 | 
			
		||||
    rc = dds_reader_lock(reader, &r);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        dds_readcond *cond = dds_create_readcond(r, DDS_KIND_COND_QUERY, mask, filter);
 | 
			
		||||
        assert(cond);
 | 
			
		||||
        const bool success = (cond->m_entity.m_deriver.delete != 0);
 | 
			
		||||
        dds_reader_unlock(r);
 | 
			
		||||
        if (success) {
 | 
			
		||||
            hdl = cond->m_entity.m_hdllink.hdl;
 | 
			
		||||
        } else {
 | 
			
		||||
            dds_delete (cond->m_entity.m_hdllink.hdl);
 | 
			
		||||
            hdl = DDS_ERRNO(DDS_RETCODE_OUT_OF_RESOURCES);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking reader\n");
 | 
			
		||||
        hdl = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dds_readcond *cond = dds_create_readcond (r, DDS_KIND_COND_QUERY, mask, filter);
 | 
			
		||||
    assert (cond);
 | 
			
		||||
    dds_reader_unlock (r);
 | 
			
		||||
    hdl = cond->m_entity.m_hdllink.hdl;
 | 
			
		||||
    return hdl;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -14,78 +14,75 @@
 | 
			
		|||
#include "dds__readcond.h"
 | 
			
		||||
#include "dds__rhc.h"
 | 
			
		||||
#include "dds__entity.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_iid.h"
 | 
			
		||||
#include "dds/ddsi/q_ephash.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_readcond_delete(
 | 
			
		||||
    dds_entity *e)
 | 
			
		||||
static dds_return_t dds_readcond_delete (dds_entity *e) ddsrt_nonnull_all;
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_readcond_delete (dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
    dds_rhc_remove_readcondition((dds_readcond*)e);
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
  dds_rhc_remove_readcondition ((dds_readcond *) e);
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_readcond*
 | 
			
		||||
dds_create_readcond(
 | 
			
		||||
    dds_reader *rd,
 | 
			
		||||
    dds_entity_kind_t kind,
 | 
			
		||||
    uint32_t mask,
 | 
			
		||||
    dds_querycondition_filter_fn filter)
 | 
			
		||||
const struct dds_entity_deriver dds_entity_deriver_readcondition = {
 | 
			
		||||
  .close = dds_entity_deriver_dummy_close,
 | 
			
		||||
  .delete = dds_readcond_delete,
 | 
			
		||||
  .set_qos = dds_entity_deriver_dummy_set_qos,
 | 
			
		||||
  .validate_status = dds_entity_deriver_dummy_validate_status
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
dds_readcond *dds_create_readcond (dds_reader *rd, dds_entity_kind_t kind, uint32_t mask, dds_querycondition_filter_fn filter)
 | 
			
		||||
{
 | 
			
		||||
    dds_readcond * cond = dds_alloc(sizeof(*cond));
 | 
			
		||||
    assert((kind == DDS_KIND_COND_READ && filter == 0) || (kind == DDS_KIND_COND_QUERY && filter != 0));
 | 
			
		||||
    (void) dds_entity_init(&cond->m_entity, (dds_entity*)rd, kind, NULL, NULL, 0);
 | 
			
		||||
    cond->m_entity.m_deriver.delete = dds_readcond_delete;
 | 
			
		||||
    cond->m_rhc = rd->m_rd->rhc;
 | 
			
		||||
    cond->m_sample_states = mask & DDS_ANY_SAMPLE_STATE;
 | 
			
		||||
    cond->m_view_states = mask & DDS_ANY_VIEW_STATE;
 | 
			
		||||
    cond->m_instance_states = mask & DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    cond->m_rd_guid = rd->m_entity.m_guid;
 | 
			
		||||
    if (kind == DDS_KIND_COND_QUERY) {
 | 
			
		||||
        cond->m_query.m_filter = filter;
 | 
			
		||||
        cond->m_query.m_qcmask = 0;
 | 
			
		||||
    }
 | 
			
		||||
    if (!dds_rhc_add_readcondition (cond)) {
 | 
			
		||||
        /* FIXME: current entity management code can't deal with an error late in the creation of the
 | 
			
		||||
           entity because it doesn't allow deleting it again ... instead use a hack to signal a problem
 | 
			
		||||
           to the caller and let that one handle it. */
 | 
			
		||||
        cond->m_entity.m_deriver.delete = 0;
 | 
			
		||||
    }
 | 
			
		||||
    return cond;
 | 
			
		||||
  dds_readcond *cond = dds_alloc (sizeof (*cond));
 | 
			
		||||
  assert ((kind == DDS_KIND_COND_READ && filter == 0) || (kind == DDS_KIND_COND_QUERY && filter != 0));
 | 
			
		||||
  (void) dds_entity_init (&cond->m_entity, &rd->m_entity, kind, NULL, NULL, 0);
 | 
			
		||||
  cond->m_entity.m_iid = ddsi_iid_gen ();
 | 
			
		||||
  dds_entity_register_child (&rd->m_entity, &cond->m_entity);
 | 
			
		||||
  cond->m_rhc = rd->m_rhc;
 | 
			
		||||
  cond->m_sample_states = mask & DDS_ANY_SAMPLE_STATE;
 | 
			
		||||
  cond->m_view_states = mask & DDS_ANY_VIEW_STATE;
 | 
			
		||||
  cond->m_instance_states = mask & DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
  cond->m_rd_guid = rd->m_entity.m_guid;
 | 
			
		||||
  if (kind == DDS_KIND_COND_QUERY)
 | 
			
		||||
  {
 | 
			
		||||
    cond->m_query.m_filter = filter;
 | 
			
		||||
    cond->m_query.m_qcmask = 0;
 | 
			
		||||
  }
 | 
			
		||||
  if (!dds_rhc_add_readcondition (cond))
 | 
			
		||||
  {
 | 
			
		||||
    /* FIXME: current entity management code can't deal with an error late in the creation of the
 | 
			
		||||
       entity because it doesn't allow deleting it again ... */
 | 
			
		||||
    abort();
 | 
			
		||||
  }
 | 
			
		||||
  return cond;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds_create_readcondition(
 | 
			
		||||
    dds_entity_t reader,
 | 
			
		||||
    uint32_t mask)
 | 
			
		||||
dds_entity_t dds_create_readcondition (dds_entity_t reader, uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
  dds_reader *rd;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if ((rc = dds_reader_lock (reader, &rd)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_t hdl;
 | 
			
		||||
    dds_reader * rd;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
 | 
			
		||||
    rc = dds_reader_lock(reader, &rd);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        dds_readcond *cond = dds_create_readcond(rd, DDS_KIND_COND_READ, mask, 0);
 | 
			
		||||
        assert(cond);
 | 
			
		||||
        assert(cond->m_entity.m_deriver.delete);
 | 
			
		||||
        hdl = cond->m_entity.m_hdllink.hdl;
 | 
			
		||||
        dds_reader_unlock(rd);
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking reader\n");
 | 
			
		||||
        hdl = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    dds_readcond *cond = dds_create_readcond(rd, DDS_KIND_COND_READ, mask, 0);
 | 
			
		||||
    assert (cond);
 | 
			
		||||
    hdl = cond->m_entity.m_hdllink.hdl;
 | 
			
		||||
    dds_reader_unlock (rd);
 | 
			
		||||
    return hdl;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_get_datareader (dds_entity_t condition)
 | 
			
		||||
{
 | 
			
		||||
  struct dds_entity *e;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  if ((rc = dds_entity_claim (condition, &e)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (rc);
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if ((rc = dds_entity_pin (condition, &e)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_t rdh;
 | 
			
		||||
| 
						 | 
				
			
			@ -97,10 +94,10 @@ dds_entity_t dds_get_datareader (dds_entity_t condition)
 | 
			
		|||
        rdh = e->m_parent->m_hdllink.hdl;
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        rdh = DDS_ERRNO (DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
        rdh = DDS_RETCODE_ILLEGAL_OPERATION;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    dds_entity_release (e);
 | 
			
		||||
    dds_entity_unpin (e);
 | 
			
		||||
    return rdh;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -108,17 +105,17 @@ dds_entity_t dds_get_datareader (dds_entity_t condition)
 | 
			
		|||
dds_return_t dds_get_mask (dds_entity_t condition, uint32_t *mask)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity *entity;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
 | 
			
		||||
  if (mask == NULL)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_entity_lock (condition, DDS_KIND_DONTCARE, &entity)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (rc);
 | 
			
		||||
    return rc;
 | 
			
		||||
  else if (dds_entity_kind (entity) != DDS_KIND_COND_READ && dds_entity_kind (entity) != DDS_KIND_COND_QUERY)
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_unlock (entity);
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    return DDS_RETCODE_ILLEGAL_OPERATION;
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,145 +13,80 @@
 | 
			
		|||
#include <string.h>
 | 
			
		||||
#include "dds/dds.h"
 | 
			
		||||
#include "dds/version.h"
 | 
			
		||||
#include "dds/ddsrt/static_assert.h"
 | 
			
		||||
#include "dds__subscriber.h"
 | 
			
		||||
#include "dds__reader.h"
 | 
			
		||||
#include "dds__listener.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds__init.h"
 | 
			
		||||
#include "dds__rhc.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds__rhc_default.h"
 | 
			
		||||
#include "dds__topic.h"
 | 
			
		||||
#include "dds__get_status.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds__builtin.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_sertopic.h"
 | 
			
		||||
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK(extern inline, dds_reader)
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK (extern inline, dds_reader)
 | 
			
		||||
 | 
			
		||||
#define DDS_READER_STATUS_MASK                                   \
 | 
			
		||||
                        DDS_SAMPLE_REJECTED_STATUS              |\
 | 
			
		||||
                        DDS_LIVELINESS_CHANGED_STATUS           |\
 | 
			
		||||
                        DDS_REQUESTED_DEADLINE_MISSED_STATUS    |\
 | 
			
		||||
                        DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS   |\
 | 
			
		||||
                        DDS_DATA_AVAILABLE_STATUS               |\
 | 
			
		||||
                        DDS_SAMPLE_LOST_STATUS                  |\
 | 
			
		||||
                        DDS_SUBSCRIPTION_MATCHED_STATUS
 | 
			
		||||
                        (DDS_SAMPLE_REJECTED_STATUS              |\
 | 
			
		||||
                         DDS_LIVELINESS_CHANGED_STATUS           |\
 | 
			
		||||
                         DDS_REQUESTED_DEADLINE_MISSED_STATUS    |\
 | 
			
		||||
                         DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS   |\
 | 
			
		||||
                         DDS_DATA_AVAILABLE_STATUS               |\
 | 
			
		||||
                         DDS_SAMPLE_LOST_STATUS                  |\
 | 
			
		||||
                         DDS_SUBSCRIPTION_MATCHED_STATUS)
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_reader_instance_hdl(
 | 
			
		||||
        dds_entity *e,
 | 
			
		||||
        dds_instance_handle_t *i)
 | 
			
		||||
static dds_return_t dds_reader_close (dds_entity *e) ddsrt_nonnull_all;
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_reader_close (dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
    assert(e);
 | 
			
		||||
    assert(i);
 | 
			
		||||
    *i = (dds_instance_handle_t)reader_instance_id(&e->m_guid);
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
  dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  thread_state_awake (lookup_thread_state (), &e->m_domain->gv);
 | 
			
		||||
  if (delete_reader (&e->m_domain->gv, &e->m_guid) != 0)
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_reader_close(
 | 
			
		||||
        dds_entity *e)
 | 
			
		||||
static dds_return_t dds_reader_delete (dds_entity *e) ddsrt_nonnull_all;
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_reader_delete (dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  dds_reader * const rd = (dds_reader *) e;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  if ((ret = dds_delete (rd->m_topic->m_entity.m_hdllink.hdl)) == DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    /* Delete an implicitly created parent; for normal ones, this is expected
 | 
			
		||||
       to fail with BAD_PARAMETER - FIXME: there must be a cleaner way */
 | 
			
		||||
    ret = dds_delete_impl (e->m_parent->m_hdllink.hdl, true);
 | 
			
		||||
    if (ret == DDS_RETCODE_BAD_PARAMETER)
 | 
			
		||||
      ret = DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
  dds_free (rd->m_loan);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    assert(e);
 | 
			
		||||
 | 
			
		||||
    thread_state_awake (lookup_thread_state ());
 | 
			
		||||
    if (delete_reader(&e->m_guid) != 0) {
 | 
			
		||||
        DDS_ERROR("Internal error");
 | 
			
		||||
        rc = DDS_RETCODE_ERROR;
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
static dds_return_t dds_reader_qos_set (dds_entity *e, const dds_qos_t *qos, bool enabled)
 | 
			
		||||
{
 | 
			
		||||
  /* note: e->m_qos is still the old one to allow for failure here */
 | 
			
		||||
  if (enabled)
 | 
			
		||||
  {
 | 
			
		||||
    struct reader *rd;
 | 
			
		||||
    thread_state_awake (lookup_thread_state (), &e->m_domain->gv);
 | 
			
		||||
    if ((rd = ephash_lookup_reader_guid (e->m_domain->gv.guid_hash, &e->m_guid)) != NULL)
 | 
			
		||||
      update_reader_qos (rd, qos);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_reader_delete(
 | 
			
		||||
        dds_entity *e)
 | 
			
		||||
static dds_return_t dds_reader_status_validate (uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    dds_reader *rd = (dds_reader*)e;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    assert(e);
 | 
			
		||||
    ret = dds_delete(rd->m_topic->m_entity.m_hdllink.hdl);
 | 
			
		||||
    if(ret == DDS_RETCODE_OK){
 | 
			
		||||
        ret = dds_delete_impl(e->m_parent->m_hdllink.hdl, true);
 | 
			
		||||
        if(dds_err_nr(ret) == DDS_RETCODE_BAD_PARAMETER){
 | 
			
		||||
            ret = DDS_RETCODE_OK;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    dds_free(rd->m_loan);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_reader_qos_validate(
 | 
			
		||||
        const dds_qos_t *qos,
 | 
			
		||||
        bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    assert(qos);
 | 
			
		||||
 | 
			
		||||
    /* Check consistency. */
 | 
			
		||||
    if(!dds_qos_validate_common(qos)) {
 | 
			
		||||
        DDS_ERROR("Argument Qos is not valid\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_USER_DATA) && !(validate_octetseq (&qos->user_data))) {
 | 
			
		||||
        DDS_ERROR("User data policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_PRISMTECH_READER_DATA_LIFECYCLE) && (validate_reader_data_lifecycle (&qos->reader_data_lifecycle) != 0)) {
 | 
			
		||||
        DDS_ERROR("Prismtech reader data lifecycle policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_TIME_BASED_FILTER) && (validate_duration (&qos->time_based_filter.minimum_separation) != 0)) {
 | 
			
		||||
        DDS_ERROR("Time based filter policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_HISTORY) && (qos->present & QP_RESOURCE_LIMITS) && (validate_history_and_resource_limits (&qos->history, &qos->resource_limits) != 0)) {
 | 
			
		||||
        DDS_ERROR("History and resource limits policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_TIME_BASED_FILTER) && (qos->present & QP_DEADLINE) && !(validate_deadline_and_timebased_filter (qos->deadline.deadline, qos->time_based_filter.minimum_separation))) {
 | 
			
		||||
        DDS_ERROR("Time based filter and deadline policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if(ret == DDS_RETCODE_OK && enabled) {
 | 
			
		||||
        ret = dds_qos_validate_mutable_common(qos);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_reader_qos_set(
 | 
			
		||||
        dds_entity *e,
 | 
			
		||||
        const dds_qos_t *qos,
 | 
			
		||||
        bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = dds_reader_qos_validate(qos, enabled);
 | 
			
		||||
    (void)e;
 | 
			
		||||
    if (ret == DDS_RETCODE_OK) {
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            /* TODO: CHAM-95: DDSI does not support changing QoS policies. */
 | 
			
		||||
            DDS_ERROR(DDS_PROJECT_NAME" does not support changing QoS policies\n");
 | 
			
		||||
            ret = DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_reader_status_validate(
 | 
			
		||||
        uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    return (mask & ~(DDS_READER_STATUS_MASK)) ?
 | 
			
		||||
                     DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER) :
 | 
			
		||||
                     DDS_RETCODE_OK;
 | 
			
		||||
  return (mask & ~DDS_READER_STATUS_MASK) ? DDS_RETCODE_BAD_PARAMETER : DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_reader_data_available_cb (struct dds_reader *rd)
 | 
			
		||||
| 
						 | 
				
			
			@ -162,13 +97,11 @@ void dds_reader_data_available_cb (struct dds_reader *rd)
 | 
			
		|||
     overhead really matters.  Otherwise, it is pretty much like
 | 
			
		||||
     dds_reader_status_cb. */
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
  if (!(rd->m_entity.m_status_enable & DDS_DATA_AVAILABLE_STATUS))
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
  const bool data_av_enabled = (ddsrt_atomic_ld32 (&rd->m_entity.m_status.m_status_and_mask) & (DDS_DATA_AVAILABLE_STATUS << SAM_ENABLED_SHIFT));
 | 
			
		||||
  if (!data_av_enabled)
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
  while (rd->m_entity.m_cb_count > 0)
 | 
			
		||||
    ddsrt_cond_wait (&rd->m_entity.m_observers_cond, &rd->m_entity.m_observers_lock);
 | 
			
		||||
  rd->m_entity.m_cb_count++;
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +135,6 @@ void dds_reader_data_available_cb (struct dds_reader *rd)
 | 
			
		|||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_status_set (&rd->m_entity, DDS_DATA_AVAILABLE_STATUS);
 | 
			
		||||
 | 
			
		||||
    ddsrt_mutex_lock (&sub->m_observers_lock);
 | 
			
		||||
    dds_entity_status_set (sub, DDS_DATA_ON_READERS_STATUS);
 | 
			
		||||
    ddsrt_mutex_unlock (&sub->m_observers_lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -222,7 +154,7 @@ void dds_reader_status_cb (void *ventity, const status_cb_data_t *data)
 | 
			
		|||
  {
 | 
			
		||||
    /* Release the initial claim that was done during the create. This
 | 
			
		||||
     * will indicate that further API deletion is now possible. */
 | 
			
		||||
    dds_handle_release (&entity->m_hdllink);
 | 
			
		||||
    dds_handle_unpin (&entity->m_hdllink);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -336,7 +268,7 @@ void dds_reader_status_cb (void *ventity, const status_cb_data_t *data)
 | 
			
		|||
  if (invoke)
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_unlock (&entity->m_observers_lock);
 | 
			
		||||
    dds_entity_invoke_listener(entity, status_id, vst);
 | 
			
		||||
    dds_entity_invoke_listener (entity, status_id, vst);
 | 
			
		||||
    ddsrt_mutex_lock (&entity->m_observers_lock);
 | 
			
		||||
    *reset[0] = 0;
 | 
			
		||||
    if (reset[1])
 | 
			
		||||
| 
						 | 
				
			
			@ -344,7 +276,7 @@ void dds_reader_status_cb (void *ventity, const status_cb_data_t *data)
 | 
			
		|||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_status_set (entity, 1u << status_id);
 | 
			
		||||
    dds_entity_status_set (entity, (status_mask_t) (1u << status_id));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  entity->m_cb_count--;
 | 
			
		||||
| 
						 | 
				
			
			@ -352,174 +284,155 @@ void dds_reader_status_cb (void *ventity, const status_cb_data_t *data)
 | 
			
		|||
  ddsrt_mutex_unlock (&entity->m_observers_lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds_create_reader(
 | 
			
		||||
    dds_entity_t participant_or_subscriber,
 | 
			
		||||
    dds_entity_t topic,
 | 
			
		||||
    const dds_qos_t *qos,
 | 
			
		||||
    const dds_listener_t *listener)
 | 
			
		||||
const struct dds_entity_deriver dds_entity_deriver_reader = {
 | 
			
		||||
  .close = dds_reader_close,
 | 
			
		||||
  .delete = dds_reader_delete,
 | 
			
		||||
  .set_qos = dds_reader_qos_set,
 | 
			
		||||
  .validate_status = dds_reader_status_validate
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_reader (dds_entity_t participant_or_subscriber, dds_entity_t topic, const dds_qos_t *qos, const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
    dds_qos_t * rqos;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_subscriber * sub = NULL;
 | 
			
		||||
    dds_entity_t subscriber;
 | 
			
		||||
    dds_reader * rd;
 | 
			
		||||
    struct rhc * rhc;
 | 
			
		||||
    dds_topic * tp;
 | 
			
		||||
    dds_entity_t reader;
 | 
			
		||||
    dds_entity_t t;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
    bool internal_topic;
 | 
			
		||||
  dds_qos_t *rqos;
 | 
			
		||||
  dds_subscriber *sub = NULL;
 | 
			
		||||
  dds_entity_t subscriber;
 | 
			
		||||
  dds_reader *rd;
 | 
			
		||||
  dds_topic *tp;
 | 
			
		||||
  dds_entity_t reader;
 | 
			
		||||
  dds_entity_t t;
 | 
			
		||||
  dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  bool internal_topic;
 | 
			
		||||
 | 
			
		||||
    switch (topic) {
 | 
			
		||||
        case DDS_BUILTIN_TOPIC_DCPSPARTICIPANT:
 | 
			
		||||
        case DDS_BUILTIN_TOPIC_DCPSTOPIC:
 | 
			
		||||
        case DDS_BUILTIN_TOPIC_DCPSPUBLICATION:
 | 
			
		||||
        case DDS_BUILTIN_TOPIC_DCPSSUBSCRIPTION:
 | 
			
		||||
            internal_topic = true;
 | 
			
		||||
            subscriber = dds__get_builtin_subscriber(participant_or_subscriber);
 | 
			
		||||
            t = dds__get_builtin_topic (subscriber, topic);
 | 
			
		||||
            break;
 | 
			
		||||
  switch (topic)
 | 
			
		||||
  {
 | 
			
		||||
    case DDS_BUILTIN_TOPIC_DCPSPARTICIPANT:
 | 
			
		||||
    case DDS_BUILTIN_TOPIC_DCPSTOPIC:
 | 
			
		||||
    case DDS_BUILTIN_TOPIC_DCPSPUBLICATION:
 | 
			
		||||
    case DDS_BUILTIN_TOPIC_DCPSSUBSCRIPTION:
 | 
			
		||||
      internal_topic = true;
 | 
			
		||||
      subscriber = dds__get_builtin_subscriber (participant_or_subscriber);
 | 
			
		||||
      t = dds__get_builtin_topic (subscriber, topic);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
        default: {
 | 
			
		||||
            dds_entity *p_or_s;
 | 
			
		||||
            if ((rc = dds_entity_claim (participant_or_subscriber, &p_or_s)) != DDS_RETCODE_OK) {
 | 
			
		||||
                return DDS_ERRNO (rc);
 | 
			
		||||
            }
 | 
			
		||||
            if (dds_entity_kind (p_or_s) == DDS_KIND_PARTICIPANT) {
 | 
			
		||||
                subscriber = dds_create_subscriber(participant_or_subscriber, qos, NULL);
 | 
			
		||||
            } else {
 | 
			
		||||
                subscriber = participant_or_subscriber;
 | 
			
		||||
            }
 | 
			
		||||
            dds_entity_release (p_or_s);
 | 
			
		||||
            internal_topic = false;
 | 
			
		||||
            t = topic;
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    default: {
 | 
			
		||||
      dds_entity *p_or_s;
 | 
			
		||||
      if ((ret = dds_entity_pin (participant_or_subscriber, &p_or_s)) != DDS_RETCODE_OK)
 | 
			
		||||
        return ret;
 | 
			
		||||
      if (dds_entity_kind (p_or_s) == DDS_KIND_PARTICIPANT)
 | 
			
		||||
        subscriber = dds_create_subscriber (participant_or_subscriber, qos, NULL);
 | 
			
		||||
      else
 | 
			
		||||
        subscriber = participant_or_subscriber;
 | 
			
		||||
      dds_entity_unpin (p_or_s);
 | 
			
		||||
      internal_topic = false;
 | 
			
		||||
      t = topic;
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    if ((rc = dds_subscriber_lock (subscriber, &sub)) != DDS_RETCODE_OK) {
 | 
			
		||||
        reader = DDS_ERRNO (rc);
 | 
			
		||||
        goto err_sub_lock;
 | 
			
		||||
    }
 | 
			
		||||
  if ((ret = dds_subscriber_lock (subscriber, &sub)) != DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    reader = ret;
 | 
			
		||||
    goto err_sub_lock;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    if ((subscriber != participant_or_subscriber) && !internal_topic) {
 | 
			
		||||
        /* Delete implicit subscriber if reader creation fails */
 | 
			
		||||
        sub->m_entity.m_flags |= DDS_ENTITY_IMPLICIT;
 | 
			
		||||
    }
 | 
			
		||||
  if (subscriber != participant_or_subscriber && !internal_topic)
 | 
			
		||||
  {
 | 
			
		||||
    /* Delete implicit subscriber if reader creation fails */
 | 
			
		||||
    sub->m_entity.m_flags |= DDS_ENTITY_IMPLICIT;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    rc = dds_topic_lock(t, &tp);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking topic\n");
 | 
			
		||||
        reader = DDS_ERRNO(rc);
 | 
			
		||||
        goto err_tp_lock;
 | 
			
		||||
    }
 | 
			
		||||
    assert (tp->m_stopic);
 | 
			
		||||
    assert (sub->m_entity.m_domain == tp->m_entity.m_domain);
 | 
			
		||||
  if ((ret = dds_topic_lock (t, &tp)) != DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    reader = ret;
 | 
			
		||||
    goto err_tp_lock;
 | 
			
		||||
  }
 | 
			
		||||
  assert (tp->m_stopic);
 | 
			
		||||
  /* FIXME: domain check */
 | 
			
		||||
  assert (sub->m_entity.m_domain == tp->m_entity.m_domain);
 | 
			
		||||
 | 
			
		||||
    /* Merge qos from topic and subscriber */
 | 
			
		||||
    rqos = dds_create_qos ();
 | 
			
		||||
    if (qos) {
 | 
			
		||||
        /* Only returns failure when one of the qos args is NULL, which
 | 
			
		||||
         * is not the case here. */
 | 
			
		||||
        (void)dds_copy_qos(rqos, qos);
 | 
			
		||||
    }
 | 
			
		||||
  /* Merge qos from topic and subscriber, dds_copy_qos only fails when it is passed a null
 | 
			
		||||
     argument, but that isn't the case here */
 | 
			
		||||
  rqos = dds_create_qos ();
 | 
			
		||||
  if (qos)
 | 
			
		||||
    nn_xqos_mergein_missing (rqos, qos, DDS_READER_QOS_MASK);
 | 
			
		||||
  if (sub->m_entity.m_qos)
 | 
			
		||||
    nn_xqos_mergein_missing (rqos, sub->m_entity.m_qos, ~(uint64_t)0);
 | 
			
		||||
  if (tp->m_entity.m_qos)
 | 
			
		||||
    nn_xqos_mergein_missing (rqos, tp->m_entity.m_qos, ~(uint64_t)0);
 | 
			
		||||
  nn_xqos_mergein_missing (rqos, &sub->m_entity.m_domain->gv.default_xqos_rd, ~(uint64_t)0);
 | 
			
		||||
 | 
			
		||||
    if(sub->m_entity.m_qos){
 | 
			
		||||
        dds_merge_qos (rqos, sub->m_entity.m_qos);
 | 
			
		||||
    }
 | 
			
		||||
  if ((ret = nn_xqos_valid (&sub->m_entity.m_domain->gv.logconfig, rqos)) != DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    dds_delete_qos (rqos);
 | 
			
		||||
    reader = ret;
 | 
			
		||||
    goto err_bad_qos;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    if (tp->m_entity.m_qos) {
 | 
			
		||||
        dds_merge_qos (rqos, tp->m_entity.m_qos);
 | 
			
		||||
  /* Additional checks required for built-in topics: we don't want to
 | 
			
		||||
     run into a resource limit on a built-in topic, it is a needless
 | 
			
		||||
     complication */
 | 
			
		||||
  if (internal_topic && !dds__validate_builtin_reader_qos (tp->m_entity.m_domain, topic, rqos))
 | 
			
		||||
  {
 | 
			
		||||
    dds_delete_qos (rqos);
 | 
			
		||||
    reader = DDS_RETCODE_INCONSISTENT_POLICY;
 | 
			
		||||
    goto err_bad_qos;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
        /* reset the following qos policies if set during topic qos merge as they aren't applicable for reader */
 | 
			
		||||
        rqos->present &= ~(QP_DURABILITY_SERVICE | QP_TRANSPORT_PRIORITY | QP_LIFESPAN);
 | 
			
		||||
    }
 | 
			
		||||
    nn_xqos_mergein_missing (rqos, &gv.default_xqos_rd);
 | 
			
		||||
  /* Create reader and associated read cache */
 | 
			
		||||
  rd = dds_alloc (sizeof (*rd));
 | 
			
		||||
  reader = dds_entity_init (&rd->m_entity, &sub->m_entity, DDS_KIND_READER, rqos, listener, DDS_READER_STATUS_MASK);
 | 
			
		||||
  rd->m_sample_rejected_status.last_reason = DDS_NOT_REJECTED;
 | 
			
		||||
  rd->m_topic = tp;
 | 
			
		||||
  rd->m_rhc = dds_rhc_default_new (rd, tp->m_stopic);
 | 
			
		||||
  dds_entity_add_ref_locked (&tp->m_entity);
 | 
			
		||||
 | 
			
		||||
    ret = dds_reader_qos_validate (rqos, false);
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        dds_delete_qos(rqos);
 | 
			
		||||
        reader = ret;
 | 
			
		||||
        goto err_bad_qos;
 | 
			
		||||
    }
 | 
			
		||||
  /* Extra claim of this reader to make sure that the delete waits until DDSI
 | 
			
		||||
     has deleted its reader as well. This can be known through the callback. */
 | 
			
		||||
  dds_handle_repin (&rd->m_entity.m_hdllink);
 | 
			
		||||
 | 
			
		||||
    /* Additional checks required for built-in topics */
 | 
			
		||||
    if (internal_topic && !dds__validate_builtin_reader_qos(topic, qos)) {
 | 
			
		||||
        dds_delete_qos(rqos);
 | 
			
		||||
        DDS_ERROR("Invalid QoS specified for built-in topic reader");
 | 
			
		||||
        reader = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
        goto err_bad_qos;
 | 
			
		||||
    }
 | 
			
		||||
  ddsrt_mutex_unlock (&tp->m_entity.m_mutex);
 | 
			
		||||
  ddsrt_mutex_unlock (&sub->m_entity.m_mutex);
 | 
			
		||||
 | 
			
		||||
    /* Create reader and associated read cache */
 | 
			
		||||
    rd = dds_alloc (sizeof (*rd));
 | 
			
		||||
    reader = dds_entity_init (&rd->m_entity, &sub->m_entity, DDS_KIND_READER, rqos, listener, DDS_READER_STATUS_MASK);
 | 
			
		||||
    rd->m_sample_rejected_status.last_reason = DDS_NOT_REJECTED;
 | 
			
		||||
    rd->m_topic = tp;
 | 
			
		||||
    rhc = dds_rhc_new (rd, tp->m_stopic);
 | 
			
		||||
    dds_entity_add_ref_nolock (&tp->m_entity);
 | 
			
		||||
    rd->m_entity.m_deriver.close = dds_reader_close;
 | 
			
		||||
    rd->m_entity.m_deriver.delete = dds_reader_delete;
 | 
			
		||||
    rd->m_entity.m_deriver.set_qos = dds_reader_qos_set;
 | 
			
		||||
    rd->m_entity.m_deriver.validate_status = dds_reader_status_validate;
 | 
			
		||||
    rd->m_entity.m_deriver.get_instance_hdl = dds_reader_instance_hdl;
 | 
			
		||||
  thread_state_awake (lookup_thread_state (), &sub->m_entity.m_domain->gv);
 | 
			
		||||
  ret = new_reader (&rd->m_rd, &rd->m_entity.m_domain->gv, &rd->m_entity.m_guid, NULL, &sub->m_entity.m_participant->m_guid, tp->m_stopic, rqos, &rd->m_rhc->common.rhc, dds_reader_status_cb, rd);
 | 
			
		||||
  ddsrt_mutex_lock (&sub->m_entity.m_mutex);
 | 
			
		||||
  ddsrt_mutex_lock (&tp->m_entity.m_mutex);
 | 
			
		||||
  assert (ret == DDS_RETCODE_OK); /* FIXME: can be out-of-resources at the very least */
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
  
 | 
			
		||||
  rd->m_entity.m_iid = get_entity_instance_id (&rd->m_entity.m_domain->gv, &rd->m_entity.m_guid);
 | 
			
		||||
  dds_entity_register_child (&sub->m_entity, &rd->m_entity);
 | 
			
		||||
 | 
			
		||||
    /* Extra claim of this reader to make sure that the delete waits until DDSI
 | 
			
		||||
     * has deleted its reader as well. This can be known through the callback. */
 | 
			
		||||
    dds_handle_claim_inc (&rd->m_entity.m_hdllink);
 | 
			
		||||
  dds_topic_unlock (tp);
 | 
			
		||||
  dds_subscriber_unlock (sub);
 | 
			
		||||
 | 
			
		||||
    ddsrt_mutex_unlock(&tp->m_entity.m_mutex);
 | 
			
		||||
    ddsrt_mutex_unlock(&sub->m_entity.m_mutex);
 | 
			
		||||
 | 
			
		||||
    thread_state_awake (lookup_thread_state ());
 | 
			
		||||
    ret = new_reader(&rd->m_rd, &rd->m_entity.m_guid, NULL, &sub->m_entity.m_participant->m_guid, tp->m_stopic,
 | 
			
		||||
                     rqos, rhc, dds_reader_status_cb, rd);
 | 
			
		||||
    ddsrt_mutex_lock(&sub->m_entity.m_mutex);
 | 
			
		||||
    ddsrt_mutex_lock(&tp->m_entity.m_mutex);
 | 
			
		||||
    assert (ret == DDS_RETCODE_OK);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
 | 
			
		||||
    /* For persistent data register reader with durability */
 | 
			
		||||
    if (dds_global.m_dur_reader && (rd->m_entity.m_qos->durability.kind > NN_TRANSIENT_LOCAL_DURABILITY_QOS)) {
 | 
			
		||||
        (dds_global.m_dur_reader) (rd, rhc);
 | 
			
		||||
    }
 | 
			
		||||
    dds_topic_unlock(tp);
 | 
			
		||||
    dds_subscriber_unlock(sub);
 | 
			
		||||
 | 
			
		||||
    if (internal_topic) {
 | 
			
		||||
        /* If topic is builtin, then the topic entity is local and should
 | 
			
		||||
         * be deleted because the application won't. */
 | 
			
		||||
        dds_delete(t);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return reader;
 | 
			
		||||
  if (internal_topic)
 | 
			
		||||
  {
 | 
			
		||||
    /* If topic is builtin, then the topic entity is local and should be deleted because the application won't. */
 | 
			
		||||
    dds_delete (t);
 | 
			
		||||
  }
 | 
			
		||||
  return reader;
 | 
			
		||||
 | 
			
		||||
err_bad_qos:
 | 
			
		||||
    dds_topic_unlock(tp);
 | 
			
		||||
  dds_topic_unlock (tp);
 | 
			
		||||
err_tp_lock:
 | 
			
		||||
    dds_subscriber_unlock(sub);
 | 
			
		||||
    if((sub->m_entity.m_flags & DDS_ENTITY_IMPLICIT) != 0){
 | 
			
		||||
        (void)dds_delete(subscriber);
 | 
			
		||||
    }
 | 
			
		||||
  dds_subscriber_unlock (sub);
 | 
			
		||||
  if ((sub->m_entity.m_flags & DDS_ENTITY_IMPLICIT) != 0)
 | 
			
		||||
    (void) dds_delete (subscriber);
 | 
			
		||||
err_sub_lock:
 | 
			
		||||
    if (internal_topic) {
 | 
			
		||||
        /* If topic is builtin, then the topic entity is local and should
 | 
			
		||||
         * be deleted because the application won't. */
 | 
			
		||||
        dds_delete(t);
 | 
			
		||||
    }
 | 
			
		||||
    return reader;
 | 
			
		||||
  if (internal_topic)
 | 
			
		||||
    dds_delete (t);
 | 
			
		||||
  return reader;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_reader_ddsi2direct (dds_entity_t entity, ddsi2direct_directread_cb_t cb, void *cbarg)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity *dds_entity;
 | 
			
		||||
  if (dds_entity_claim(entity, &dds_entity) != DDS_RETCODE_OK)
 | 
			
		||||
  if (dds_entity_pin (entity, &dds_entity) != DDS_RETCODE_OK)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  if (dds_entity_kind (dds_entity) != DDS_KIND_READER)
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_release (dds_entity);
 | 
			
		||||
    dds_entity_unpin (dds_entity);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -536,7 +449,7 @@ void dds_reader_ddsi2direct (dds_entity_t entity, ddsi2direct_directread_cb_t cb
 | 
			
		|||
  while ((m = ddsrt_avl_lookup_succ_eq (&rd_writers_treedef, &rd->writers, &pwrguid)) != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    /* have to be careful walking the tree -- pretty is different, but
 | 
			
		||||
     I want to check this before I write a lookup_succ function. */
 | 
			
		||||
       I want to check this before I write a lookup_succ function. */
 | 
			
		||||
    struct rd_pwr_match *m_next;
 | 
			
		||||
    nn_guid_t pwrguid_next;
 | 
			
		||||
    pwrguid = m->pwr_guid;
 | 
			
		||||
| 
						 | 
				
			
			@ -548,7 +461,7 @@ void dds_reader_ddsi2direct (dds_entity_t entity, ddsi2direct_directread_cb_t cb
 | 
			
		|||
      pwrguid_next.entityid.u = (pwrguid_next.entityid.u & ~(uint32_t)0xff) | NN_ENTITYID_KIND_WRITER_NO_KEY;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->e.lock);
 | 
			
		||||
    if ((pwr = ephash_lookup_proxy_writer_guid (&pwrguid)) != NULL)
 | 
			
		||||
    if ((pwr = ephash_lookup_proxy_writer_guid (dds_entity->m_domain->gv.guid_hash, &pwrguid)) != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      ddsrt_mutex_lock (&pwr->e.lock);
 | 
			
		||||
      pwr->ddsi2direct_cb = cb;
 | 
			
		||||
| 
						 | 
				
			
			@ -559,7 +472,7 @@ void dds_reader_ddsi2direct (dds_entity_t entity, ddsi2direct_directread_cb_t cb
 | 
			
		|||
    ddsrt_mutex_lock (&rd->e.lock);
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&rd->e.lock);
 | 
			
		||||
  dds_entity_release (dds_entity);
 | 
			
		||||
  dds_entity_unpin (dds_entity);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint32_t dds_reader_lock_samples (dds_entity_t reader)
 | 
			
		||||
| 
						 | 
				
			
			@ -568,17 +481,18 @@ uint32_t dds_reader_lock_samples (dds_entity_t reader)
 | 
			
		|||
  uint32_t n;
 | 
			
		||||
  if (dds_reader_lock (reader, &rd) != DDS_RETCODE_OK)
 | 
			
		||||
    return 0;
 | 
			
		||||
  n = dds_rhc_lock_samples (rd->m_rd->rhc);
 | 
			
		||||
  n = dds_rhc_lock_samples (rd->m_rhc);
 | 
			
		||||
  dds_reader_unlock (rd);
 | 
			
		||||
  return n;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int dds_reader_wait_for_historical_data (dds_entity_t reader, dds_duration_t max_wait)
 | 
			
		||||
dds_return_t dds_reader_wait_for_historical_data (dds_entity_t reader, dds_duration_t max_wait)
 | 
			
		||||
{
 | 
			
		||||
  dds_reader *rd;
 | 
			
		||||
  int ret;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  (void) max_wait;
 | 
			
		||||
  if ((ret = dds_reader_lock (reader, &rd)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (ret);
 | 
			
		||||
    return ret;
 | 
			
		||||
  switch (rd->m_entity.m_qos->durability.kind)
 | 
			
		||||
  {
 | 
			
		||||
    case DDS_DURABILITY_VOLATILE:
 | 
			
		||||
| 
						 | 
				
			
			@ -588,7 +502,6 @@ int dds_reader_wait_for_historical_data (dds_entity_t reader, dds_duration_t max
 | 
			
		|||
      break;
 | 
			
		||||
    case DDS_DURABILITY_TRANSIENT:
 | 
			
		||||
    case DDS_DURABILITY_PERSISTENT:
 | 
			
		||||
      ret = (dds_global.m_dur_wait) (rd, max_wait);
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  dds_reader_unlock(rd);
 | 
			
		||||
| 
						 | 
				
			
			@ -598,9 +511,9 @@ int dds_reader_wait_for_historical_data (dds_entity_t reader, dds_duration_t max
 | 
			
		|||
dds_entity_t dds_get_subscriber (dds_entity_t entity)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity *e;
 | 
			
		||||
  dds_retcode_t ret;
 | 
			
		||||
  if ((ret = dds_entity_claim (entity, &e)) != DDS_RETCODE_OK)
 | 
			
		||||
    return (dds_entity_t) DDS_ERRNO (ret);
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  if ((ret = dds_entity_pin (entity, &e)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_t subh;
 | 
			
		||||
| 
						 | 
				
			
			@ -617,189 +530,21 @@ dds_entity_t dds_get_subscriber (dds_entity_t entity)
 | 
			
		|||
        subh = e->m_parent->m_parent->m_hdllink.hdl;
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        subh = DDS_ERRNO (DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
        subh = DDS_RETCODE_ILLEGAL_OPERATION;
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    dds_entity_release (e);
 | 
			
		||||
    dds_entity_unpin (e);
 | 
			
		||||
    return subh;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_get_subscription_matched_status (
 | 
			
		||||
    dds_entity_t reader,
 | 
			
		||||
    dds_subscription_matched_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_reader *rd;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
/* Reset sets everything (type) 0, including the reason field, verify that 0 is correct */
 | 
			
		||||
DDSRT_STATIC_ASSERT ((int) DDS_NOT_REJECTED == 0);
 | 
			
		||||
 | 
			
		||||
    rc = dds_reader_lock(reader, &rd);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking reader\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
        *status = rd->m_subscription_matched_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    if (rd->m_entity.m_status_enable & DDS_SUBSCRIPTION_MATCHED_STATUS) {
 | 
			
		||||
        rd->m_subscription_matched_status.total_count_change = 0;
 | 
			
		||||
        rd->m_subscription_matched_status.current_count_change = 0;
 | 
			
		||||
        dds_entity_status_reset(&rd->m_entity, DDS_SUBSCRIPTION_MATCHED_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    dds_reader_unlock(rd);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
DDS_GET_STATUS (reader, subscription_matched,       SUBSCRIPTION_MATCHED,       total_count_change, current_count_change)
 | 
			
		||||
DDS_GET_STATUS (reader, liveliness_changed,         LIVELINESS_CHANGED,         alive_count_change, not_alive_count_change)
 | 
			
		||||
DDS_GET_STATUS (reader, sample_rejected,            SAMPLE_REJECTED,            total_count_change)
 | 
			
		||||
DDS_GET_STATUS (reader, sample_lost,                SAMPLE_LOST,                total_count_change)
 | 
			
		||||
DDS_GET_STATUS (reader, requested_deadline_missed,  REQUESTED_DEADLINE_MISSED,  total_count_change)
 | 
			
		||||
DDS_GET_STATUS (reader, requested_incompatible_qos, REQUESTED_INCOMPATIBLE_QOS, total_count_change)
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_get_liveliness_changed_status (
 | 
			
		||||
    dds_entity_t reader,
 | 
			
		||||
    dds_liveliness_changed_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_reader *rd;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_reader_lock(reader, &rd);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking reader\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
        *status = rd->m_liveliness_changed_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    if (rd->m_entity.m_status_enable & DDS_LIVELINESS_CHANGED_STATUS) {
 | 
			
		||||
        rd->m_liveliness_changed_status.alive_count_change = 0;
 | 
			
		||||
        rd->m_liveliness_changed_status.not_alive_count_change = 0;
 | 
			
		||||
        dds_entity_status_reset(&rd->m_entity, DDS_LIVELINESS_CHANGED_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    dds_reader_unlock(rd);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_get_sample_rejected_status (
 | 
			
		||||
    dds_entity_t reader,
 | 
			
		||||
    dds_sample_rejected_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_reader *rd;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_reader_lock(reader, &rd);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking reader\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
        *status = rd->m_sample_rejected_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    if (rd->m_entity.m_status_enable & DDS_SAMPLE_REJECTED_STATUS) {
 | 
			
		||||
        rd->m_sample_rejected_status.total_count_change = 0;
 | 
			
		||||
        rd->m_sample_rejected_status.last_reason = DDS_NOT_REJECTED;
 | 
			
		||||
        dds_entity_status_reset(&rd->m_entity, DDS_SAMPLE_REJECTED_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    dds_reader_unlock(rd);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_get_sample_lost_status (
 | 
			
		||||
    dds_entity_t reader,
 | 
			
		||||
    dds_sample_lost_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_reader *rd;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_reader_lock(reader, &rd);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking reader\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
        *status = rd->m_sample_lost_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    if (rd->m_entity.m_status_enable & DDS_SAMPLE_LOST_STATUS) {
 | 
			
		||||
        rd->m_sample_lost_status.total_count_change = 0;
 | 
			
		||||
        dds_entity_status_reset(&rd->m_entity, DDS_SAMPLE_LOST_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    dds_reader_unlock(rd);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_get_requested_deadline_missed_status (
 | 
			
		||||
    dds_entity_t reader,
 | 
			
		||||
    dds_requested_deadline_missed_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_reader *rd;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_reader_lock(reader, &rd);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking reader\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
        *status = rd->m_requested_deadline_missed_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    if (rd->m_entity.m_status_enable & DDS_REQUESTED_DEADLINE_MISSED_STATUS) {
 | 
			
		||||
        rd->m_requested_deadline_missed_status.total_count_change = 0;
 | 
			
		||||
        dds_entity_status_reset(&rd->m_entity, DDS_REQUESTED_DEADLINE_MISSED_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    dds_reader_unlock(rd);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_get_requested_incompatible_qos_status (
 | 
			
		||||
    dds_entity_t reader,
 | 
			
		||||
    dds_requested_incompatible_qos_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_reader *rd;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_reader_lock(reader, &rd);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking reader\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
        *status = rd->m_requested_incompatible_qos_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    if (rd->m_entity.m_status_enable & DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS) {
 | 
			
		||||
        rd->m_requested_incompatible_qos_status.total_count_change = 0;
 | 
			
		||||
        dds_entity_status_reset(&rd->m_entity, DDS_REQUESTED_INCOMPATIBLE_QOS_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&rd->m_entity.m_observers_lock);
 | 
			
		||||
    dds_reader_unlock(rd);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										2819
									
								
								src/core/ddsc/src/dds_rhc_default.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2819
									
								
								src/core/ddsc/src/dds_rhc_default.c
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -19,7 +19,7 @@
 | 
			
		|||
#include "dds/ddsi/q_bswap.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_freelist.h"
 | 
			
		||||
#include "dds__key.h"
 | 
			
		||||
#include "dds/ddsi/q_plist.h"
 | 
			
		||||
#include "dds__stream.h"
 | 
			
		||||
#include "dds__serdata_builtintopic.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -126,16 +126,17 @@ static void from_entity_pwr (struct ddsi_serdata_builtintopic *d, const struct p
 | 
			
		|||
  assert (d->xqos.present & QP_TYPE_NAME);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ddsi_serdata *ddsi_serdata_builtin_from_keyhash (const struct ddsi_sertopic *tpcmn, const nn_keyhash_t *keyhash)
 | 
			
		||||
static struct ddsi_serdata *ddsi_serdata_builtin_from_keyhash (const struct ddsi_sertopic *tpcmn, const nn_keyhash_t *keyhash)
 | 
			
		||||
{
 | 
			
		||||
  /* FIXME: not quite elegant to manage the creation of a serdata for a built-in topic via this function, but I also find it quite unelegant to let from_sample read straight from the underlying internal entity, and to_sample convert to the external format ... I could claim the internal entity is the "serialised form", but that forces wrapping it in a fragchain in one way or another, which, though possible, is also a bit lacking in elegance. */
 | 
			
		||||
  const struct ddsi_sertopic_builtintopic *tp = (const struct ddsi_sertopic_builtintopic *)tpcmn;
 | 
			
		||||
  /* keyhash must in host format (which the GUIDs always are internally) */
 | 
			
		||||
  const struct entity_common *entity = ephash_lookup_guid_untyped ((const nn_guid_t *) keyhash->value);
 | 
			
		||||
  struct entity_common *entity = ephash_lookup_guid_untyped (tp->gv->guid_hash, (const nn_guid_t *) keyhash->value);
 | 
			
		||||
  struct ddsi_serdata_builtintopic *d = serdata_builtin_new(tp, entity ? SDK_DATA : SDK_KEY);
 | 
			
		||||
  memcpy (&d->key, keyhash->value, sizeof (d->key));
 | 
			
		||||
  if (entity)
 | 
			
		||||
  {
 | 
			
		||||
    ddsrt_mutex_lock (&entity->qos_lock);
 | 
			
		||||
    switch (entity->kind)
 | 
			
		||||
    {
 | 
			
		||||
      case EK_PARTICIPANT:
 | 
			
		||||
| 
						 | 
				
			
			@ -163,6 +164,7 @@ struct ddsi_serdata *ddsi_serdata_builtin_from_keyhash (const struct ddsi_sertop
 | 
			
		|||
        from_entity_pwr (d, (const struct proxy_writer *) entity);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&entity->qos_lock);
 | 
			
		||||
  }
 | 
			
		||||
  return fix_serdata_builtin(d, tp->c.serdata_basehash);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -187,24 +189,16 @@ static char *dds_string_dup_reuse (char *old, const char *src)
 | 
			
		|||
  return memcpy (new, src, size);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_qos_t *dds_qos_from_xqos_reuse (dds_qos_t *old, const nn_xqos_t *src)
 | 
			
		||||
static dds_qos_t *dds_qos_from_xqos_reuse (dds_qos_t *old, const dds_qos_t *src)
 | 
			
		||||
{
 | 
			
		||||
  if (old == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    old = ddsrt_malloc (sizeof (*old));
 | 
			
		||||
    nn_xqos_init_empty (old);
 | 
			
		||||
    old->present |= QP_TOPIC_NAME | QP_TYPE_NAME;
 | 
			
		||||
    nn_xqos_mergein_missing (old, src);
 | 
			
		||||
    old->present &= ~(QP_TOPIC_NAME | QP_TYPE_NAME);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    nn_xqos_fini (old);
 | 
			
		||||
    nn_xqos_init_empty (old);
 | 
			
		||||
    old->present |= QP_TOPIC_NAME | QP_TYPE_NAME;
 | 
			
		||||
    nn_xqos_mergein_missing (old, src);
 | 
			
		||||
    old->present &= ~(QP_TOPIC_NAME | QP_TYPE_NAME);
 | 
			
		||||
  }
 | 
			
		||||
  nn_xqos_init_empty (old);
 | 
			
		||||
  nn_xqos_mergein_missing (old, src, ~(QP_TOPIC_NAME | QP_TYPE_NAME));
 | 
			
		||||
  return old;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,30 +26,18 @@
 | 
			
		|||
 | 
			
		||||
/* FIXME: sertopic /= ddstopic so a lot of stuff needs to be moved here from dds_topic.c and the free function needs to be implemented properly */
 | 
			
		||||
 | 
			
		||||
struct ddsi_sertopic *new_sertopic_builtintopic (enum ddsi_sertopic_builtintopic_type type, const char *name, const char *typename)
 | 
			
		||||
struct ddsi_sertopic *new_sertopic_builtintopic (enum ddsi_sertopic_builtintopic_type type, const char *name, const char *typename, struct q_globals *gv)
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_sertopic_builtintopic *tp = ddsrt_malloc (sizeof (*tp));
 | 
			
		||||
  tp->c.iid = ddsi_iid_gen();
 | 
			
		||||
  tp->c.name = dds_string_dup (name);
 | 
			
		||||
  tp->c.type_name = dds_string_dup (typename);
 | 
			
		||||
  const size_t name_typename_size = strlen (tp->c.name) + 1 + strlen (tp->c.type_name) + 1;
 | 
			
		||||
  tp->c.name_type_name = dds_alloc (name_typename_size);
 | 
			
		||||
  snprintf (tp->c.name_type_name, name_typename_size, "%s/%s", tp->c.name, tp->c.type_name);
 | 
			
		||||
  tp->c.ops = &ddsi_sertopic_ops_builtintopic;
 | 
			
		||||
  tp->c.serdata_ops = &ddsi_serdata_ops_builtintopic;
 | 
			
		||||
  tp->c.serdata_basehash = ddsi_sertopic_compute_serdata_basehash (tp->c.serdata_ops);
 | 
			
		||||
  tp->c.status_cb = 0;
 | 
			
		||||
  tp->c.status_cb_entity = NULL;
 | 
			
		||||
  ddsrt_atomic_st32 (&tp->c.refc, 1);
 | 
			
		||||
  ddsi_sertopic_init (&tp->c, name, typename, &ddsi_sertopic_ops_builtintopic, &ddsi_serdata_ops_builtintopic, false);
 | 
			
		||||
  tp->type = type;
 | 
			
		||||
  tp->gv = gv;
 | 
			
		||||
  return &tp->c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void sertopic_builtin_free (struct ddsi_sertopic *tp)
 | 
			
		||||
{
 | 
			
		||||
  ddsrt_free (tp->name_type_name);
 | 
			
		||||
  ddsrt_free (tp->name);
 | 
			
		||||
  ddsrt_free (tp->type_name);
 | 
			
		||||
  ddsi_sertopic_fini (tp);
 | 
			
		||||
  ddsrt_free (tp);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +83,7 @@ static void sertopic_builtin_realloc_samples (void **ptrs, const struct ddsi_ser
 | 
			
		|||
{
 | 
			
		||||
  const struct ddsi_sertopic_builtintopic *tp = (const struct ddsi_sertopic_builtintopic *)sertopic_common;
 | 
			
		||||
  const size_t size = get_size (tp->type);
 | 
			
		||||
  char *new = dds_realloc (old, size * count);
 | 
			
		||||
  char *new = (oldcount == count) ? old : dds_realloc (old, size * count);
 | 
			
		||||
  if (new && count > oldcount)
 | 
			
		||||
    memset (new + size * oldcount, 0, size * (count - oldcount));
 | 
			
		||||
  for (size_t i = 0; i < count; i++)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -11,203 +11,93 @@
 | 
			
		|||
 */
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include "dds__listener.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds__participant.h"
 | 
			
		||||
#include "dds__subscriber.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_iid.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds/ddsrt/heap.h"
 | 
			
		||||
#include "dds/version.h"
 | 
			
		||||
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK(extern inline, dds_subscriber)
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK (extern inline, dds_subscriber)
 | 
			
		||||
 | 
			
		||||
#define DDS_SUBSCRIBER_STATUS_MASK                               \
 | 
			
		||||
                        DDS_DATA_ON_READERS_STATUS
 | 
			
		||||
                        (DDS_DATA_ON_READERS_STATUS)
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_subscriber_instance_hdl(
 | 
			
		||||
        dds_entity *e,
 | 
			
		||||
        dds_instance_handle_t *i)
 | 
			
		||||
static dds_return_t dds_subscriber_qos_set (dds_entity *e, const dds_qos_t *qos, bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    (void)e;
 | 
			
		||||
    (void)i;
 | 
			
		||||
    /* TODO: Get/generate proper handle. */
 | 
			
		||||
    DDS_ERROR("Generating subscriber instance handle is not supported");
 | 
			
		||||
    return DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  /* note: e->m_qos is still the old one to allow for failure here */
 | 
			
		||||
  (void) e; (void) qos; (void) enabled;
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds__subscriber_qos_validate(
 | 
			
		||||
        const dds_qos_t *qos,
 | 
			
		||||
        bool enabled)
 | 
			
		||||
static dds_return_t dds_subscriber_status_validate (uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
  return (mask & ~DDS_SUBSCRIBER_STATUS_MASK) ? DDS_RETCODE_BAD_PARAMETER : DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    assert(qos);
 | 
			
		||||
const struct dds_entity_deriver dds_entity_deriver_subscriber = {
 | 
			
		||||
  .close = dds_entity_deriver_dummy_close,
 | 
			
		||||
  .delete = dds_entity_deriver_dummy_delete,
 | 
			
		||||
  .set_qos = dds_subscriber_qos_set,
 | 
			
		||||
  .validate_status = dds_subscriber_status_validate
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
    if((qos->present & QP_GROUP_DATA) && !validate_octetseq(&qos->group_data)) {
 | 
			
		||||
        DDS_ERROR("Group data policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_PARTITION) && !validate_stringseq(&qos->partition)) {
 | 
			
		||||
        DDS_ERROR("Partition policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_PRESENTATION) && validate_presentation_qospolicy(&qos->presentation)) {
 | 
			
		||||
        DDS_ERROR("Presentation policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_PRISMTECH_ENTITY_FACTORY) && !validate_entityfactory_qospolicy(&qos->entity_factory)) {
 | 
			
		||||
        DDS_ERROR("Prismtech entity factory policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if(ret == DDS_RETCODE_OK && enabled && (qos->present & QP_PRESENTATION)) {
 | 
			
		||||
        /* TODO: Improve/check immutable check. */
 | 
			
		||||
        DDS_ERROR("Presentation QoS policy is immutable\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_IMMUTABLE_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
dds_entity_t dds__create_subscriber_l (dds_participant *participant, const dds_qos_t *qos, const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
  /* participant entity lock must be held */
 | 
			
		||||
  dds_subscriber *sub;
 | 
			
		||||
  dds_entity_t subscriber;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  dds_qos_t *new_qos;
 | 
			
		||||
 | 
			
		||||
  new_qos = dds_create_qos ();
 | 
			
		||||
  if (qos)
 | 
			
		||||
    nn_xqos_mergein_missing (new_qos, qos, DDS_SUBSCRIBER_QOS_MASK);
 | 
			
		||||
  nn_xqos_mergein_missing (new_qos, &participant->m_entity.m_domain->gv.default_xqos_sub, ~(uint64_t)0);
 | 
			
		||||
  if ((ret = nn_xqos_valid (&participant->m_entity.m_domain->gv.logconfig, new_qos)) != DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    dds_delete_qos (new_qos);
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  sub = dds_alloc (sizeof (*sub));
 | 
			
		||||
  subscriber = dds_entity_init (&sub->m_entity, &participant->m_entity, DDS_KIND_SUBSCRIBER, new_qos, listener, DDS_SUBSCRIBER_STATUS_MASK);
 | 
			
		||||
  sub->m_entity.m_iid = ddsi_iid_gen ();
 | 
			
		||||
  dds_entity_register_child (&participant->m_entity, &sub->m_entity);
 | 
			
		||||
  return subscriber;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_subscriber_qos_set(
 | 
			
		||||
        dds_entity *e,
 | 
			
		||||
        const dds_qos_t *qos,
 | 
			
		||||
        bool enabled)
 | 
			
		||||
dds_entity_t dds_create_subscriber (dds_entity_t participant, const dds_qos_t *qos, const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = dds__subscriber_qos_validate(qos, enabled);
 | 
			
		||||
    (void)e;
 | 
			
		||||
    if (ret == DDS_RETCODE_OK) {
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            /* TODO: CHAM-95: DDSI does not support changing QoS policies. */
 | 
			
		||||
            DDS_ERROR(DDS_PROJECT_NAME" does not support changing QoS policies yet\n");
 | 
			
		||||
            ret = DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  dds_participant *par;
 | 
			
		||||
  dds_entity_t hdl;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  if ((ret = dds_participant_lock (participant, &par)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
  hdl = dds__create_subscriber_l (par, qos, listener);
 | 
			
		||||
  dds_participant_unlock (par);
 | 
			
		||||
  return hdl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_subscriber_status_validate(
 | 
			
		||||
        uint32_t mask)
 | 
			
		||||
dds_return_t dds_notify_readers (dds_entity_t subscriber)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    if (mask & ~(DDS_SUBSCRIBER_STATUS_MASK)) {
 | 
			
		||||
        DDS_ERROR("Invalid status mask\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  dds_subscriber *sub;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  if ((ret = dds_subscriber_lock (subscriber, &sub)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
  dds_subscriber_unlock (sub);
 | 
			
		||||
  return DDS_RETCODE_UNSUPPORTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds__create_subscriber_l(
 | 
			
		||||
        dds_entity *participant, /* entity-lock must be held */
 | 
			
		||||
        const dds_qos_t *qos,
 | 
			
		||||
        const dds_listener_t *listener)
 | 
			
		||||
dds_return_t dds_subscriber_begin_coherent (dds_entity_t e)
 | 
			
		||||
{
 | 
			
		||||
    dds_subscriber * sub;
 | 
			
		||||
    dds_entity_t subscriber;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_qos_t * new_qos;
 | 
			
		||||
 | 
			
		||||
    /* Validate qos */
 | 
			
		||||
    if (qos) {
 | 
			
		||||
        if ((ret = dds__subscriber_qos_validate(qos, false)) != DDS_RETCODE_OK) {
 | 
			
		||||
            goto err_param;
 | 
			
		||||
        }
 | 
			
		||||
        new_qos = dds_create_qos();
 | 
			
		||||
        /* Only returns failure when one of the qos args is NULL, which
 | 
			
		||||
         * is not the case here. */
 | 
			
		||||
        (void)dds_copy_qos(new_qos, qos);
 | 
			
		||||
    } else {
 | 
			
		||||
        new_qos = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Create subscriber */
 | 
			
		||||
    sub = dds_alloc(sizeof(*sub));
 | 
			
		||||
    subscriber = dds_entity_init(&sub->m_entity, participant, DDS_KIND_SUBSCRIBER, new_qos, listener, DDS_SUBSCRIBER_STATUS_MASK);
 | 
			
		||||
    sub->m_entity.m_deriver.set_qos = dds_subscriber_qos_set;
 | 
			
		||||
    sub->m_entity.m_deriver.validate_status = dds_subscriber_status_validate;
 | 
			
		||||
    sub->m_entity.m_deriver.get_instance_hdl = dds_subscriber_instance_hdl;
 | 
			
		||||
 | 
			
		||||
    return subscriber;
 | 
			
		||||
 | 
			
		||||
    /* Error handling */
 | 
			
		||||
err_param:
 | 
			
		||||
    return ret;
 | 
			
		||||
  return dds_generic_unimplemented_operation (e, DDS_KIND_SUBSCRIBER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds_create_subscriber(
 | 
			
		||||
        dds_entity_t participant,
 | 
			
		||||
        const dds_qos_t *qos,
 | 
			
		||||
        const dds_listener_t *listener)
 | 
			
		||||
dds_return_t dds_subscriber_end_coherent (dds_entity_t e)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity * par;
 | 
			
		||||
    dds_entity_t hdl;
 | 
			
		||||
    dds_retcode_t errnr;
 | 
			
		||||
 | 
			
		||||
    errnr = dds_entity_lock(participant, DDS_KIND_PARTICIPANT, &par);
 | 
			
		||||
    if (errnr != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking participant\n");
 | 
			
		||||
        hdl = DDS_ERRNO(errnr);
 | 
			
		||||
        return hdl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    hdl = dds__create_subscriber_l(par, qos, listener);
 | 
			
		||||
    dds_entity_unlock(par);
 | 
			
		||||
 | 
			
		||||
    return hdl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_notify_readers(
 | 
			
		||||
        dds_entity_t subscriber)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity *iter;
 | 
			
		||||
    dds_entity *sub;
 | 
			
		||||
    dds_retcode_t errnr;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    errnr = dds_entity_lock(subscriber, DDS_KIND_SUBSCRIBER, &sub);
 | 
			
		||||
    if (errnr == DDS_RETCODE_OK) {
 | 
			
		||||
        errnr = DDS_RETCODE_UNSUPPORTED;
 | 
			
		||||
        DDS_ERROR("Unsupported operation\n");
 | 
			
		||||
        ret = DDS_ERRNO(errnr);
 | 
			
		||||
        iter = sub->m_children;
 | 
			
		||||
        while (iter) {
 | 
			
		||||
            ddsrt_mutex_lock(&iter->m_mutex);
 | 
			
		||||
            // TODO: check if reader has data available, call listener
 | 
			
		||||
            ddsrt_mutex_unlock(&iter->m_mutex);
 | 
			
		||||
            iter = iter->m_next;
 | 
			
		||||
        }
 | 
			
		||||
        dds_entity_unlock(sub);
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking subscriber\n");
 | 
			
		||||
        ret = DDS_ERRNO(errnr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_subscriber_begin_coherent(
 | 
			
		||||
        dds_entity_t e)
 | 
			
		||||
{
 | 
			
		||||
    /* TODO: CHAM-124 Currently unsupported. */
 | 
			
		||||
    (void)e;
 | 
			
		||||
    DDS_ERROR("Using coherency to get a coherent data set is not currently being supported\n");
 | 
			
		||||
    return DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_subscriber_end_coherent(
 | 
			
		||||
        dds_entity_t e)
 | 
			
		||||
{
 | 
			
		||||
    /* TODO: CHAM-124 Currently unsupported. */
 | 
			
		||||
    (void)e;
 | 
			
		||||
    DDS_ERROR("Using coherency to get a coherent data set is not currently being supported\n");
 | 
			
		||||
    return DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  return dds_generic_unimplemented_operation (e, DDS_KIND_SUBSCRIBER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -14,458 +14,304 @@
 | 
			
		|||
#include "dds/ddsrt/heap.h"
 | 
			
		||||
#include "dds/ddsrt/log.h"
 | 
			
		||||
#include "dds__entity.h"
 | 
			
		||||
#include "dds__participant.h"
 | 
			
		||||
#include "dds__querycond.h"
 | 
			
		||||
#include "dds__readcond.h"
 | 
			
		||||
#include "dds__rhc.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_iid.h"
 | 
			
		||||
 | 
			
		||||
DEFINE_ENTITY_LOCK_UNLOCK(static, dds_waitset, DDS_KIND_WAITSET)
 | 
			
		||||
DEFINE_ENTITY_LOCK_UNLOCK (static, dds_waitset, DDS_KIND_WAITSET)
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
dds_waitset_swap(
 | 
			
		||||
        dds_attachment **dst,
 | 
			
		||||
        dds_attachment **src,
 | 
			
		||||
        dds_attachment  *prev,
 | 
			
		||||
        dds_attachment  *idx)
 | 
			
		||||
static bool is_triggered (struct dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
    /* Remove from source. */
 | 
			
		||||
    if (prev == NULL) {
 | 
			
		||||
        *src = idx->next;
 | 
			
		||||
    } else {
 | 
			
		||||
        prev->next = idx->next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* Add to destination. */
 | 
			
		||||
    idx->next = *dst;
 | 
			
		||||
    *dst = idx;
 | 
			
		||||
  bool t;
 | 
			
		||||
  switch (e->m_kind)
 | 
			
		||||
  {
 | 
			
		||||
    case DDS_KIND_COND_READ:
 | 
			
		||||
    case DDS_KIND_COND_QUERY:
 | 
			
		||||
    case DDS_KIND_COND_GUARD:
 | 
			
		||||
    case DDS_KIND_WAITSET:
 | 
			
		||||
      t = ddsrt_atomic_ld32 (&e->m_status.m_trigger) != 0;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      t = (ddsrt_atomic_ld32 (&e->m_status.m_status_and_mask) & SAM_STATUS_MASK) != 0;
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  return t;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_waitset_wait_impl(
 | 
			
		||||
        dds_entity_t waitset,
 | 
			
		||||
        dds_attach_t *xs,
 | 
			
		||||
        size_t nxs,
 | 
			
		||||
        dds_time_t abstimeout,
 | 
			
		||||
        dds_time_t tnow)
 | 
			
		||||
static dds_return_t dds_waitset_wait_impl (dds_entity_t waitset, dds_attach_t *xs, size_t nxs, dds_time_t abstimeout)
 | 
			
		||||
{
 | 
			
		||||
    dds_waitset *ws;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_attachment *idx;
 | 
			
		||||
    dds_attachment *next;
 | 
			
		||||
    dds_attachment *prev;
 | 
			
		||||
  dds_waitset *ws;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    if ((xs == NULL) && (nxs != 0)){
 | 
			
		||||
        DDS_ERROR("A size was given, but no array\n");
 | 
			
		||||
        return DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  if ((xs == NULL) != (nxs == 0))
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  /* Locking the waitset here will delay a possible deletion until it is
 | 
			
		||||
   * unlocked. Even when the related mutex is unlocked by a conditioned wait. */
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity *ent;
 | 
			
		||||
    if ((ret = dds_entity_pin (waitset, &ent)) != DDS_RETCODE_OK)
 | 
			
		||||
      return ret;
 | 
			
		||||
    if (dds_entity_kind (ent) != DDS_KIND_WAITSET)
 | 
			
		||||
    {
 | 
			
		||||
      dds_entity_unpin (ent);
 | 
			
		||||
      return DDS_RETCODE_ILLEGAL_OPERATION;
 | 
			
		||||
    }
 | 
			
		||||
    if ((xs != NULL) && (nxs == 0)){
 | 
			
		||||
        DDS_ERROR("Array is given with an invalid size\n");
 | 
			
		||||
        return DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ws = (dds_waitset *) ent;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Move any previously but no longer triggering entities back to the observed list */
 | 
			
		||||
  ddsrt_mutex_lock (&ws->m_entity.m_mutex);
 | 
			
		||||
  ws->ntriggered = 0;
 | 
			
		||||
  for (size_t i = 0; i < ws->nentities; i++)
 | 
			
		||||
  {
 | 
			
		||||
    if (is_triggered (ws->entities[i].entity))
 | 
			
		||||
    {
 | 
			
		||||
      dds_attachment tmp = ws->entities[i];
 | 
			
		||||
      ws->entities[i] = ws->entities[ws->ntriggered];
 | 
			
		||||
      ws->entities[ws->ntriggered++] = tmp;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    /* Locking the waitset here will delay a possible deletion until it is
 | 
			
		||||
     * unlocked. Even when the related mutex is unlocked by a conditioned wait. */
 | 
			
		||||
    rc = dds_waitset_lock(waitset, &ws);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        /* Check if any of any previous triggered entities has changed there status
 | 
			
		||||
         * and thus it trigger value could be false now. */
 | 
			
		||||
        idx = ws->triggered;
 | 
			
		||||
        prev = NULL;
 | 
			
		||||
        while (idx != NULL) {
 | 
			
		||||
            next = idx->next;
 | 
			
		||||
            if (idx->entity->m_trigger == 0) {
 | 
			
		||||
                /* Move observed entity to triggered list. */
 | 
			
		||||
                dds_waitset_swap(&(ws->observed), &(ws->triggered), prev, idx);
 | 
			
		||||
            } else {
 | 
			
		||||
                prev = idx;
 | 
			
		||||
            }
 | 
			
		||||
            idx = next;
 | 
			
		||||
        }
 | 
			
		||||
        /* Check if any of the entities have been triggered. */
 | 
			
		||||
        idx = ws->observed;
 | 
			
		||||
        prev = NULL;
 | 
			
		||||
        while (idx != NULL) {
 | 
			
		||||
            next = idx->next;
 | 
			
		||||
            if (idx->entity->m_trigger > 0) {
 | 
			
		||||
                /* Move observed entity to triggered list. */
 | 
			
		||||
                dds_waitset_swap(&(ws->triggered), &(ws->observed), prev, idx);
 | 
			
		||||
            } else {
 | 
			
		||||
                prev = idx;
 | 
			
		||||
            }
 | 
			
		||||
            idx = next;
 | 
			
		||||
        }
 | 
			
		||||
  /* Only wait/keep waiting when we have something to observe and there aren't any triggers yet. */
 | 
			
		||||
  while (ws->nentities > 0 && ws->ntriggered == 0)
 | 
			
		||||
    if (!ddsrt_cond_waituntil (&ws->m_entity.m_cond, &ws->m_entity.m_mutex, abstimeout))
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
        /* Only wait/keep waiting when whe have something to observer and there aren't any triggers yet. */
 | 
			
		||||
        rc = DDS_RETCODE_OK;
 | 
			
		||||
        while ((ws->observed != NULL) && (ws->triggered == NULL) && (rc == DDS_RETCODE_OK)) {
 | 
			
		||||
            if (abstimeout == DDS_NEVER) {
 | 
			
		||||
                ddsrt_cond_wait(&ws->m_entity.m_cond, &ws->m_entity.m_mutex);
 | 
			
		||||
            } else if (abstimeout <= tnow) {
 | 
			
		||||
                rc = DDS_RETCODE_TIMEOUT;
 | 
			
		||||
            } else {
 | 
			
		||||
                dds_duration_t dt = abstimeout - tnow;
 | 
			
		||||
                (void)ddsrt_cond_waitfor(&ws->m_entity.m_cond, &ws->m_entity.m_mutex, dt);
 | 
			
		||||
                tnow = dds_time();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
  ret = (int32_t) ws->ntriggered;
 | 
			
		||||
  for (size_t i = 0; i < ws->ntriggered && i < nxs; i++)
 | 
			
		||||
    xs[i] = ws->entities[i].arg;
 | 
			
		||||
  ddsrt_mutex_unlock (&ws->m_entity.m_mutex);
 | 
			
		||||
  dds_entity_unpin (&ws->m_entity);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        /* Get number of triggered entities
 | 
			
		||||
         *   - set attach array when needed
 | 
			
		||||
         *   - swap them back to observed */
 | 
			
		||||
        if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
            ret = 0;
 | 
			
		||||
            idx = ws->triggered;
 | 
			
		||||
            while (idx != NULL) {
 | 
			
		||||
                if ((uint32_t)ret < (uint32_t)nxs) {
 | 
			
		||||
                    xs[ret] = idx->arg;
 | 
			
		||||
                }
 | 
			
		||||
                ret++;
 | 
			
		||||
static dds_return_t dds_waitset_close (struct dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
  /* deep in the process of deleting the entity, so this is the only thread */
 | 
			
		||||
  dds_waitset *ws = (dds_waitset *) e;
 | 
			
		||||
  for (size_t i = 0; i < ws->nentities; i++)
 | 
			
		||||
    (void) dds_entity_observer_unregister (ws->entities[i].entity, &ws->m_entity);
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
                next = idx->next;
 | 
			
		||||
                /* The idx is always the first in triggered, so no prev. */
 | 
			
		||||
                dds_waitset_swap(&(ws->observed), &(ws->triggered), NULL, idx);
 | 
			
		||||
                idx = next;
 | 
			
		||||
            }
 | 
			
		||||
        } else if (rc == DDS_RETCODE_TIMEOUT) {
 | 
			
		||||
            ret = 0;
 | 
			
		||||
        } else {
 | 
			
		||||
            DDS_ERROR("Internal error");
 | 
			
		||||
            ret = DDS_ERRNO(rc);
 | 
			
		||||
        }
 | 
			
		||||
static dds_return_t dds_waitset_delete (struct dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
  /* deep in the process of deleting the entity, so this is the only thread */
 | 
			
		||||
  dds_waitset *ws = (dds_waitset *) e;
 | 
			
		||||
  ddsrt_free (ws->entities);
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        dds_waitset_unlock(ws);
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking waitset\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
const struct dds_entity_deriver dds_entity_deriver_waitset = {
 | 
			
		||||
  .close = dds_waitset_close,
 | 
			
		||||
  .delete = dds_waitset_delete,
 | 
			
		||||
  .set_qos = dds_entity_deriver_dummy_set_qos,
 | 
			
		||||
  .validate_status = dds_entity_deriver_dummy_validate_status
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
dds_entity_t dds_create_waitset (dds_entity_t participant)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity_t hdl;
 | 
			
		||||
  dds_participant *par;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_participant_lock (participant, &par)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
 | 
			
		||||
  dds_waitset *waitset = dds_alloc (sizeof (*waitset));
 | 
			
		||||
  hdl = dds_entity_init (&waitset->m_entity, &par->m_entity, DDS_KIND_WAITSET, NULL, NULL, 0);
 | 
			
		||||
  waitset->m_entity.m_iid = ddsi_iid_gen ();
 | 
			
		||||
  dds_entity_register_child (&par->m_entity, &waitset->m_entity);
 | 
			
		||||
  waitset->nentities = 0;
 | 
			
		||||
  waitset->ntriggered = 0;
 | 
			
		||||
  waitset->entities = NULL;
 | 
			
		||||
  dds_participant_unlock (par);
 | 
			
		||||
  return hdl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_waitset_get_entities (dds_entity_t waitset, dds_entity_t *entities, size_t size)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  dds_waitset *ws;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_waitset_lock (waitset, &ws)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  if (entities != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    for (size_t i = 0; i < ws->nentities && i < size; i++)
 | 
			
		||||
      entities[i] = ws->entities[i].handle;
 | 
			
		||||
  }
 | 
			
		||||
  ret = (int32_t) ws->nentities;
 | 
			
		||||
  dds_waitset_unlock (ws);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
dds_waitset_close_list(
 | 
			
		||||
        dds_attachment **list,
 | 
			
		||||
        dds_entity_t waitset)
 | 
			
		||||
static void dds_waitset_remove (dds_waitset *ws, dds_entity_t observed)
 | 
			
		||||
{
 | 
			
		||||
    dds_attachment *idx = *list;
 | 
			
		||||
    dds_attachment *next;
 | 
			
		||||
    while (idx != NULL) {
 | 
			
		||||
        next = idx->next;
 | 
			
		||||
        (void)dds_entity_observer_unregister(idx->entity->m_hdllink.hdl, waitset);
 | 
			
		||||
        ddsrt_free(idx);
 | 
			
		||||
        idx = next;
 | 
			
		||||
  size_t i;
 | 
			
		||||
  for (i = 0; i < ws->nentities; i++)
 | 
			
		||||
    if (ws->entities[i].handle == observed)
 | 
			
		||||
      break;
 | 
			
		||||
  if (i < ws->nentities)
 | 
			
		||||
  {
 | 
			
		||||
    if (i < ws->ntriggered)
 | 
			
		||||
    {
 | 
			
		||||
      ws->entities[i] = ws->entities[--ws->ntriggered];
 | 
			
		||||
      ws->entities[ws->ntriggered] = ws->entities[--ws->nentities];
 | 
			
		||||
    }
 | 
			
		||||
    *list = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
dds_waitset_remove_from_list(
 | 
			
		||||
        dds_attachment **list,
 | 
			
		||||
        dds_entity_t observed)
 | 
			
		||||
{
 | 
			
		||||
    dds_attachment *idx = *list;
 | 
			
		||||
    dds_attachment *prev = NULL;
 | 
			
		||||
 | 
			
		||||
    while (idx != NULL) {
 | 
			
		||||
        if (idx->entity->m_hdllink.hdl == observed) {
 | 
			
		||||
            if (prev == NULL) {
 | 
			
		||||
                *list = idx->next;
 | 
			
		||||
            } else {
 | 
			
		||||
                prev->next = idx->next;
 | 
			
		||||
            }
 | 
			
		||||
            ddsrt_free(idx);
 | 
			
		||||
 | 
			
		||||
            /* We're done. */
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        prev = idx;
 | 
			
		||||
        idx = idx->next;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_waitset_close(
 | 
			
		||||
        struct dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
    dds_waitset *ws = (dds_waitset*)e;
 | 
			
		||||
 | 
			
		||||
    dds_waitset_close_list(&ws->observed,  e->m_hdllink.hdl);
 | 
			
		||||
    dds_waitset_close_list(&ws->triggered, e->m_hdllink.hdl);
 | 
			
		||||
 | 
			
		||||
    /* Trigger waitset to wake up. */
 | 
			
		||||
    ddsrt_cond_broadcast(&e->m_cond);
 | 
			
		||||
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_entity_t
 | 
			
		||||
dds_create_waitset(
 | 
			
		||||
        dds_entity_t participant)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t hdl;
 | 
			
		||||
    dds_entity *par;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
 | 
			
		||||
    rc = dds_entity_lock(participant, DDS_KIND_PARTICIPANT, &par);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        dds_waitset *waitset = dds_alloc(sizeof(*waitset));
 | 
			
		||||
        hdl = dds_entity_init(&waitset->m_entity, par, DDS_KIND_WAITSET, NULL, NULL, 0);
 | 
			
		||||
        waitset->m_entity.m_deriver.close = dds_waitset_close;
 | 
			
		||||
        waitset->observed = NULL;
 | 
			
		||||
        waitset->triggered = NULL;
 | 
			
		||||
        dds_entity_unlock(par);
 | 
			
		||||
    } else {
 | 
			
		||||
        hdl = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return hdl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_waitset_get_entities(
 | 
			
		||||
        dds_entity_t waitset,
 | 
			
		||||
        dds_entity_t *entities,
 | 
			
		||||
        size_t size)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = 0;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_waitset *ws;
 | 
			
		||||
 | 
			
		||||
    rc = dds_waitset_lock(waitset, &ws);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        dds_attachment* iter;
 | 
			
		||||
 | 
			
		||||
        iter = ws->observed;
 | 
			
		||||
        while (iter) {
 | 
			
		||||
            if (((size_t)ret < size) && (entities != NULL)) {
 | 
			
		||||
                entities[ret] = iter->entity->m_hdllink.hdl;
 | 
			
		||||
            }
 | 
			
		||||
            ret++;
 | 
			
		||||
            iter = iter->next;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        iter = ws->triggered;
 | 
			
		||||
        while (iter) {
 | 
			
		||||
            if (((size_t)ret < size) && (entities != NULL)) {
 | 
			
		||||
                entities[ret] = iter->entity->m_hdllink.hdl;
 | 
			
		||||
            }
 | 
			
		||||
            ret++;
 | 
			
		||||
            iter = iter->next;
 | 
			
		||||
        }
 | 
			
		||||
        dds_waitset_unlock(ws);
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking waitset\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
dds_waitset_move(
 | 
			
		||||
        dds_attachment **src,
 | 
			
		||||
        dds_attachment **dst,
 | 
			
		||||
        dds_entity_t entity)
 | 
			
		||||
{
 | 
			
		||||
    dds_attachment *idx = *src;
 | 
			
		||||
    dds_attachment *prev = NULL;
 | 
			
		||||
    while (idx != NULL) {
 | 
			
		||||
        if (idx->entity->m_hdllink.hdl == entity) {
 | 
			
		||||
            /* Swap idx from src to dst. */
 | 
			
		||||
            dds_waitset_swap(dst, src, prev, idx);
 | 
			
		||||
 | 
			
		||||
            /* We're done. */
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        prev = idx;
 | 
			
		||||
        idx = idx->next;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
dds_waitset_remove(
 | 
			
		||||
        dds_waitset *ws,
 | 
			
		||||
        dds_entity_t observed)
 | 
			
		||||
{
 | 
			
		||||
    if (!dds_waitset_remove_from_list(&(ws->observed), observed)) {
 | 
			
		||||
        (void)dds_waitset_remove_from_list(&(ws->triggered), observed);
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      ws->entities[i] = ws->entities[--ws->nentities];
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* This is called when the observed entity signals a status change. */
 | 
			
		||||
void
 | 
			
		||||
dds_waitset_observer(
 | 
			
		||||
        dds_entity_t observer,
 | 
			
		||||
        dds_entity_t observed,
 | 
			
		||||
        uint32_t status)
 | 
			
		||||
static void dds_waitset_observer (dds_entity *ent, dds_entity_t observed, uint32_t status)
 | 
			
		||||
{
 | 
			
		||||
    dds_waitset *ws;
 | 
			
		||||
    if (dds_waitset_lock(observer, &ws) == DDS_RETCODE_OK) {
 | 
			
		||||
        if (status & DDS_DELETING_STATUS) {
 | 
			
		||||
            /* Remove this observed entity, which is being deleted, from the waitset. */
 | 
			
		||||
            dds_waitset_remove(ws, observed);
 | 
			
		||||
            /* Our registration to this observed entity will be removed automatically. */
 | 
			
		||||
        } else if (status != 0) {
 | 
			
		||||
            /* Move observed entity to triggered list. */
 | 
			
		||||
            dds_waitset_move(&(ws->observed), &(ws->triggered), observed);
 | 
			
		||||
        } else {
 | 
			
		||||
            /* Remove observed entity from triggered list (which it possibly resides in). */
 | 
			
		||||
            dds_waitset_move(&(ws->triggered), &(ws->observed), observed);
 | 
			
		||||
        }
 | 
			
		||||
        /* Trigger waitset to wake up. */
 | 
			
		||||
        ddsrt_cond_broadcast(&ws->m_entity.m_cond);
 | 
			
		||||
        dds_waitset_unlock(ws);
 | 
			
		||||
    }
 | 
			
		||||
  assert (dds_entity_kind (ent) == DDS_KIND_WAITSET);
 | 
			
		||||
  dds_waitset *ws = (dds_waitset *) ent;
 | 
			
		||||
  (void) status;
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&ws->m_entity.m_mutex);
 | 
			
		||||
  /* Move observed entity to triggered list. */
 | 
			
		||||
  size_t i;
 | 
			
		||||
  for (i = 0; i < ws->nentities; i++)
 | 
			
		||||
    if (ws->entities[i].handle == observed)
 | 
			
		||||
      break;
 | 
			
		||||
  if (i < ws->nentities && i >= ws->ntriggered)
 | 
			
		||||
  {
 | 
			
		||||
    dds_attachment tmp = ws->entities[i];
 | 
			
		||||
    ws->entities[i] = ws->entities[ws->ntriggered];
 | 
			
		||||
    ws->entities[ws->ntriggered++] = tmp;
 | 
			
		||||
  }
 | 
			
		||||
  /* Trigger waitset to wake up. */
 | 
			
		||||
  ddsrt_cond_broadcast (&ws->m_entity.m_cond);
 | 
			
		||||
  ddsrt_mutex_unlock (&ws->m_entity.m_mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_waitset_attach(
 | 
			
		||||
        dds_entity_t waitset,
 | 
			
		||||
        dds_entity_t entity,
 | 
			
		||||
        dds_attach_t x)
 | 
			
		||||
static void dds_waitset_delete_observer (dds_entity *ent, dds_entity_t observed)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity  *e = NULL;
 | 
			
		||||
    dds_waitset *ws;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
  assert (dds_entity_kind (ent) == DDS_KIND_WAITSET);
 | 
			
		||||
  dds_waitset *ws = (dds_waitset *) ent;
 | 
			
		||||
  ddsrt_mutex_lock (&ws->m_entity.m_mutex);
 | 
			
		||||
  /* Remove this observed entity, which is being deleted, from the waitset. */
 | 
			
		||||
  dds_waitset_remove (ws, observed);
 | 
			
		||||
  /* Our registration to this observed entity will be removed automatically. */
 | 
			
		||||
  /* Trigger waitset to wake up. */
 | 
			
		||||
  ddsrt_cond_broadcast (&ws->m_entity.m_cond);
 | 
			
		||||
  ddsrt_mutex_unlock (&ws->m_entity.m_mutex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    rc = dds_waitset_lock(waitset, &ws);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        if (waitset != entity) {
 | 
			
		||||
            rc = dds_entity_lock(entity, DDS_KIND_DONTCARE, &e);
 | 
			
		||||
            if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
                e = NULL;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            e = &ws->m_entity;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* This will fail if given entity is already attached (or deleted). */
 | 
			
		||||
        if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
            rc = dds_entity_observer_register_nl(e, waitset, dds_waitset_observer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
            dds_attachment *a = ddsrt_malloc(sizeof(dds_attachment));
 | 
			
		||||
            a->arg = x;
 | 
			
		||||
            a->entity = e;
 | 
			
		||||
            if (e->m_trigger > 0) {
 | 
			
		||||
                a->next = ws->triggered;
 | 
			
		||||
                ws->triggered = a;
 | 
			
		||||
            } else {
 | 
			
		||||
                a->next = ws->observed;
 | 
			
		||||
                ws->observed = a;
 | 
			
		||||
            }
 | 
			
		||||
            ret = DDS_RETCODE_OK;
 | 
			
		||||
        } else if (rc != DDS_RETCODE_PRECONDITION_NOT_MET) {
 | 
			
		||||
            DDS_ERROR("Entity is not valid\n");
 | 
			
		||||
            ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        } else {
 | 
			
		||||
            DDS_ERROR("Entity is already attached\n");
 | 
			
		||||
            ret = DDS_ERRNO(rc);
 | 
			
		||||
        }
 | 
			
		||||
        if ((e != NULL) && (waitset != entity)) {
 | 
			
		||||
            dds_entity_unlock(e);
 | 
			
		||||
        }
 | 
			
		||||
        dds_waitset_unlock(ws);
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking waitset\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
dds_return_t dds_waitset_attach (dds_entity_t waitset, dds_entity_t entity, dds_attach_t x)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity *e;
 | 
			
		||||
  dds_waitset *ws;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_waitset_lock (waitset, &ws)) < 0)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  if (waitset == entity)
 | 
			
		||||
    e = &ws->m_entity;
 | 
			
		||||
  else if ((ret = dds_entity_pin (entity, &e)) < 0)
 | 
			
		||||
    goto err_waitset;
 | 
			
		||||
 | 
			
		||||
  /* This will fail if given entity is already attached (or deleted). */
 | 
			
		||||
  if ((ret = dds_entity_observer_register (e, &ws->m_entity, dds_waitset_observer, dds_waitset_delete_observer)) != DDS_RETCODE_OK)
 | 
			
		||||
    goto err_entity;
 | 
			
		||||
 | 
			
		||||
  ws->entities = ddsrt_realloc (ws->entities, (ws->nentities + 1) * sizeof (*ws->entities));
 | 
			
		||||
  ws->entities[ws->nentities].arg = x;
 | 
			
		||||
  ws->entities[ws->nentities].entity = e;
 | 
			
		||||
  ws->entities[ws->nentities].handle = e->m_hdllink.hdl;
 | 
			
		||||
  ws->nentities++;
 | 
			
		||||
  if (is_triggered (e))
 | 
			
		||||
  {
 | 
			
		||||
    const size_t i = ws->nentities - 1;
 | 
			
		||||
    dds_attachment tmp = ws->entities[i];
 | 
			
		||||
    ws->entities[i] = ws->entities[ws->ntriggered];
 | 
			
		||||
    ws->entities[ws->ntriggered++] = tmp;
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_cond_broadcast (&ws->m_entity.m_cond);
 | 
			
		||||
 | 
			
		||||
err_entity:
 | 
			
		||||
  if (e != &ws->m_entity)
 | 
			
		||||
    dds_entity_unpin (e);
 | 
			
		||||
err_waitset:
 | 
			
		||||
  dds_waitset_unlock (ws);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT dds_return_t
 | 
			
		||||
dds_waitset_detach(
 | 
			
		||||
        dds_entity_t waitset,
 | 
			
		||||
        dds_entity_t entity)
 | 
			
		||||
dds_return_t dds_waitset_detach (dds_entity_t waitset, dds_entity_t entity)
 | 
			
		||||
{
 | 
			
		||||
    dds_waitset *ws;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    rc = dds_waitset_lock(waitset, &ws);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
        /* Possibly fails when entity was not attached. */
 | 
			
		||||
        if (waitset == entity) {
 | 
			
		||||
            rc = dds_entity_observer_unregister_nl(&ws->m_entity, waitset);
 | 
			
		||||
        } else {
 | 
			
		||||
            rc = dds_entity_observer_unregister(entity, waitset);
 | 
			
		||||
        }
 | 
			
		||||
        if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
            dds_waitset_remove(ws, entity);
 | 
			
		||||
            ret = DDS_RETCODE_OK;
 | 
			
		||||
        } else if (rc != DDS_RETCODE_PRECONDITION_NOT_MET) {
 | 
			
		||||
            DDS_ERROR("The given entity to detach is invalid\n");
 | 
			
		||||
            ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        } else {
 | 
			
		||||
            DDS_ERROR("The given entity to detach was not attached previously\n");
 | 
			
		||||
            ret = DDS_ERRNO(rc);
 | 
			
		||||
        }
 | 
			
		||||
        dds_waitset_unlock(ws);
 | 
			
		||||
    } else {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking waitset\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
    }
 | 
			
		||||
  dds_waitset *ws;
 | 
			
		||||
  dds_entity *e;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
  if ((ret = dds_waitset_lock (waitset, &ws)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
 | 
			
		||||
  /* Possibly fails when entity was not attached. */
 | 
			
		||||
  if (waitset == entity)
 | 
			
		||||
    ret = dds_entity_observer_unregister (&ws->m_entity, &ws->m_entity);
 | 
			
		||||
  else if ((ret = dds_entity_pin (entity, &e)) < 0)
 | 
			
		||||
    ; /* entity invalid */
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    ret = dds_entity_observer_unregister (e, &ws->m_entity);
 | 
			
		||||
    dds_entity_unpin (e);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (ret == DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    dds_waitset_remove (ws, entity);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    if (ret != DDS_RETCODE_PRECONDITION_NOT_MET)
 | 
			
		||||
      ret = DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  }
 | 
			
		||||
  dds_waitset_unlock (ws);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_waitset_wait_until(
 | 
			
		||||
        dds_entity_t waitset,
 | 
			
		||||
        dds_attach_t *xs,
 | 
			
		||||
        size_t nxs,
 | 
			
		||||
        dds_time_t abstimeout)
 | 
			
		||||
dds_return_t dds_waitset_wait_until (dds_entity_t waitset, dds_attach_t *xs, size_t nxs, dds_time_t abstimeout)
 | 
			
		||||
{
 | 
			
		||||
    return dds_waitset_wait_impl(waitset, xs, nxs, abstimeout, dds_time());
 | 
			
		||||
  return dds_waitset_wait_impl (waitset, xs, nxs, abstimeout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_waitset_wait(
 | 
			
		||||
        dds_entity_t waitset,
 | 
			
		||||
        dds_attach_t *xs,
 | 
			
		||||
        size_t nxs,
 | 
			
		||||
        dds_duration_t reltimeout)
 | 
			
		||||
dds_return_t dds_waitset_wait (dds_entity_t waitset, dds_attach_t *xs, size_t nxs, dds_duration_t reltimeout)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t ret;
 | 
			
		||||
 | 
			
		||||
    if (reltimeout >= 0) {
 | 
			
		||||
        dds_time_t tnow = dds_time();
 | 
			
		||||
        dds_time_t abstimeout = (DDS_INFINITY - reltimeout <= tnow) ? DDS_NEVER : (tnow + reltimeout);
 | 
			
		||||
        ret = dds_waitset_wait_impl(waitset, xs, nxs, abstimeout, tnow);
 | 
			
		||||
    } else{
 | 
			
		||||
        DDS_ERROR("Negative timeout\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
  if (reltimeout < 0)
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
  const dds_time_t tnow = dds_time ();
 | 
			
		||||
  const dds_time_t abstimeout = (DDS_INFINITY - reltimeout <= tnow) ? DDS_NEVER : (tnow + reltimeout);
 | 
			
		||||
  return dds_waitset_wait_impl (waitset, xs, nxs, abstimeout);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_waitset_set_trigger (dds_entity_t waitset, bool trigger)
 | 
			
		||||
{
 | 
			
		||||
  dds_waitset *ws;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_entity *ent;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_waitset_lock (waitset, &ws)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (rc);
 | 
			
		||||
  if ((rc = dds_entity_pin (waitset, &ent)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
  else if (dds_entity_kind (ent) != DDS_KIND_WAITSET)
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_unpin (ent);
 | 
			
		||||
    return DDS_RETCODE_ILLEGAL_OPERATION;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_unlock (&ws->m_entity.m_mutex);
 | 
			
		||||
  ddsrt_mutex_lock (&ent->m_observers_lock);
 | 
			
		||||
  dds_entity_trigger_set (ent, trigger);
 | 
			
		||||
  ddsrt_mutex_unlock (&ent->m_observers_lock);
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&ws->m_entity.m_observers_lock);
 | 
			
		||||
  if (trigger)
 | 
			
		||||
    dds_entity_status_set (&ws->m_entity, DDS_WAITSET_TRIGGER_STATUS);
 | 
			
		||||
  else
 | 
			
		||||
    dds_entity_status_reset (&ws->m_entity, DDS_WAITSET_TRIGGER_STATUS);
 | 
			
		||||
  ddsrt_mutex_unlock (&ws->m_entity.m_observers_lock);
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&ws->m_entity.m_mutex);
 | 
			
		||||
  dds_waitset_unlock (ws);
 | 
			
		||||
  dds_entity_unpin (ent);
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,7 +35,7 @@ struct whc_node {
 | 
			
		|||
  struct whc_node *next_seq; /* next in this interval */
 | 
			
		||||
  struct whc_node *prev_seq; /* prev in this interval */
 | 
			
		||||
  struct whc_idxnode *idxnode; /* NULL if not in index */
 | 
			
		||||
  unsigned idxnode_pos; /* index in idxnode.hist */
 | 
			
		||||
  uint32_t idxnode_pos; /* index in idxnode.hist */
 | 
			
		||||
  seqno_t seq;
 | 
			
		||||
  uint64_t total_bytes; /* cumulative number of bytes up to and including this node */
 | 
			
		||||
  size_t size;
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ struct whc_node {
 | 
			
		|||
  unsigned unacked: 1; /* counted in whc::unacked_bytes iff 1 */
 | 
			
		||||
  unsigned borrowed: 1; /* at most one can borrow it at any time */
 | 
			
		||||
  nn_mtime_t last_rexmit_ts;
 | 
			
		||||
  unsigned rexmit_count;
 | 
			
		||||
  uint32_t rexmit_count;
 | 
			
		||||
  struct ddsi_serdata *serdata;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -59,12 +59,8 @@ struct whc_idxnode {
 | 
			
		|||
  uint64_t iid;
 | 
			
		||||
  seqno_t prune_seq;
 | 
			
		||||
  struct ddsi_tkmap_instance *tk;
 | 
			
		||||
  unsigned headidx;
 | 
			
		||||
#if __STDC_VERSION__ >= 199901L
 | 
			
		||||
  uint32_t headidx;
 | 
			
		||||
  struct whc_node *hist[];
 | 
			
		||||
#else
 | 
			
		||||
  struct whc_node *hist[1];
 | 
			
		||||
#endif
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if USE_EHH
 | 
			
		||||
| 
						 | 
				
			
			@ -77,14 +73,18 @@ struct whc_seq_entry {
 | 
			
		|||
struct whc_impl {
 | 
			
		||||
  struct whc common;
 | 
			
		||||
  ddsrt_mutex_t lock;
 | 
			
		||||
  unsigned seq_size;
 | 
			
		||||
  uint32_t seq_size;
 | 
			
		||||
  size_t unacked_bytes;
 | 
			
		||||
  size_t sample_overhead;
 | 
			
		||||
  uint32_t fragment_size;
 | 
			
		||||
  uint64_t total_bytes; /* total number of bytes pushed in */
 | 
			
		||||
  unsigned is_transient_local: 1;
 | 
			
		||||
  unsigned hdepth; /* 0 = unlimited */
 | 
			
		||||
  unsigned tldepth; /* 0 = disabled/unlimited (no need to maintain an index if KEEP_ALL <=> is_transient_local + tldepth=0) */
 | 
			
		||||
  unsigned idxdepth; /* = max(hdepth, tldepth) */
 | 
			
		||||
  unsigned xchecks: 1;
 | 
			
		||||
  struct q_globals *gv;
 | 
			
		||||
  struct ddsi_tkmap *tkmap;
 | 
			
		||||
  uint32_t hdepth; /* 0 = unlimited */
 | 
			
		||||
  uint32_t tldepth; /* 0 = disabled/unlimited (no need to maintain an index if KEEP_ALL <=> is_transient_local + tldepth=0) */
 | 
			
		||||
  uint32_t idxdepth; /* = max (hdepth, tldepth) */
 | 
			
		||||
  seqno_t max_drop_seq; /* samples in whc with seq <= max_drop_seq => transient-local */
 | 
			
		||||
  struct whc_intvnode *open_intv; /* interval where next sample will go (usually) */
 | 
			
		||||
  struct whc_node *maxseq_node; /* NULL if empty; if not in open_intv, open_intv is empty */
 | 
			
		||||
| 
						 | 
				
			
			@ -103,14 +103,12 @@ struct whc_sample_iter_impl {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
/* check that our definition of whc_sample_iter fits in the type that callers allocate */
 | 
			
		||||
struct whc_sample_iter_sizecheck {
 | 
			
		||||
  char fits_in_generic_type[sizeof(struct whc_sample_iter_impl) <= sizeof(struct whc_sample_iter) ? 1 : -1];
 | 
			
		||||
};
 | 
			
		||||
DDSRT_STATIC_ASSERT (sizeof (struct whc_sample_iter_impl) <= sizeof (struct whc_sample_iter));
 | 
			
		||||
 | 
			
		||||
/* Hash + interval tree adminitration of samples-by-sequence number
 | 
			
		||||
 * - by definition contains all samples in WHC (unchanged from older versions)
 | 
			
		||||
 * Circular array of samples per instance, inited to all 0
 | 
			
		||||
 * - length is max(durability_service.history_depth, history.depth), KEEP_ALL => as-if 0
 | 
			
		||||
 * - length is max (durability_service.history_depth, history.depth), KEEP_ALL => as-if 0
 | 
			
		||||
 * - no instance index if above length 0
 | 
			
		||||
 * - each sample (i.e., whc_node): backpointer into index
 | 
			
		||||
 * - maintain index of latest sample, end of history then trivially follows from index arithmetic
 | 
			
		||||
| 
						 | 
				
			
			@ -124,18 +122,18 @@ static void insert_whcn_in_hash (struct whc_impl *whc, struct whc_node *whcn);
 | 
			
		|||
static void whc_delete_one (struct whc_impl *whc, struct whc_node *whcn);
 | 
			
		||||
static int compare_seq (const void *va, const void *vb);
 | 
			
		||||
static void free_deferred_free_list (struct whc_node *deferred_free_list);
 | 
			
		||||
static void get_state_locked(const struct whc_impl *whc, struct whc_state *st);
 | 
			
		||||
static void get_state_locked (const struct whc_impl *whc, struct whc_state *st);
 | 
			
		||||
 | 
			
		||||
static unsigned whc_default_remove_acked_messages_full (struct whc_impl *whc, seqno_t max_drop_seq, struct whc_node **deferred_free_list);
 | 
			
		||||
static unsigned whc_default_remove_acked_messages (struct whc *whc, seqno_t max_drop_seq, struct whc_state *whcst, struct whc_node **deferred_free_list);
 | 
			
		||||
static uint32_t whc_default_remove_acked_messages_full (struct whc_impl *whc, seqno_t max_drop_seq, struct whc_node **deferred_free_list);
 | 
			
		||||
static uint32_t whc_default_remove_acked_messages (struct whc *whc, seqno_t max_drop_seq, struct whc_state *whcst, struct whc_node **deferred_free_list);
 | 
			
		||||
static void whc_default_free_deferred_free_list (struct whc *whc, struct whc_node *deferred_free_list);
 | 
			
		||||
static void whc_default_get_state(const struct whc *whc, struct whc_state *st);
 | 
			
		||||
static void whc_default_get_state (const struct whc *whc, struct whc_state *st);
 | 
			
		||||
static int whc_default_insert (struct whc *whc, seqno_t max_drop_seq, seqno_t seq, struct nn_plist *plist, struct ddsi_serdata *serdata, struct ddsi_tkmap_instance *tk);
 | 
			
		||||
static seqno_t whc_default_next_seq (const struct whc *whc, seqno_t seq);
 | 
			
		||||
static bool whc_default_borrow_sample (const struct whc *whc, seqno_t seq, struct whc_borrowed_sample *sample);
 | 
			
		||||
static bool whc_default_borrow_sample_key (const struct whc *whc, const struct ddsi_serdata *serdata_key, struct whc_borrowed_sample *sample);
 | 
			
		||||
static void whc_default_return_sample (struct whc *whc, struct whc_borrowed_sample *sample, bool update_retransmit_info);
 | 
			
		||||
static unsigned whc_default_downgrade_to_volatile (struct whc *whc, struct whc_state *st);
 | 
			
		||||
static uint32_t whc_default_downgrade_to_volatile (struct whc *whc, struct whc_state *st);
 | 
			
		||||
static void whc_default_sample_iter_init (const struct whc *whc, struct whc_sample_iter *opaque_it);
 | 
			
		||||
static bool whc_default_sample_iter_borrow_next (struct whc_sample_iter *opaque_it, struct whc_borrowed_sample *sample);
 | 
			
		||||
static void whc_default_free (struct whc *whc);
 | 
			
		||||
| 
						 | 
				
			
			@ -158,13 +156,15 @@ static const struct whc_ops whc_ops = {
 | 
			
		|||
  .free = whc_default_free
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Number of instantiated WHCs and a global freelist for WHC nodes that gets
 | 
			
		||||
   initialized lazily and cleaned up automatically when the last WHC is freed.
 | 
			
		||||
   Protected by dds_global.m_mutex.
 | 
			
		||||
#define TRACE(...) DDS_CLOG (DDS_LC_WHC, &whc->gv->logconfig, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
   sizeof (whc_node) on 64-bit machines ~ 100 bytes, so this is ~1MB
 | 
			
		||||
   8k entries seems to be roughly the amount needed for minimum samples,
 | 
			
		||||
   maximum message size and a short round-trip time */
 | 
			
		||||
/* Number of instantiated WHCs and a global freelist for WHC nodes that gets
 | 
			
		||||
 initialized lazily and cleaned up automatically when the last WHC is freed.
 | 
			
		||||
 Protected by dds_global.m_mutex.
 | 
			
		||||
 | 
			
		||||
 sizeof (whc_node) on 64-bit machines ~ 100 bytes, so this is ~1MB
 | 
			
		||||
 8k entries seems to be roughly the amount needed for minimum samples,
 | 
			
		||||
 maximum message size and a short round-trip time */
 | 
			
		||||
#define MAX_FREELIST_SIZE 8192
 | 
			
		||||
static uint32_t whc_count;
 | 
			
		||||
static struct nn_freelist whc_node_freelist;
 | 
			
		||||
| 
						 | 
				
			
			@ -175,9 +175,9 @@ static uint32_t whc_seq_entry_hash (const void *vn)
 | 
			
		|||
  const struct whc_seq_entry *n = vn;
 | 
			
		||||
  /* we hash the lower 32 bits, on the assumption that with 4 billion
 | 
			
		||||
   samples in between there won't be significant correlation */
 | 
			
		||||
  const uint64_t c = UINT64_C(16292676669999574021);
 | 
			
		||||
  const uint64_t c = UINT64_C (16292676669999574021);
 | 
			
		||||
  const uint32_t x = (uint32_t) n->seq;
 | 
			
		||||
  return (unsigned) ((x * c) >> 32);
 | 
			
		||||
  return (uint32_t) ((x * c) >> 32);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int whc_seq_entry_eq (const void *va, const void *vb)
 | 
			
		||||
| 
						 | 
				
			
			@ -192,9 +192,9 @@ static uint32_t whc_node_hash (const void *vn)
 | 
			
		|||
  const struct whc_node *n = vn;
 | 
			
		||||
  /* we hash the lower 32 bits, on the assumption that with 4 billion
 | 
			
		||||
   samples in between there won't be significant correlation */
 | 
			
		||||
  const uint64_t c = UINT64_C(16292676669999574021);
 | 
			
		||||
  const uint64_t c = UINT64_C (16292676669999574021);
 | 
			
		||||
  const uint32_t x = (uint32_t) n->seq;
 | 
			
		||||
  return (unsigned) ((x * c) >> 32);
 | 
			
		||||
  return (uint32_t) ((x * c) >> 32);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int whc_node_eq (const void *va, const void *vb)
 | 
			
		||||
| 
						 | 
				
			
			@ -245,10 +245,10 @@ static struct whc_node *whc_findmax_procedurally (const struct whc_impl *whc)
 | 
			
		|||
static void check_whc (const struct whc_impl *whc)
 | 
			
		||||
{
 | 
			
		||||
  /* there's much more we can check, but it gets expensive quite
 | 
			
		||||
     quickly: all nodes but open_intv non-empty, non-overlapping and
 | 
			
		||||
     non-contiguous; min & maxp1 of intervals correct; each interval
 | 
			
		||||
     contiguous; all samples in seq & in seqhash; tlidx \subseteq seq;
 | 
			
		||||
     seq-number ordered list correct; &c. */
 | 
			
		||||
   quickly: all nodes but open_intv non-empty, non-overlapping and
 | 
			
		||||
   non-contiguous; min & maxp1 of intervals correct; each interval
 | 
			
		||||
   contiguous; all samples in seq & in seqhash; tlidx \subseteq seq;
 | 
			
		||||
   seq-number ordered list correct; &c. */
 | 
			
		||||
  assert (whc->open_intv != NULL);
 | 
			
		||||
  assert (whc->open_intv == ddsrt_avl_find_max (&whc_seq_treedef, &whc->seq));
 | 
			
		||||
  assert (ddsrt_avl_find_succ (&whc_seq_treedef, &whc->seq, whc->open_intv) == NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -269,8 +269,8 @@ static void check_whc (const struct whc_impl *whc)
 | 
			
		|||
  }
 | 
			
		||||
  assert (whc->maxseq_node == whc_findmax_procedurally (whc));
 | 
			
		||||
 | 
			
		||||
#if !defined(NDEBUG)
 | 
			
		||||
  if (config.enabled_xchecks & DDS_XCHECK_WHC)
 | 
			
		||||
#if !defined (NDEBUG)
 | 
			
		||||
  if (whc->xchecks)
 | 
			
		||||
  {
 | 
			
		||||
    struct whc_intvnode *firstintv;
 | 
			
		||||
    struct whc_node *cur;
 | 
			
		||||
| 
						 | 
				
			
			@ -295,10 +295,10 @@ static void insert_whcn_in_hash (struct whc_impl *whc, struct whc_node *whcn)
 | 
			
		|||
#if USE_EHH
 | 
			
		||||
  struct whc_seq_entry e = { .seq = whcn->seq, .whcn = whcn };
 | 
			
		||||
  if (!ddsrt_ehh_add (whc->seq_hash, &e))
 | 
			
		||||
    assert(0);
 | 
			
		||||
    assert (0);
 | 
			
		||||
#else
 | 
			
		||||
  if (!ddsrt_hh_add (whc->seq_hash, whcn))
 | 
			
		||||
    assert(0);
 | 
			
		||||
    assert (0);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -307,11 +307,11 @@ static void remove_whcn_from_hash (struct whc_impl *whc, struct whc_node *whcn)
 | 
			
		|||
  /* precondition: whcn is in hash */
 | 
			
		||||
#if USE_EHH
 | 
			
		||||
  struct whc_seq_entry e = { .seq = whcn->seq };
 | 
			
		||||
  if (!ddsrt_ehh_remove(whc->seq_hash, &e))
 | 
			
		||||
    assert(0);
 | 
			
		||||
  if (!ddsrt_ehh_remove (whc->seq_hash, &e))
 | 
			
		||||
    assert (0);
 | 
			
		||||
#else
 | 
			
		||||
  if (!ddsrt_hh_remove(whc->seq_hash, whcn))
 | 
			
		||||
    assert(0);
 | 
			
		||||
  if (!ddsrt_hh_remove (whc->seq_hash, whcn))
 | 
			
		||||
    assert (0);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -319,14 +319,14 @@ static struct whc_node *whc_findseq (const struct whc_impl *whc, seqno_t seq)
 | 
			
		|||
{
 | 
			
		||||
#if USE_EHH
 | 
			
		||||
  struct whc_seq_entry e = { .seq = seq }, *r;
 | 
			
		||||
  if ((r = ddsrt_ehh_lookup(whc->seq_hash, &e)) != NULL)
 | 
			
		||||
  if ((r = ddsrt_ehh_lookup (whc->seq_hash, &e)) != NULL)
 | 
			
		||||
    return r->whcn;
 | 
			
		||||
  else
 | 
			
		||||
    return NULL;
 | 
			
		||||
#else
 | 
			
		||||
  struct whc_node template;
 | 
			
		||||
  template.seq = seq;
 | 
			
		||||
  return ddsrt_hh_lookup(whc->seq_hash, &template);
 | 
			
		||||
  return ddsrt_hh_lookup (whc->seq_hash, &template);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -334,11 +334,11 @@ static struct whc_node *whc_findkey (const struct whc_impl *whc, const struct dd
 | 
			
		|||
{
 | 
			
		||||
  union {
 | 
			
		||||
    struct whc_idxnode idxn;
 | 
			
		||||
    char pad[sizeof(struct whc_idxnode) + sizeof(struct whc_node *)];
 | 
			
		||||
    char pad[sizeof (struct whc_idxnode) + sizeof (struct whc_node *)];
 | 
			
		||||
  } template;
 | 
			
		||||
  struct whc_idxnode *n;
 | 
			
		||||
  check_whc (whc);
 | 
			
		||||
  template.idxn.iid = ddsi_tkmap_lookup(gv.m_tkmap, serdata_key);
 | 
			
		||||
  template.idxn.iid = ddsi_tkmap_lookup (whc->tkmap, serdata_key);
 | 
			
		||||
  n = ddsrt_hh_lookup (whc->idx_hash, &template.idxn);
 | 
			
		||||
  if (n == NULL)
 | 
			
		||||
    return NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -349,18 +349,21 @@ static struct whc_node *whc_findkey (const struct whc_impl *whc, const struct dd
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct whc *whc_new (int is_transient_local, unsigned hdepth, unsigned tldepth)
 | 
			
		||||
struct whc *whc_new (struct q_globals *gv, int is_transient_local, uint32_t hdepth, uint32_t tldepth)
 | 
			
		||||
{
 | 
			
		||||
  size_t sample_overhead = 80; /* INFO_TS, DATA (estimate), inline QoS */
 | 
			
		||||
  struct whc_impl *whc;
 | 
			
		||||
  struct whc_intvnode *intv;
 | 
			
		||||
 | 
			
		||||
  assert((hdepth == 0 || tldepth <= hdepth) || is_transient_local);
 | 
			
		||||
  assert ((hdepth == 0 || tldepth <= hdepth) || is_transient_local);
 | 
			
		||||
 | 
			
		||||
  whc = ddsrt_malloc (sizeof (*whc));
 | 
			
		||||
  whc->common.ops = &whc_ops;
 | 
			
		||||
  ddsrt_mutex_init (&whc->lock);
 | 
			
		||||
  whc->is_transient_local = is_transient_local ? 1 : 0;
 | 
			
		||||
  whc->xchecks = (gv->config.enabled_xchecks & DDS_XCHECK_WHC) != 0;
 | 
			
		||||
  whc->gv = gv;
 | 
			
		||||
  whc->tkmap = gv->m_tkmap;
 | 
			
		||||
  whc->hdepth = hdepth;
 | 
			
		||||
  whc->tldepth = tldepth;
 | 
			
		||||
  whc->idxdepth = hdepth > tldepth ? hdepth : tldepth;
 | 
			
		||||
| 
						 | 
				
			
			@ -369,14 +372,15 @@ struct whc *whc_new (int is_transient_local, unsigned hdepth, unsigned tldepth)
 | 
			
		|||
  whc->unacked_bytes = 0;
 | 
			
		||||
  whc->total_bytes = 0;
 | 
			
		||||
  whc->sample_overhead = sample_overhead;
 | 
			
		||||
  whc->fragment_size = gv->config.fragment_size;
 | 
			
		||||
#if USE_EHH
 | 
			
		||||
  whc->seq_hash = ddsrt_ehh_new (sizeof (struct whc_seq_entry), 32, whc_seq_entry_hash, whc_seq_entry_eq);
 | 
			
		||||
#else
 | 
			
		||||
  whc->seq_hash = ddsrt_hh_new(32, whc_node_hash, whc_node_eq);
 | 
			
		||||
  whc->seq_hash = ddsrt_hh_new (1, whc_node_hash, whc_node_eq);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  if (whc->idxdepth > 0)
 | 
			
		||||
    whc->idx_hash = ddsrt_hh_new(32, whc_idxnode_hash_key, whc_idxnode_eq_key);
 | 
			
		||||
    whc->idx_hash = ddsrt_hh_new (1, whc_idxnode_hash_key, whc_idxnode_eq_key);
 | 
			
		||||
  else
 | 
			
		||||
    whc->idx_hash = NULL;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -417,9 +421,9 @@ void whc_default_free (struct whc *whc_generic)
 | 
			
		|||
  {
 | 
			
		||||
    struct ddsrt_hh_iter it;
 | 
			
		||||
    struct whc_idxnode *n;
 | 
			
		||||
    for (n = ddsrt_hh_iter_first(whc->idx_hash, &it); n != NULL; n = ddsrt_hh_iter_next(&it))
 | 
			
		||||
      ddsrt_free(n);
 | 
			
		||||
    ddsrt_hh_free(whc->idx_hash);
 | 
			
		||||
    for (n = ddsrt_hh_iter_first (whc->idx_hash, &it); n != NULL; n = ddsrt_hh_iter_next (&it))
 | 
			
		||||
      ddsrt_free (n);
 | 
			
		||||
    ddsrt_hh_free (whc->idx_hash);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -427,10 +431,10 @@ void whc_default_free (struct whc *whc_generic)
 | 
			
		|||
    while (whcn)
 | 
			
		||||
    {
 | 
			
		||||
      struct whc_node *tmp = whcn;
 | 
			
		||||
/* The compiler doesn't realize that whcn->prev_seq is always initialized. */
 | 
			
		||||
DDSRT_WARNING_MSVC_OFF(6001);
 | 
			
		||||
      /* The compiler doesn't realize that whcn->prev_seq is always initialized. */
 | 
			
		||||
      DDSRT_WARNING_MSVC_OFF (6001);
 | 
			
		||||
      whcn = whcn->prev_seq;
 | 
			
		||||
DDSRT_WARNING_MSVC_ON(6001);
 | 
			
		||||
      DDSRT_WARNING_MSVC_ON (6001);
 | 
			
		||||
      free_whc_node_contents (tmp);
 | 
			
		||||
      ddsrt_free (tmp);
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -452,7 +456,7 @@ DDSRT_WARNING_MSVC_ON(6001);
 | 
			
		|||
  ddsrt_free (whc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void get_state_locked(const struct whc_impl *whc, struct whc_state *st)
 | 
			
		||||
static void get_state_locked (const struct whc_impl *whc, struct whc_state *st)
 | 
			
		||||
{
 | 
			
		||||
  if (whc->seq_size == 0)
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -473,12 +477,12 @@ static void get_state_locked(const struct whc_impl *whc, struct whc_state *st)
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void whc_default_get_state(const struct whc *whc_generic, struct whc_state *st)
 | 
			
		||||
static void whc_default_get_state (const struct whc *whc_generic, struct whc_state *st)
 | 
			
		||||
{
 | 
			
		||||
  const struct whc_impl * const whc = (const struct whc_impl *)whc_generic;
 | 
			
		||||
  ddsrt_mutex_lock ((ddsrt_mutex_t *)&whc->lock);
 | 
			
		||||
  check_whc (whc);
 | 
			
		||||
  get_state_locked(whc, st);
 | 
			
		||||
  get_state_locked (whc, st);
 | 
			
		||||
  ddsrt_mutex_unlock ((ddsrt_mutex_t *)&whc->lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -489,8 +493,8 @@ static struct whc_node *find_nextseq_intv (struct whc_intvnode **p_intv, const s
 | 
			
		|||
  if ((n = whc_findseq (whc, seq)) == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    /* don't know seq => lookup interval with min > seq (intervals are
 | 
			
		||||
       contiguous, so if we don't know seq, an interval [X,Y) with X <
 | 
			
		||||
       SEQ < Y can't exist */
 | 
			
		||||
     contiguous, so if we don't know seq, an interval [X,Y) with X <
 | 
			
		||||
     SEQ < Y can't exist */
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
    {
 | 
			
		||||
      struct whc_intvnode *predintv = ddsrt_avl_lookup_pred_eq (&whc_seq_treedef, &whc->seq, &seq);
 | 
			
		||||
| 
						 | 
				
			
			@ -551,13 +555,12 @@ static void delete_one_sample_from_idx (struct whc_impl *whc, struct whc_node *w
 | 
			
		|||
  else
 | 
			
		||||
  {
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
    unsigned i;
 | 
			
		||||
    for (i = 0; i < whc->idxdepth; i++)
 | 
			
		||||
    for (uint32_t i = 0; i < whc->idxdepth; i++)
 | 
			
		||||
      assert (i == idxn->headidx || idxn->hist[i] == NULL);
 | 
			
		||||
#endif
 | 
			
		||||
    if (!ddsrt_hh_remove (whc->idx_hash, idxn))
 | 
			
		||||
      assert (0);
 | 
			
		||||
    ddsi_tkmap_instance_unref(idxn->tk);
 | 
			
		||||
    ddsi_tkmap_instance_unref (whc->tkmap, idxn->tk);
 | 
			
		||||
    ddsrt_free (idxn);
 | 
			
		||||
  }
 | 
			
		||||
  whcn->idxnode = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -565,8 +568,7 @@ static void delete_one_sample_from_idx (struct whc_impl *whc, struct whc_node *w
 | 
			
		|||
 | 
			
		||||
static void free_one_instance_from_idx (struct whc_impl *whc, seqno_t max_drop_seq, struct whc_idxnode *idxn)
 | 
			
		||||
{
 | 
			
		||||
  unsigned i;
 | 
			
		||||
  for (i = 0; i < whc->idxdepth; i++)
 | 
			
		||||
  for (uint32_t i = 0; i < whc->idxdepth; i++)
 | 
			
		||||
  {
 | 
			
		||||
    if (idxn->hist[i])
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -574,13 +576,13 @@ static void free_one_instance_from_idx (struct whc_impl *whc, seqno_t max_drop_s
 | 
			
		|||
      oldn->idxnode = NULL;
 | 
			
		||||
      if (oldn->seq <= max_drop_seq)
 | 
			
		||||
      {
 | 
			
		||||
        DDS_LOG(DDS_LC_WHC, "  prune tl whcn %p\n", (void *)oldn);
 | 
			
		||||
        assert(oldn != whc->maxseq_node);
 | 
			
		||||
        TRACE ("  prune tl whcn %p\n", (void *)oldn);
 | 
			
		||||
        assert (oldn != whc->maxseq_node);
 | 
			
		||||
        whc_delete_one (whc, oldn);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_free(idxn);
 | 
			
		||||
  ddsrt_free (idxn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void delete_one_instance_from_idx (struct whc_impl *whc, seqno_t max_drop_seq, struct whc_idxnode *idxn)
 | 
			
		||||
| 
						 | 
				
			
			@ -590,34 +592,34 @@ static void delete_one_instance_from_idx (struct whc_impl *whc, seqno_t max_drop
 | 
			
		|||
  free_one_instance_from_idx (whc, max_drop_seq, idxn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int whcn_in_tlidx (const struct whc_impl *whc, const struct whc_idxnode *idxn, unsigned pos)
 | 
			
		||||
static int whcn_in_tlidx (const struct whc_impl *whc, const struct whc_idxnode *idxn, uint32_t pos)
 | 
			
		||||
{
 | 
			
		||||
  if (idxn == NULL)
 | 
			
		||||
    return 0;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    unsigned d = (idxn->headidx + (pos > idxn->headidx ? whc->idxdepth : 0)) - pos;
 | 
			
		||||
    uint32_t d = (idxn->headidx + (pos > idxn->headidx ? whc->idxdepth : 0)) - pos;
 | 
			
		||||
    assert (d < whc->idxdepth);
 | 
			
		||||
    return d < whc->tldepth;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned whc_default_downgrade_to_volatile (struct whc *whc_generic, struct whc_state *st)
 | 
			
		||||
static uint32_t whc_default_downgrade_to_volatile (struct whc *whc_generic, struct whc_state *st)
 | 
			
		||||
{
 | 
			
		||||
  struct whc_impl * const whc = (struct whc_impl *)whc_generic;
 | 
			
		||||
  seqno_t old_max_drop_seq;
 | 
			
		||||
  struct whc_node *deferred_free_list;
 | 
			
		||||
  unsigned cnt;
 | 
			
		||||
  uint32_t cnt;
 | 
			
		||||
 | 
			
		||||
  /* We only remove them from whc->tlidx: we don't remove them from
 | 
			
		||||
     whc->seq yet.  That'll happen eventually.  */
 | 
			
		||||
   whc->seq yet.  That'll happen eventually.  */
 | 
			
		||||
  ddsrt_mutex_lock (&whc->lock);
 | 
			
		||||
  check_whc (whc);
 | 
			
		||||
 | 
			
		||||
  if (whc->idxdepth == 0)
 | 
			
		||||
  {
 | 
			
		||||
    /* if not maintaining an index at all, this is nonsense */
 | 
			
		||||
    get_state_locked(whc, st);
 | 
			
		||||
    get_state_locked (whc, st);
 | 
			
		||||
    ddsrt_mutex_unlock (&whc->lock);
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -625,29 +627,29 @@ static unsigned whc_default_downgrade_to_volatile (struct whc *whc_generic, stru
 | 
			
		|||
  assert (!whc->is_transient_local);
 | 
			
		||||
  if (whc->tldepth > 0)
 | 
			
		||||
  {
 | 
			
		||||
    assert(whc->hdepth == 0 || whc->tldepth <= whc->hdepth);
 | 
			
		||||
    assert (whc->hdepth == 0 || whc->tldepth <= whc->hdepth);
 | 
			
		||||
    whc->tldepth = 0;
 | 
			
		||||
    if (whc->hdepth == 0)
 | 
			
		||||
    {
 | 
			
		||||
      struct ddsrt_hh_iter it;
 | 
			
		||||
      struct whc_idxnode *n;
 | 
			
		||||
      for (n = ddsrt_hh_iter_first(whc->idx_hash, &it); n != NULL; n = ddsrt_hh_iter_next(&it))
 | 
			
		||||
      for (n = ddsrt_hh_iter_first (whc->idx_hash, &it); n != NULL; n = ddsrt_hh_iter_next (&it))
 | 
			
		||||
        free_one_instance_from_idx (whc, 0, n);
 | 
			
		||||
      ddsrt_hh_free(whc->idx_hash);
 | 
			
		||||
      ddsrt_hh_free (whc->idx_hash);
 | 
			
		||||
      whc->idxdepth = 0;
 | 
			
		||||
      whc->idx_hash = NULL;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* Immediately drop them from the WHC (used to delay it until the
 | 
			
		||||
     next ack); but need to make sure remove_acked_messages processes
 | 
			
		||||
     them all. */
 | 
			
		||||
   next ack); but need to make sure remove_acked_messages processes
 | 
			
		||||
   them all. */
 | 
			
		||||
  old_max_drop_seq = whc->max_drop_seq;
 | 
			
		||||
  whc->max_drop_seq = 0;
 | 
			
		||||
  cnt = whc_default_remove_acked_messages_full (whc, old_max_drop_seq, &deferred_free_list);
 | 
			
		||||
  whc_default_free_deferred_free_list (whc_generic, deferred_free_list);
 | 
			
		||||
  assert (whc->max_drop_seq == old_max_drop_seq);
 | 
			
		||||
  get_state_locked(whc, st);
 | 
			
		||||
  get_state_locked (whc, st);
 | 
			
		||||
  ddsrt_mutex_unlock (&whc->lock);
 | 
			
		||||
  return cnt;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -655,20 +657,20 @@ static unsigned whc_default_downgrade_to_volatile (struct whc *whc_generic, stru
 | 
			
		|||
static size_t whcn_size (const struct whc_impl *whc, const struct whc_node *whcn)
 | 
			
		||||
{
 | 
			
		||||
  size_t sz = ddsi_serdata_size (whcn->serdata);
 | 
			
		||||
  return sz + ((sz + config.fragment_size - 1) / config.fragment_size) * whc->sample_overhead;
 | 
			
		||||
  return sz + ((sz + whc->fragment_size - 1) / whc->fragment_size) * whc->sample_overhead;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void whc_delete_one_intv (struct whc_impl *whc, struct whc_intvnode **p_intv, struct whc_node **p_whcn)
 | 
			
		||||
{
 | 
			
		||||
  /* Removes *p_whcn, possibly deleting or splitting *p_intv, as the
 | 
			
		||||
     case may be.  Does *NOT* update whc->seq_size.  *p_intv must be
 | 
			
		||||
     the interval containing *p_whcn (&& both must actually exist).
 | 
			
		||||
   case may be.  Does *NOT* update whc->seq_size.  *p_intv must be
 | 
			
		||||
   the interval containing *p_whcn (&& both must actually exist).
 | 
			
		||||
 | 
			
		||||
     Returns:
 | 
			
		||||
     - 0 if delete failed (only possible cause is memory exhaustion),
 | 
			
		||||
     in which case *p_intv & *p_whcn are undefined;
 | 
			
		||||
     - 1 if successful, in which case *p_intv & *p_whcn are set
 | 
			
		||||
     correctly for the next sample in sequence number order */
 | 
			
		||||
   Returns:
 | 
			
		||||
   - 0 if delete failed (only possible cause is memory exhaustion),
 | 
			
		||||
   in which case *p_intv & *p_whcn are undefined;
 | 
			
		||||
   - 1 if successful, in which case *p_intv & *p_whcn are set
 | 
			
		||||
   correctly for the next sample in sequence number order */
 | 
			
		||||
  struct whc_intvnode *intv = *p_intv;
 | 
			
		||||
  struct whc_node *whcn = *p_whcn;
 | 
			
		||||
  assert (whcn->seq >= intv->min && whcn->seq < intv->maxp1);
 | 
			
		||||
| 
						 | 
				
			
			@ -685,13 +687,13 @@ static void whc_delete_one_intv (struct whc_impl *whc, struct whc_intvnode **p_i
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  /* Take it out of seqhash; deleting it from the list ordered on
 | 
			
		||||
     sequence numbers is left to the caller (it has to be done unconditionally,
 | 
			
		||||
     but remove_acked_messages defers it until the end or a skipped node). */
 | 
			
		||||
   sequence numbers is left to the caller (it has to be done unconditionally,
 | 
			
		||||
   but remove_acked_messages defers it until the end or a skipped node). */
 | 
			
		||||
  remove_whcn_from_hash (whc, whcn);
 | 
			
		||||
 | 
			
		||||
  /* We may have introduced a hole & have to split the interval
 | 
			
		||||
     node, or we may have nibbled of the first one, or even the
 | 
			
		||||
     last one. */
 | 
			
		||||
   node, or we may have nibbled of the first one, or even the
 | 
			
		||||
   last one. */
 | 
			
		||||
  if (whcn == intv->first)
 | 
			
		||||
  {
 | 
			
		||||
    if (whcn == intv->last && intv != whc->open_intv)
 | 
			
		||||
| 
						 | 
				
			
			@ -714,7 +716,7 @@ static void whc_delete_one_intv (struct whc_impl *whc, struct whc_intvnode **p_i
 | 
			
		|||
  else if (whcn == intv->last)
 | 
			
		||||
  {
 | 
			
		||||
    /* well, at least it isn't the first one & so the interval is
 | 
			
		||||
       still non-empty and we don't have to drop the interval */
 | 
			
		||||
     still non-empty and we don't have to drop the interval */
 | 
			
		||||
    assert (intv->min < whcn->seq);
 | 
			
		||||
    assert (whcn->prev_seq);
 | 
			
		||||
    assert (whcn->prev_seq->seq + 1 == whcn->seq);
 | 
			
		||||
| 
						 | 
				
			
			@ -725,9 +727,9 @@ static void whc_delete_one_intv (struct whc_impl *whc, struct whc_intvnode **p_i
 | 
			
		|||
  else
 | 
			
		||||
  {
 | 
			
		||||
    /* somewhere in the middle => split the interval (ideally,
 | 
			
		||||
       would split it lazily, but it really is a transient-local
 | 
			
		||||
       issue only, and so we can (for now) get away with splitting
 | 
			
		||||
       it greedily */
 | 
			
		||||
     would split it lazily, but it really is a transient-local
 | 
			
		||||
     issue only, and so we can (for now) get away with splitting
 | 
			
		||||
     it greedily */
 | 
			
		||||
    struct whc_intvnode *new_intv;
 | 
			
		||||
    ddsrt_avl_ipath_t path;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -746,7 +748,7 @@ static void whc_delete_one_intv (struct whc_impl *whc, struct whc_intvnode **p_i
 | 
			
		|||
    assert (new_intv->min < new_intv->maxp1);
 | 
			
		||||
 | 
			
		||||
    /* insert new node & continue the loop with intv set to the
 | 
			
		||||
       new interval */
 | 
			
		||||
    new interval */
 | 
			
		||||
    if (ddsrt_avl_lookup_ipath (&whc_seq_treedef, &whc->seq, &new_intv->min, &path) != NULL)
 | 
			
		||||
      assert (0);
 | 
			
		||||
    ddsrt_avl_insert_ipath (&whc_seq_treedef, &whc->seq, new_intv, &path);
 | 
			
		||||
| 
						 | 
				
			
			@ -801,11 +803,11 @@ static void whc_default_free_deferred_free_list (struct whc *whc_generic, struct
 | 
			
		|||
  free_deferred_free_list (deferred_free_list);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned whc_default_remove_acked_messages_noidx (struct whc_impl *whc, seqno_t max_drop_seq, struct whc_node **deferred_free_list)
 | 
			
		||||
static uint32_t whc_default_remove_acked_messages_noidx (struct whc_impl *whc, seqno_t max_drop_seq, struct whc_node **deferred_free_list)
 | 
			
		||||
{
 | 
			
		||||
  struct whc_intvnode *intv;
 | 
			
		||||
  struct whc_node *whcn;
 | 
			
		||||
  unsigned ndropped = 0;
 | 
			
		||||
  uint32_t ndropped = 0;
 | 
			
		||||
 | 
			
		||||
  /* In the trivial case of an empty WHC, get out quickly */
 | 
			
		||||
  if (max_drop_seq <= whc->max_drop_seq || whc->maxseq_node == NULL)
 | 
			
		||||
| 
						 | 
				
			
			@ -817,7 +819,7 @@ static unsigned whc_default_remove_acked_messages_noidx (struct whc_impl *whc, s
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  /* If simple, we have always dropped everything up to whc->max_drop_seq,
 | 
			
		||||
     and there can only be a single interval */
 | 
			
		||||
   and there can only be a single interval */
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
  whcn = find_nextseq_intv (&intv, whc, whc->max_drop_seq);
 | 
			
		||||
  assert (whcn == NULL || whcn->prev_seq == NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -826,14 +828,14 @@ static unsigned whc_default_remove_acked_messages_noidx (struct whc_impl *whc, s
 | 
			
		|||
  intv = whc->open_intv;
 | 
			
		||||
 | 
			
		||||
  /* Drop everything up to and including max_drop_seq, or absent that one,
 | 
			
		||||
     the highest available sequence number (which then must be less) */
 | 
			
		||||
   the highest available sequence number (which then must be less) */
 | 
			
		||||
  if ((whcn = whc_findseq (whc, max_drop_seq)) == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    if (max_drop_seq < intv->min)
 | 
			
		||||
    {
 | 
			
		||||
      /* at startup, whc->max_drop_seq = 0 and reader states have max ack'd seq taken from wr->seq;
 | 
			
		||||
         so if multiple readers are matched and the writer runs ahead of the readers, for the first
 | 
			
		||||
         ack, whc->max_drop_seq < max_drop_seq = MIN(readers max ack) < intv->min */
 | 
			
		||||
       so if multiple readers are matched and the writer runs ahead of the readers, for the first
 | 
			
		||||
       ack, whc->max_drop_seq < max_drop_seq = MIN (readers max ack) < intv->min */
 | 
			
		||||
      if (max_drop_seq > whc->max_drop_seq)
 | 
			
		||||
        whc->max_drop_seq = max_drop_seq;
 | 
			
		||||
      *deferred_free_list = NULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -847,7 +849,7 @@ static unsigned whc_default_remove_acked_messages_noidx (struct whc_impl *whc, s
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  *deferred_free_list = intv->first;
 | 
			
		||||
  ndropped = (unsigned) (whcn->seq - intv->min + 1);
 | 
			
		||||
  ndropped = (uint32_t) (whcn->seq - intv->min + 1);
 | 
			
		||||
 | 
			
		||||
  intv->first = whcn->next_seq;
 | 
			
		||||
  intv->min = max_drop_seq + 1;
 | 
			
		||||
| 
						 | 
				
			
			@ -877,18 +879,18 @@ static unsigned whc_default_remove_acked_messages_noidx (struct whc_impl *whc, s
 | 
			
		|||
  return ndropped;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned whc_default_remove_acked_messages_full (struct whc_impl *whc, seqno_t max_drop_seq, struct whc_node **deferred_free_list)
 | 
			
		||||
static uint32_t whc_default_remove_acked_messages_full (struct whc_impl *whc, seqno_t max_drop_seq, struct whc_node **deferred_free_list)
 | 
			
		||||
{
 | 
			
		||||
  struct whc_intvnode *intv;
 | 
			
		||||
  struct whc_node *whcn;
 | 
			
		||||
  struct whc_node *prev_seq;
 | 
			
		||||
  struct whc_node deferred_list_head, *last_to_free = &deferred_list_head;
 | 
			
		||||
  unsigned ndropped = 0;
 | 
			
		||||
  uint32_t ndropped = 0;
 | 
			
		||||
 | 
			
		||||
  if (whc->is_transient_local && whc->tldepth == 0)
 | 
			
		||||
  {
 | 
			
		||||
    /* KEEP_ALL on transient local, so we can never ever delete anything */
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "  KEEP_ALL transient-local: do nothing\n");
 | 
			
		||||
    TRACE ("  KEEP_ALL transient-local: do nothing\n");
 | 
			
		||||
    *deferred_free_list = NULL;
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -898,11 +900,11 @@ static unsigned whc_default_remove_acked_messages_full (struct whc_impl *whc, se
 | 
			
		|||
  prev_seq = whcn ? whcn->prev_seq : NULL;
 | 
			
		||||
  while (whcn && whcn->seq <= max_drop_seq)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "  whcn %p %"PRId64, (void *) whcn, whcn->seq);
 | 
			
		||||
    if (whcn_in_tlidx(whc, whcn->idxnode, whcn->idxnode_pos))
 | 
			
		||||
    TRACE ("  whcn %p %"PRId64, (void *) whcn, whcn->seq);
 | 
			
		||||
    if (whcn_in_tlidx (whc, whcn->idxnode, whcn->idxnode_pos))
 | 
			
		||||
    {
 | 
			
		||||
      /* quickly skip over samples in tlidx */
 | 
			
		||||
      DDS_LOG(DDS_LC_WHC, " tl:keep");
 | 
			
		||||
      TRACE (" tl:keep");
 | 
			
		||||
      if (whcn->unacked)
 | 
			
		||||
      {
 | 
			
		||||
        assert (whc->unacked_bytes >= whcn->size);
 | 
			
		||||
| 
						 | 
				
			
			@ -920,13 +922,13 @@ static unsigned whc_default_remove_acked_messages_full (struct whc_impl *whc, se
 | 
			
		|||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      DDS_LOG(DDS_LC_WHC, " delete");
 | 
			
		||||
      TRACE (" delete");
 | 
			
		||||
      last_to_free->next_seq = whcn;
 | 
			
		||||
      last_to_free = last_to_free->next_seq;
 | 
			
		||||
      whc_delete_one_intv (whc, &intv, &whcn);
 | 
			
		||||
      ndropped++;
 | 
			
		||||
    }
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "\n");
 | 
			
		||||
    TRACE ("\n");
 | 
			
		||||
  }
 | 
			
		||||
  if (prev_seq)
 | 
			
		||||
    prev_seq->next_seq = whcn;
 | 
			
		||||
| 
						 | 
				
			
			@ -936,32 +938,32 @@ static unsigned whc_default_remove_acked_messages_full (struct whc_impl *whc, se
 | 
			
		|||
  *deferred_free_list = deferred_list_head.next_seq;
 | 
			
		||||
 | 
			
		||||
  /* If the history is deeper than durability_service.history (but not KEEP_ALL), then there
 | 
			
		||||
     may be old samples in this instance, samples that were retained because they were within
 | 
			
		||||
     the T-L history but that are not anymore. Writing new samples will eventually push these
 | 
			
		||||
     out, but if the difference is large and the update rate low, it may take a long time.
 | 
			
		||||
     Thus, we had better prune them. */
 | 
			
		||||
   may be old samples in this instance, samples that were retained because they were within
 | 
			
		||||
   the T-L history but that are not anymore. Writing new samples will eventually push these
 | 
			
		||||
   out, but if the difference is large and the update rate low, it may take a long time.
 | 
			
		||||
   Thus, we had better prune them. */
 | 
			
		||||
  if (whc->tldepth > 0 && whc->idxdepth > whc->tldepth)
 | 
			
		||||
  {
 | 
			
		||||
    assert(whc->hdepth == whc->idxdepth);
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "  idxdepth %u > tldepth %u > 0 -- must prune\n", whc->idxdepth, whc->tldepth);
 | 
			
		||||
    assert (whc->hdepth == whc->idxdepth);
 | 
			
		||||
    TRACE ("  idxdepth %"PRIu32" > tldepth %"PRIu32" > 0 -- must prune\n", whc->idxdepth, whc->tldepth);
 | 
			
		||||
 | 
			
		||||
    /* Do a second pass over the sequence number range we just processed: this time we only
 | 
			
		||||
       encounter samples that were retained because of the transient-local durability setting
 | 
			
		||||
       (the rest has been dropped already) and we prune old samples in the instance */
 | 
			
		||||
     encounter samples that were retained because of the transient-local durability setting
 | 
			
		||||
     (the rest has been dropped already) and we prune old samples in the instance */
 | 
			
		||||
    whcn = find_nextseq_intv (&intv, whc, whc->max_drop_seq);
 | 
			
		||||
    while (whcn && whcn->seq <= max_drop_seq)
 | 
			
		||||
    {
 | 
			
		||||
      struct whc_idxnode * const idxn = whcn->idxnode;
 | 
			
		||||
      unsigned cnt, idx;
 | 
			
		||||
      uint32_t cnt, idx;
 | 
			
		||||
 | 
			
		||||
      DDS_LOG(DDS_LC_WHC, "  whcn %p %"PRId64" idxn %p prune_seq %"PRId64":", (void *)whcn, whcn->seq, (void *)idxn, idxn->prune_seq);
 | 
			
		||||
      TRACE ("  whcn %p %"PRId64" idxn %p prune_seq %"PRId64":", (void *) whcn, whcn->seq, (void *) idxn, idxn->prune_seq);
 | 
			
		||||
 | 
			
		||||
      assert(whcn_in_tlidx(whc, idxn, whcn->idxnode_pos));
 | 
			
		||||
      assert (whcn_in_tlidx (whc, idxn, whcn->idxnode_pos));
 | 
			
		||||
      assert (idxn->prune_seq <= max_drop_seq);
 | 
			
		||||
 | 
			
		||||
      if (idxn->prune_seq == max_drop_seq)
 | 
			
		||||
      {
 | 
			
		||||
        DDS_LOG(DDS_LC_WHC, " already pruned\n");
 | 
			
		||||
        TRACE (" already pruned\n");
 | 
			
		||||
        whcn = whcn->next_seq;
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -977,27 +979,27 @@ static unsigned whc_default_remove_acked_messages_full (struct whc_impl *whc, se
 | 
			
		|||
        if ((oldn = idxn->hist[idx]) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          /* Delete it - but this may not result in deleting the index node as
 | 
			
		||||
             there must still be a more recent one available */
 | 
			
		||||
           there must still be a more recent one available */
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
          struct whc_node whcn_template;
 | 
			
		||||
          union {
 | 
			
		||||
            struct whc_idxnode idxn;
 | 
			
		||||
            char pad[sizeof(struct whc_idxnode) + sizeof(struct whc_node *)];
 | 
			
		||||
            char pad[sizeof (struct whc_idxnode) + sizeof (struct whc_node *)];
 | 
			
		||||
          } template;
 | 
			
		||||
          template.idxn.headidx = 0;
 | 
			
		||||
          template.idxn.hist[0] = &whcn_template;
 | 
			
		||||
          whcn_template.serdata = ddsi_serdata_ref(oldn->serdata);
 | 
			
		||||
          assert(oldn->seq < whcn->seq);
 | 
			
		||||
          whcn_template.serdata = ddsi_serdata_ref (oldn->serdata);
 | 
			
		||||
          assert (oldn->seq < whcn->seq);
 | 
			
		||||
#endif
 | 
			
		||||
          DDS_LOG(DDS_LC_WHC, " del %p %"PRId64, (void *) oldn, oldn->seq);
 | 
			
		||||
          TRACE (" del %p %"PRId64, (void *) oldn, oldn->seq);
 | 
			
		||||
          whc_delete_one (whc, oldn);
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
          assert(ddsrt_hh_lookup(whc->idx_hash, &template) == idxn);
 | 
			
		||||
          ddsi_serdata_unref(whcn_template.serdata);
 | 
			
		||||
          assert (ddsrt_hh_lookup (whc->idx_hash, &template) == idxn);
 | 
			
		||||
          ddsi_serdata_unref (whcn_template.serdata);
 | 
			
		||||
#endif
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      DDS_LOG(DDS_LC_WHC, "\n");
 | 
			
		||||
      TRACE ("\n");
 | 
			
		||||
      whcn = whcn->next_seq;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1011,22 +1013,22 @@ static unsigned whc_default_remove_acked_messages_full (struct whc_impl *whc, se
 | 
			
		|||
  return ndropped;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned whc_default_remove_acked_messages (struct whc *whc_generic, seqno_t max_drop_seq, struct whc_state *whcst, struct whc_node **deferred_free_list)
 | 
			
		||||
static uint32_t whc_default_remove_acked_messages (struct whc *whc_generic, seqno_t max_drop_seq, struct whc_state *whcst, struct whc_node **deferred_free_list)
 | 
			
		||||
{
 | 
			
		||||
  struct whc_impl * const whc = (struct whc_impl *)whc_generic;
 | 
			
		||||
  unsigned cnt;
 | 
			
		||||
  uint32_t cnt;
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&whc->lock);
 | 
			
		||||
  assert (max_drop_seq < MAX_SEQ_NUMBER);
 | 
			
		||||
  assert (max_drop_seq >= whc->max_drop_seq);
 | 
			
		||||
 | 
			
		||||
  if (dds_get_log_mask() & DDS_LC_WHC)
 | 
			
		||||
  if (whc->gv->logconfig.c.mask & DDS_LC_WHC)
 | 
			
		||||
  {
 | 
			
		||||
    struct whc_state tmp;
 | 
			
		||||
    get_state_locked(whc, &tmp);
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "whc_default_remove_acked_messages(%p max_drop_seq %"PRId64")\n", (void *)whc, max_drop_seq);
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "  whc: [%"PRId64",%"PRId64"] max_drop_seq %"PRId64" h %u tl %u\n",
 | 
			
		||||
               tmp.min_seq, tmp.max_seq, whc->max_drop_seq, whc->hdepth, whc->tldepth);
 | 
			
		||||
    get_state_locked (whc, &tmp);
 | 
			
		||||
    TRACE ("whc_default_remove_acked_messages(%p max_drop_seq %"PRId64")\n", (void *)whc, max_drop_seq);
 | 
			
		||||
    TRACE ("  whc: [%"PRId64",%"PRId64"] max_drop_seq %"PRId64" h %"PRIu32" tl %"PRIu32"\n",
 | 
			
		||||
           tmp.min_seq, tmp.max_seq, whc->max_drop_seq, whc->hdepth, whc->tldepth);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  check_whc (whc);
 | 
			
		||||
| 
						 | 
				
			
			@ -1035,7 +1037,7 @@ static unsigned whc_default_remove_acked_messages (struct whc *whc_generic, seqn
 | 
			
		|||
    cnt = whc_default_remove_acked_messages_noidx (whc, max_drop_seq, deferred_free_list);
 | 
			
		||||
  else
 | 
			
		||||
    cnt = whc_default_remove_acked_messages_full (whc, max_drop_seq, deferred_free_list);
 | 
			
		||||
  get_state_locked(whc, whcst);
 | 
			
		||||
  get_state_locked (whc, whcst);
 | 
			
		||||
  ddsrt_mutex_unlock (&whc->lock);
 | 
			
		||||
  return cnt;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1108,38 +1110,39 @@ static int whc_default_insert (struct whc *whc_generic, seqno_t max_drop_seq, se
 | 
			
		|||
  struct whc_idxnode *idxn;
 | 
			
		||||
  union {
 | 
			
		||||
    struct whc_idxnode idxn;
 | 
			
		||||
    char pad[sizeof(struct whc_idxnode) + sizeof(struct whc_node *)];
 | 
			
		||||
    char pad[sizeof (struct whc_idxnode) + sizeof (struct whc_node *)];
 | 
			
		||||
  } template;
 | 
			
		||||
 | 
			
		||||
  ddsrt_mutex_lock (&whc->lock);
 | 
			
		||||
  check_whc (whc);
 | 
			
		||||
 | 
			
		||||
  if (dds_get_log_mask() & DDS_LC_WHC)
 | 
			
		||||
  if (whc->gv->logconfig.c.mask & DDS_LC_WHC)
 | 
			
		||||
  {
 | 
			
		||||
    struct whc_state whcst;
 | 
			
		||||
    get_state_locked(whc, &whcst);
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "whc_default_insert(%p max_drop_seq %"PRId64" seq %"PRId64" plist %p serdata %p:%"PRIx32")\n", (void *)whc, max_drop_seq, seq, (void*)plist, (void*)serdata, serdata->hash);
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "  whc: [%"PRId64",%"PRId64"] max_drop_seq %"PRId64" h %u tl %u\n",
 | 
			
		||||
               whcst.min_seq, whcst.max_seq, whc->max_drop_seq, whc->hdepth, whc->tldepth);
 | 
			
		||||
    get_state_locked (whc, &whcst);
 | 
			
		||||
    TRACE ("whc_default_insert(%p max_drop_seq %"PRId64" seq %"PRId64" plist %p serdata %p:%"PRIx32")\n",
 | 
			
		||||
           (void *) whc, max_drop_seq, seq, (void *) plist, (void *) serdata, serdata->hash);
 | 
			
		||||
    TRACE ("  whc: [%"PRId64",%"PRId64"] max_drop_seq %"PRId64" h %"PRIu32" tl %"PRIu32"\n",
 | 
			
		||||
           whcst.min_seq, whcst.max_seq, whc->max_drop_seq, whc->hdepth, whc->tldepth);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  assert (max_drop_seq < MAX_SEQ_NUMBER);
 | 
			
		||||
  assert (max_drop_seq >= whc->max_drop_seq);
 | 
			
		||||
 | 
			
		||||
  /* Seq must be greater than what is currently stored. Usually it'll
 | 
			
		||||
     be the next sequence number, but if there are no readers
 | 
			
		||||
     temporarily, a gap may be among the possibilities */
 | 
			
		||||
   be the next sequence number, but if there are no readers
 | 
			
		||||
   temporarily, a gap may be among the possibilities */
 | 
			
		||||
  assert (whc->seq_size == 0 || seq > whc->maxseq_node->seq);
 | 
			
		||||
 | 
			
		||||
  /* Always insert in seq admin */
 | 
			
		||||
  newn = whc_default_insert_seq (whc, max_drop_seq, seq, plist, serdata);
 | 
			
		||||
 | 
			
		||||
  DDS_LOG(DDS_LC_WHC, "  whcn %p:", (void*)newn);
 | 
			
		||||
  TRACE ("  whcn %p:", (void*)newn);
 | 
			
		||||
 | 
			
		||||
  /* Special case of empty data (such as commit messages) can't go into index, and if we're not maintaining an index, we're done, too */
 | 
			
		||||
  if (serdata->kind == SDK_EMPTY || whc->idxdepth == 0)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, " empty or no hist\n");
 | 
			
		||||
    TRACE (" empty or no hist\n");
 | 
			
		||||
    ddsrt_mutex_unlock (&whc->lock);
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -1148,15 +1151,15 @@ static int whc_default_insert (struct whc *whc_generic, seqno_t max_drop_seq, se
 | 
			
		|||
  if ((idxn = ddsrt_hh_lookup (whc->idx_hash, &template)) != NULL)
 | 
			
		||||
  {
 | 
			
		||||
    /* Unregisters cause deleting of index entry, non-unregister of adding/overwriting in history */
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, " idxn %p", (void *)idxn);
 | 
			
		||||
    TRACE (" idxn %p", (void *)idxn);
 | 
			
		||||
    if (serdata->statusinfo & NN_STATUSINFO_UNREGISTER)
 | 
			
		||||
    {
 | 
			
		||||
      DDS_LOG(DDS_LC_WHC, " unreg:delete\n");
 | 
			
		||||
      TRACE (" unreg:delete\n");
 | 
			
		||||
      delete_one_instance_from_idx (whc, max_drop_seq, idxn);
 | 
			
		||||
      if (newn->seq <= max_drop_seq)
 | 
			
		||||
      {
 | 
			
		||||
        struct whc_node *prev_seq = newn->prev_seq;
 | 
			
		||||
        DDS_LOG(DDS_LC_WHC, " unreg:seq <= max_drop_seq: delete newn\n");
 | 
			
		||||
        TRACE (" unreg:seq <= max_drop_seq: delete newn\n");
 | 
			
		||||
        whc_delete_one (whc, newn);
 | 
			
		||||
        whc->maxseq_node = prev_seq;
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -1168,7 +1171,7 @@ static int whc_default_insert (struct whc *whc_generic, seqno_t max_drop_seq, se
 | 
			
		|||
        idxn->headidx = 0;
 | 
			
		||||
      if ((oldn = idxn->hist[idxn->headidx]) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        DDS_LOG(DDS_LC_WHC, " overwrite whcn %p", (void *)oldn);
 | 
			
		||||
        TRACE (" overwrite whcn %p", (void *)oldn);
 | 
			
		||||
        oldn->idxnode = NULL;
 | 
			
		||||
      }
 | 
			
		||||
      idxn->hist[idxn->headidx] = newn;
 | 
			
		||||
| 
						 | 
				
			
			@ -1177,46 +1180,45 @@ static int whc_default_insert (struct whc *whc_generic, seqno_t max_drop_seq, se
 | 
			
		|||
 | 
			
		||||
      if (oldn && (whc->hdepth > 0 || oldn->seq <= max_drop_seq))
 | 
			
		||||
      {
 | 
			
		||||
        DDS_LOG(DDS_LC_WHC, " prune whcn %p", (void *)oldn);
 | 
			
		||||
        assert(oldn != whc->maxseq_node);
 | 
			
		||||
        TRACE (" prune whcn %p", (void *)oldn);
 | 
			
		||||
        assert (oldn != whc->maxseq_node);
 | 
			
		||||
        whc_delete_one (whc, oldn);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      /* Special case for dropping everything beyond T-L history when the new sample is being
 | 
			
		||||
         auto-acknowledged (for lack of reliable readers), and the keep-last T-L history is
 | 
			
		||||
         shallower than the keep-last regular history (normal path handles this via pruning in
 | 
			
		||||
         whc_default_remove_acked_messages, but that never happens when there are no readers). */
 | 
			
		||||
       auto-acknowledged (for lack of reliable readers), and the keep-last T-L history is
 | 
			
		||||
       shallower than the keep-last regular history (normal path handles this via pruning in
 | 
			
		||||
       whc_default_remove_acked_messages, but that never happens when there are no readers). */
 | 
			
		||||
      if (seq <= max_drop_seq && whc->tldepth > 0 && whc->idxdepth > whc->tldepth)
 | 
			
		||||
      {
 | 
			
		||||
        unsigned pos = idxn->headidx + whc->idxdepth - whc->tldepth;
 | 
			
		||||
        uint32_t pos = idxn->headidx + whc->idxdepth - whc->tldepth;
 | 
			
		||||
        if (pos >= whc->idxdepth)
 | 
			
		||||
          pos -= whc->idxdepth;
 | 
			
		||||
        if ((oldn = idxn->hist[pos]) != NULL)
 | 
			
		||||
        {
 | 
			
		||||
          DDS_LOG(DDS_LC_WHC, " prune tl whcn %p", (void *)oldn);
 | 
			
		||||
          assert(oldn != whc->maxseq_node);
 | 
			
		||||
          TRACE (" prune tl whcn %p", (void *)oldn);
 | 
			
		||||
          assert (oldn != whc->maxseq_node);
 | 
			
		||||
          whc_delete_one (whc, oldn);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      DDS_LOG(DDS_LC_WHC, "\n");
 | 
			
		||||
      TRACE ("\n");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, " newkey");
 | 
			
		||||
    TRACE (" newkey");
 | 
			
		||||
    /* Ignore unregisters, but insert everything else */
 | 
			
		||||
    if (!(serdata->statusinfo & NN_STATUSINFO_UNREGISTER))
 | 
			
		||||
    {
 | 
			
		||||
      unsigned i;
 | 
			
		||||
      idxn = ddsrt_malloc (sizeof (*idxn) + whc->idxdepth * sizeof (idxn->hist[0]));
 | 
			
		||||
      DDS_LOG(DDS_LC_WHC, " idxn %p", (void *)idxn);
 | 
			
		||||
      ddsi_tkmap_instance_ref(tk);
 | 
			
		||||
      TRACE (" idxn %p", (void *)idxn);
 | 
			
		||||
      ddsi_tkmap_instance_ref (tk);
 | 
			
		||||
      idxn->iid = tk->m_iid;
 | 
			
		||||
      idxn->tk = tk;
 | 
			
		||||
      idxn->prune_seq = 0;
 | 
			
		||||
      idxn->headidx = 0;
 | 
			
		||||
      idxn->hist[0] = newn;
 | 
			
		||||
      for (i = 1; i < whc->idxdepth; i++)
 | 
			
		||||
      for (uint32_t i = 1; i < whc->idxdepth; i++)
 | 
			
		||||
        idxn->hist[i] = NULL;
 | 
			
		||||
      newn->idxnode = idxn;
 | 
			
		||||
      newn->idxnode_pos = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -1225,24 +1227,24 @@ static int whc_default_insert (struct whc *whc_generic, seqno_t max_drop_seq, se
 | 
			
		|||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      DDS_LOG(DDS_LC_WHC, " unreg:skip");
 | 
			
		||||
      TRACE (" unreg:skip");
 | 
			
		||||
      if (newn->seq <= max_drop_seq)
 | 
			
		||||
      {
 | 
			
		||||
        struct whc_node *prev_seq = newn->prev_seq;
 | 
			
		||||
        DDS_LOG(DDS_LC_WHC, " unreg:seq <= max_drop_seq: delete newn\n");
 | 
			
		||||
        TRACE (" unreg:seq <= max_drop_seq: delete newn\n");
 | 
			
		||||
        whc_delete_one (whc, newn);
 | 
			
		||||
        whc->maxseq_node = prev_seq;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    DDS_LOG(DDS_LC_WHC, "\n");
 | 
			
		||||
    TRACE ("\n");
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&whc->lock);
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void make_borrowed_sample(struct whc_borrowed_sample *sample, struct whc_node *whcn)
 | 
			
		||||
static void make_borrowed_sample (struct whc_borrowed_sample *sample, struct whc_node *whcn)
 | 
			
		||||
{
 | 
			
		||||
  assert(!whcn->borrowed);
 | 
			
		||||
  assert (!whcn->borrowed);
 | 
			
		||||
  whcn->borrowed = 1;
 | 
			
		||||
  sample->seq = whcn->seq;
 | 
			
		||||
  sample->plist = whcn->plist;
 | 
			
		||||
| 
						 | 
				
			
			@ -1258,11 +1260,11 @@ static bool whc_default_borrow_sample (const struct whc *whc_generic, seqno_t se
 | 
			
		|||
  struct whc_node *whcn;
 | 
			
		||||
  bool found;
 | 
			
		||||
  ddsrt_mutex_lock ((ddsrt_mutex_t *)&whc->lock);
 | 
			
		||||
  if ((whcn = whc_findseq(whc, seq)) == NULL)
 | 
			
		||||
  if ((whcn = whc_findseq (whc, seq)) == NULL)
 | 
			
		||||
    found = false;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    make_borrowed_sample(sample, whcn);
 | 
			
		||||
    make_borrowed_sample (sample, whcn);
 | 
			
		||||
    found = true;
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock ((ddsrt_mutex_t *)&whc->lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -1275,11 +1277,11 @@ static bool whc_default_borrow_sample_key (const struct whc *whc_generic, const
 | 
			
		|||
  struct whc_node *whcn;
 | 
			
		||||
  bool found;
 | 
			
		||||
  ddsrt_mutex_lock ((ddsrt_mutex_t *)&whc->lock);
 | 
			
		||||
  if ((whcn = whc_findkey(whc, serdata_key)) == NULL)
 | 
			
		||||
  if ((whcn = whc_findkey (whc, serdata_key)) == NULL)
 | 
			
		||||
    found = false;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    make_borrowed_sample(sample, whcn);
 | 
			
		||||
    make_borrowed_sample (sample, whcn);
 | 
			
		||||
    found = true;
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock ((ddsrt_mutex_t *)&whc->lock);
 | 
			
		||||
| 
						 | 
				
			
			@ -1293,14 +1295,15 @@ static void return_sample_locked (struct whc_impl *whc, struct whc_borrowed_samp
 | 
			
		|||
  {
 | 
			
		||||
    /* data no longer present in WHC - that means ownership for serdata, plist shifted to the borrowed copy and "returning" it really becomes "destroying" it */
 | 
			
		||||
    ddsi_serdata_unref (sample->serdata);
 | 
			
		||||
    if (sample->plist) {
 | 
			
		||||
    if (sample->plist)
 | 
			
		||||
    {
 | 
			
		||||
      nn_plist_fini (sample->plist);
 | 
			
		||||
      ddsrt_free (sample->plist);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    assert(whcn->borrowed);
 | 
			
		||||
    assert (whcn->borrowed);
 | 
			
		||||
    whcn->borrowed = 0;
 | 
			
		||||
    if (update_retransmit_info)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -1338,7 +1341,7 @@ static bool whc_default_sample_iter_borrow_next (struct whc_sample_iter *opaque_
 | 
			
		|||
  if (!it->first)
 | 
			
		||||
  {
 | 
			
		||||
    seq = sample->seq;
 | 
			
		||||
    return_sample_locked(whc, sample, false);
 | 
			
		||||
    return_sample_locked (whc, sample, false);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			@ -1349,7 +1352,7 @@ static bool whc_default_sample_iter_borrow_next (struct whc_sample_iter *opaque_
 | 
			
		|||
    valid = false;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    make_borrowed_sample(sample, whcn);
 | 
			
		||||
    make_borrowed_sample (sample, whcn);
 | 
			
		||||
    valid = true;
 | 
			
		||||
  }
 | 
			
		||||
  ddsrt_mutex_unlock (&whc->lock);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@
 | 
			
		|||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_ephash.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
#include "dds__serdata_builtintopic.h"
 | 
			
		||||
#include "dds__whc_builtintopic.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +28,7 @@
 | 
			
		|||
struct bwhc {
 | 
			
		||||
  struct whc common;
 | 
			
		||||
  enum ddsi_sertopic_builtintopic_type type;
 | 
			
		||||
  const struct ephash *guid_hash;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum bwhc_iter_state {
 | 
			
		||||
| 
						 | 
				
			
			@ -44,9 +46,7 @@ struct bwhc_iter {
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
/* check that our definition of whc_sample_iter fits in the type that callers allocate */
 | 
			
		||||
struct bwhc_sample_iter_sizecheck {
 | 
			
		||||
  char fits_in_generic_type[sizeof(struct bwhc_iter) <= sizeof(struct whc_sample_iter) ? 1 : -1];
 | 
			
		||||
};
 | 
			
		||||
DDSRT_STATIC_ASSERT (sizeof (struct bwhc_iter) <= sizeof (struct whc_sample_iter));
 | 
			
		||||
 | 
			
		||||
static void bwhc_free (struct whc *whc_generic)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +64,7 @@ static void bwhc_sample_iter_init (const struct whc *whc_generic, struct whc_sam
 | 
			
		|||
static bool is_visible (const struct entity_common *e)
 | 
			
		||||
{
 | 
			
		||||
  const nn_vendorid_t vendorid = get_entity_vendorid (e);
 | 
			
		||||
  return ddsi_plugin.builtintopic_is_visible (e->guid.entityid, e->onlylocal, vendorid);
 | 
			
		||||
  return builtintopic_is_visible (e->gv->builtin_topic_interface, &e->guid, vendorid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool bwhc_sample_iter_borrow_next (struct whc_sample_iter *opaque_it, struct whc_borrowed_sample *sample)
 | 
			
		||||
| 
						 | 
				
			
			@ -92,7 +92,7 @@ static bool bwhc_sample_iter_borrow_next (struct whc_sample_iter *opaque_it, str
 | 
			
		|||
        case DSBT_READER:      kind = EK_READER; break;
 | 
			
		||||
      }
 | 
			
		||||
      assert (whc->type == DSBT_PARTICIPANT || kind != EK_PARTICIPANT);
 | 
			
		||||
      ephash_enum_init (&it->it, kind);
 | 
			
		||||
      ephash_enum_init (&it->it, whc->guid_hash, kind);
 | 
			
		||||
      it->st = BIS_LOCAL;
 | 
			
		||||
      /* FALLS THROUGH */
 | 
			
		||||
    case BIS_LOCAL:
 | 
			
		||||
| 
						 | 
				
			
			@ -115,7 +115,7 @@ static bool bwhc_sample_iter_borrow_next (struct whc_sample_iter *opaque_it, str
 | 
			
		|||
        case DSBT_READER:      kind = EK_PROXY_READER; break;
 | 
			
		||||
      }
 | 
			
		||||
      assert (kind != EK_PARTICIPANT);
 | 
			
		||||
      ephash_enum_init (&it->it, kind);
 | 
			
		||||
      ephash_enum_init (&it->it, whc->guid_hash, kind);
 | 
			
		||||
      it->st = BIS_PROXY;
 | 
			
		||||
      /* FALLS THROUGH */
 | 
			
		||||
    case BIS_PROXY:
 | 
			
		||||
| 
						 | 
				
			
			@ -192,10 +192,11 @@ static const struct whc_ops bwhc_ops = {
 | 
			
		|||
  .free = bwhc_free
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct whc *builtintopic_whc_new (enum ddsi_sertopic_builtintopic_type type)
 | 
			
		||||
struct whc *builtintopic_whc_new (enum ddsi_sertopic_builtintopic_type type, const struct ephash *guid_hash)
 | 
			
		||||
{
 | 
			
		||||
  struct bwhc *whc = ddsrt_malloc (sizeof (*whc));
 | 
			
		||||
  whc->common.ops = &bwhc_ops;
 | 
			
		||||
  whc->type = type;
 | 
			
		||||
  whc->guid_hash = guid_hash;
 | 
			
		||||
  return (struct whc *) whc;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,29 +14,28 @@
 | 
			
		|||
#include "dds__writer.h"
 | 
			
		||||
#include "dds__write.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
#include "dds/ddsi/q_error.h"
 | 
			
		||||
#include "dds/ddsi/q_thread.h"
 | 
			
		||||
#include "dds/ddsi/q_xmsg.h"
 | 
			
		||||
#include "dds/ddsi/q_rhc.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_serdata.h"
 | 
			
		||||
#include "dds__stream.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds/ddsi/q_transmit.h"
 | 
			
		||||
#include "dds/ddsi/q_ephash.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
#include "dds/ddsi/q_radmin.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_write (dds_entity_t writer, const void *data)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (rc);
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
  ret = dds_write_impl (wr, data, dds_time (), 0);
 | 
			
		||||
  dds_writer_unlock (wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -45,14 +44,13 @@ dds_return_t dds_write (dds_entity_t writer, const void *data)
 | 
			
		|||
dds_return_t dds_writecdr (dds_entity_t writer, struct ddsi_serdata *serdata)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
  if (serdata == NULL)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (rc);
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
  ret = dds_writecdr_impl (wr, serdata, dds_time (), 0);
 | 
			
		||||
  dds_writer_unlock (wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -61,14 +59,13 @@ dds_return_t dds_writecdr (dds_entity_t writer, struct ddsi_serdata *serdata)
 | 
			
		|||
dds_return_t dds_write_ts (dds_entity_t writer, const void *data, dds_time_t timestamp)
 | 
			
		||||
{
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
 | 
			
		||||
  if (data == NULL || timestamp < 0)
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  if ((rc = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (rc);
 | 
			
		||||
  if ((ret = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    return ret;
 | 
			
		||||
  ret = dds_write_impl (wr, data, timestamp, 0);
 | 
			
		||||
  dds_writer_unlock (wr);
 | 
			
		||||
  return ret;
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +73,7 @@ dds_return_t dds_write_ts (dds_entity_t writer, const void *data, dds_time_t tim
 | 
			
		|||
 | 
			
		||||
static dds_return_t try_store (struct rhc *rhc, const struct proxy_writer_info *pwr_info, struct ddsi_serdata *payload, struct ddsi_tkmap_instance *tk, dds_duration_t *max_block_ms)
 | 
			
		||||
{
 | 
			
		||||
  while (!(ddsi_plugin.rhc_plugin.rhc_store_fn) (rhc, pwr_info, payload, tk))
 | 
			
		||||
  while (! rhc_store (rhc, pwr_info, payload, tk))
 | 
			
		||||
  {
 | 
			
		||||
    if (*max_block_ms > 0)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			@ -85,8 +82,7 @@ static dds_return_t try_store (struct rhc *rhc, const struct proxy_writer_info *
 | 
			
		|||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      DDS_ERROR ("The writer could not deliver data on time, probably due to a local reader resources being full\n");
 | 
			
		||||
      return DDS_ERRNO (DDS_RETCODE_TIMEOUT);
 | 
			
		||||
      return DDS_RETCODE_TIMEOUT;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
| 
						 | 
				
			
			@ -101,12 +97,11 @@ static dds_return_t deliver_locally (struct writer *wr, struct ddsi_serdata *pay
 | 
			
		|||
    struct reader ** const rdary = wr->rdary.rdary;
 | 
			
		||||
    if (rdary[0])
 | 
			
		||||
    {
 | 
			
		||||
      dds_duration_t max_block_ms = nn_from_ddsi_duration (wr->xqos->reliability.max_blocking_time);
 | 
			
		||||
      dds_duration_t max_block_ms = wr->xqos->reliability.max_blocking_time;
 | 
			
		||||
      struct proxy_writer_info pwr_info;
 | 
			
		||||
      unsigned i;
 | 
			
		||||
      make_proxy_writer_info (&pwr_info, &wr->e, wr->xqos);
 | 
			
		||||
      for (i = 0; rdary[i]; i++) {
 | 
			
		||||
        DDS_TRACE ("reader "PGUIDFMT"\n", PGUID (rdary[i]->e.guid));
 | 
			
		||||
      for (uint32_t i = 0; rdary[i]; i++) {
 | 
			
		||||
        DDS_CTRACE (&wr->e.gv->logconfig, "reader "PGUIDFMT"\n", PGUID (rdary[i]->e.guid));
 | 
			
		||||
        if ((ret = try_store (rdary[i]->rhc, &pwr_info, payload, tk, &max_block_ms)) != DDS_RETCODE_OK)
 | 
			
		||||
          break;
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -116,33 +111,39 @@ static dds_return_t deliver_locally (struct writer *wr, struct ddsi_serdata *pay
 | 
			
		|||
  else
 | 
			
		||||
  {
 | 
			
		||||
    /* When deleting, pwr is no longer accessible via the hash
 | 
			
		||||
     tables, and consequently, a reader may be deleted without
 | 
			
		||||
     it being possible to remove it from rdary. The primary
 | 
			
		||||
     reason rdary exists is to avoid locking the proxy writer
 | 
			
		||||
     but this is less of an issue when we are deleting it, so
 | 
			
		||||
     we fall back to using the GUIDs so that we can deliver all
 | 
			
		||||
     samples we received from it. As writer being deleted any
 | 
			
		||||
     reliable samples that are rejected are simply discarded. */
 | 
			
		||||
       tables, and consequently, a reader may be deleted without
 | 
			
		||||
       it being possible to remove it from rdary. The primary
 | 
			
		||||
       reason rdary exists is to avoid locking the proxy writer
 | 
			
		||||
       but this is less of an issue when we are deleting it, so
 | 
			
		||||
       we fall back to using the GUIDs so that we can deliver all
 | 
			
		||||
       samples we received from it. As writer being deleted any
 | 
			
		||||
       reliable samples that are rejected are simply discarded. */
 | 
			
		||||
    ddsrt_avl_iter_t it;
 | 
			
		||||
    struct pwr_rd_match *m;
 | 
			
		||||
    struct proxy_writer_info pwr_info;
 | 
			
		||||
    dds_duration_t max_block_ms = nn_from_ddsi_duration (wr->xqos->reliability.max_blocking_time);
 | 
			
		||||
    const struct ephash *gh = wr->e.gv->guid_hash;
 | 
			
		||||
    dds_duration_t max_block_ms = wr->xqos->reliability.max_blocking_time;
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->rdary.rdary_lock);
 | 
			
		||||
    make_proxy_writer_info (&pwr_info, &wr->e, wr->xqos);
 | 
			
		||||
    ddsrt_mutex_lock (&wr->e.lock);
 | 
			
		||||
    for (m = ddsrt_avl_iter_first (&wr_local_readers_treedef, &wr->local_readers, &it); m != NULL; m = ddsrt_avl_iter_next (&it))
 | 
			
		||||
    {
 | 
			
		||||
      struct reader *rd;
 | 
			
		||||
      if ((rd = ephash_lookup_reader_guid (&m->rd_guid)) != NULL)
 | 
			
		||||
      if ((rd = ephash_lookup_reader_guid (gh, &m->rd_guid)) != NULL)
 | 
			
		||||
      {
 | 
			
		||||
        DDS_TRACE("reader-via-guid "PGUIDFMT"\n", PGUID (rd->e.guid));
 | 
			
		||||
        /* Copied the return value ignore from DDSI deliver_user_data() function. */
 | 
			
		||||
        DDS_CTRACE (&wr->e.gv->logconfig, "reader-via-guid "PGUIDFMT"\n", PGUID (rd->e.guid));
 | 
			
		||||
        /* Copied the return value ignore from DDSI deliver_user_data () function. */
 | 
			
		||||
        if ((ret = try_store (rd->rhc, &pwr_info, payload, tk, &max_block_ms)) != DDS_RETCODE_OK)
 | 
			
		||||
          break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->e.lock);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (ret == DDS_RETCODE_TIMEOUT)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_CERROR (&wr->e.gv->logconfig, "The writer could not deliver data on time, probably due to a local reader resources being full\n");
 | 
			
		||||
  }
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -157,81 +158,72 @@ dds_return_t dds_write_impl (dds_writer *wr, const void * data, dds_time_t tstam
 | 
			
		|||
  int w_rc;
 | 
			
		||||
 | 
			
		||||
  if (data == NULL)
 | 
			
		||||
  {
 | 
			
		||||
    DDS_ERROR("No data buffer provided\n");
 | 
			
		||||
    return DDS_ERRNO (DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  }
 | 
			
		||||
    return DDS_RETCODE_BAD_PARAMETER;
 | 
			
		||||
 | 
			
		||||
  /* Check for topic filter */
 | 
			
		||||
  if (wr->m_topic->filter_fn && !writekey)
 | 
			
		||||
    if (!(wr->m_topic->filter_fn) (data, wr->m_topic->filter_ctx))
 | 
			
		||||
    if (! wr->m_topic->filter_fn (data, wr->m_topic->filter_ctx))
 | 
			
		||||
      return DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1);
 | 
			
		||||
  thread_state_awake (ts1, &wr->m_entity.m_domain->gv);
 | 
			
		||||
 | 
			
		||||
  /* Serialize and write data or key */
 | 
			
		||||
  d = ddsi_serdata_from_sample (ddsi_wr->topic, writekey ? SDK_KEY : SDK_DATA, data);
 | 
			
		||||
  d->statusinfo = ((action & DDS_WR_DISPOSE_BIT) ? NN_STATUSINFO_DISPOSE : 0) | ((action & DDS_WR_UNREGISTER_BIT) ? NN_STATUSINFO_UNREGISTER : 0);
 | 
			
		||||
  d->statusinfo = (((action & DDS_WR_DISPOSE_BIT) ? NN_STATUSINFO_DISPOSE : 0) |
 | 
			
		||||
                   ((action & DDS_WR_UNREGISTER_BIT) ? NN_STATUSINFO_UNREGISTER : 0));
 | 
			
		||||
  d->timestamp.v = tstamp;
 | 
			
		||||
  ddsi_serdata_ref (d);
 | 
			
		||||
  tk = ddsi_tkmap_lookup_instance_ref (d);
 | 
			
		||||
  tk = ddsi_tkmap_lookup_instance_ref (wr->m_entity.m_domain->gv.m_tkmap, d);
 | 
			
		||||
  w_rc = write_sample_gc (ts1, wr->m_xp, ddsi_wr, d, tk);
 | 
			
		||||
 | 
			
		||||
  if (w_rc >= 0)
 | 
			
		||||
  {
 | 
			
		||||
  if (w_rc >= 0) {
 | 
			
		||||
    /* Flush out write unless configured to batch */
 | 
			
		||||
    if (!config.whc_batch)
 | 
			
		||||
    if (!wr->whc_batch)
 | 
			
		||||
      nn_xpack_send (wr->m_xp, false);
 | 
			
		||||
    ret = DDS_RETCODE_OK;
 | 
			
		||||
  } else if (w_rc == Q_ERR_TIMEOUT) {
 | 
			
		||||
    DDS_ERROR ("The writer could not deliver data on time, probably due to a reader resources being full\n");
 | 
			
		||||
    ret = DDS_ERRNO (DDS_RETCODE_TIMEOUT);
 | 
			
		||||
  } else if (w_rc == Q_ERR_INVALID_DATA) {
 | 
			
		||||
    DDS_ERROR ("Invalid data provided\n");
 | 
			
		||||
    ret = DDS_ERRNO (DDS_RETCODE_ERROR);
 | 
			
		||||
  } else if (w_rc == DDS_RETCODE_TIMEOUT) {
 | 
			
		||||
    ret = DDS_RETCODE_TIMEOUT;
 | 
			
		||||
  } else if (w_rc == DDS_RETCODE_BAD_PARAMETER) {
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
  } else {
 | 
			
		||||
    DDS_ERROR ("Internal error\n");
 | 
			
		||||
    ret = DDS_ERRNO (DDS_RETCODE_ERROR);
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
  }
 | 
			
		||||
  if (ret == DDS_RETCODE_OK)
 | 
			
		||||
    ret = deliver_locally (ddsi_wr, d, tk);
 | 
			
		||||
  ddsi_serdata_unref (d);
 | 
			
		||||
  ddsi_tkmap_instance_unref (tk);
 | 
			
		||||
  ddsi_tkmap_instance_unref (wr->m_entity.m_domain->gv.m_tkmap, tk);
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t dds_writecdr_impl_lowlevel (struct writer *ddsi_wr, struct nn_xpack *xp, struct ddsi_serdata *d)
 | 
			
		||||
dds_return_t dds_writecdr_impl_lowlevel (struct writer *ddsi_wr, struct nn_xpack *xp, struct ddsi_serdata *d, bool flush)
 | 
			
		||||
{
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  struct ddsi_tkmap_instance * tk;
 | 
			
		||||
  int ret = DDS_RETCODE_OK;
 | 
			
		||||
  int w_rc;
 | 
			
		||||
 | 
			
		||||
  thread_state_awake (ts1);
 | 
			
		||||
  thread_state_awake (ts1, ddsi_wr->e.gv);
 | 
			
		||||
  ddsi_serdata_ref (d);
 | 
			
		||||
  tk = ddsi_tkmap_lookup_instance_ref (d);
 | 
			
		||||
  tk = ddsi_tkmap_lookup_instance_ref (ddsi_wr->e.gv->m_tkmap, d);
 | 
			
		||||
  w_rc = write_sample_gc (ts1, xp, ddsi_wr, d, tk);
 | 
			
		||||
  if (w_rc >= 0) {
 | 
			
		||||
    /* Flush out write unless configured to batch */
 | 
			
		||||
    if (!config.whc_batch && xp != NULL)
 | 
			
		||||
    if (flush && xp != NULL)
 | 
			
		||||
      nn_xpack_send (xp, false);
 | 
			
		||||
    ret = DDS_RETCODE_OK;
 | 
			
		||||
  } else if (w_rc == Q_ERR_TIMEOUT) {
 | 
			
		||||
    DDS_ERROR ("The writer could not deliver data on time, probably due to a reader resources being full\n");
 | 
			
		||||
    ret = DDS_ERRNO(DDS_RETCODE_TIMEOUT);
 | 
			
		||||
  } else if (w_rc == Q_ERR_INVALID_DATA) {
 | 
			
		||||
    DDS_ERROR ("Invalid data provided\n");
 | 
			
		||||
    ret = DDS_ERRNO (DDS_RETCODE_ERROR);
 | 
			
		||||
  } else if (w_rc == DDS_RETCODE_TIMEOUT) {
 | 
			
		||||
    ret = DDS_RETCODE_TIMEOUT;
 | 
			
		||||
  } else if (w_rc == DDS_RETCODE_BAD_PARAMETER) {
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
  } else {
 | 
			
		||||
    DDS_ERROR ("Internal error\n");
 | 
			
		||||
    ret = DDS_ERRNO (DDS_RETCODE_ERROR);
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (ret == DDS_RETCODE_OK)
 | 
			
		||||
    ret = deliver_locally (ddsi_wr, d, tk);
 | 
			
		||||
  ddsi_serdata_unref (d);
 | 
			
		||||
  ddsi_tkmap_instance_unref (tk);
 | 
			
		||||
  ddsi_tkmap_instance_unref (ddsi_wr->e.gv->m_tkmap, tk);
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -241,28 +233,22 @@ dds_return_t dds_writecdr_impl (dds_writer *wr, struct ddsi_serdata *d, dds_time
 | 
			
		|||
  if (wr->m_topic->filter_fn)
 | 
			
		||||
    abort ();
 | 
			
		||||
  /* Set if disposing or unregistering */
 | 
			
		||||
  d->statusinfo = ((action & DDS_WR_DISPOSE_BIT) ? NN_STATUSINFO_DISPOSE : 0) | ((action & DDS_WR_UNREGISTER_BIT) ? NN_STATUSINFO_UNREGISTER : 0);
 | 
			
		||||
  d->statusinfo = (((action & DDS_WR_DISPOSE_BIT) ? NN_STATUSINFO_DISPOSE : 0) |
 | 
			
		||||
                   ((action & DDS_WR_UNREGISTER_BIT) ? NN_STATUSINFO_UNREGISTER : 0));
 | 
			
		||||
  d->timestamp.v = tstamp;
 | 
			
		||||
  return dds_writecdr_impl_lowlevel (wr->m_wr, wr->m_xp, d);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_write_set_batch (bool enable)
 | 
			
		||||
{
 | 
			
		||||
  config.whc_batch = enable ? 1 : 0;
 | 
			
		||||
  return dds_writecdr_impl_lowlevel (wr->m_wr, wr->m_xp, d, !wr->whc_batch);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dds_write_flush (dds_entity_t writer)
 | 
			
		||||
{
 | 
			
		||||
  struct thread_state1 * const ts1 = lookup_thread_state ();
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  thread_state_awake (ts1);
 | 
			
		||||
  if ((rc = dds_writer_lock (writer, &wr)) != DDS_RETCODE_OK)
 | 
			
		||||
    DDS_ERROR ("Error occurred on locking writer\n");
 | 
			
		||||
  else
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if ((rc = dds_writer_lock (writer, &wr)) == DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    thread_state_awake (ts1, &wr->m_entity.m_domain->gv);
 | 
			
		||||
    nn_xpack_send (wr->m_xp, true);
 | 
			
		||||
    thread_state_asleep (ts1);
 | 
			
		||||
    dds_writer_unlock (wr);
 | 
			
		||||
  }
 | 
			
		||||
  thread_state_asleep (ts1);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@
 | 
			
		|||
 | 
			
		||||
#include "dds/dds.h"
 | 
			
		||||
#include "dds/version.h"
 | 
			
		||||
#include "dds/ddsrt/static_assert.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
#include "dds/ddsi/q_globals.h"
 | 
			
		||||
#include "dds/ddsi/q_entity.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -20,45 +21,25 @@
 | 
			
		|||
#include "dds/ddsi/q_xmsg.h"
 | 
			
		||||
#include "dds__writer.h"
 | 
			
		||||
#include "dds__listener.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds__err.h"
 | 
			
		||||
#include "dds__init.h"
 | 
			
		||||
#include "dds__publisher.h"
 | 
			
		||||
#include "dds__topic.h"
 | 
			
		||||
#include "dds__get_status.h"
 | 
			
		||||
#include "dds__qos.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_tkmap.h"
 | 
			
		||||
#include "dds__whc.h"
 | 
			
		||||
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK(extern inline, dds_writer)
 | 
			
		||||
DECL_ENTITY_LOCK_UNLOCK (extern inline, dds_writer)
 | 
			
		||||
 | 
			
		||||
#define DDS_WRITER_STATUS_MASK                                   \
 | 
			
		||||
                        DDS_LIVELINESS_LOST_STATUS              |\
 | 
			
		||||
                        DDS_OFFERED_DEADLINE_MISSED_STATUS      |\
 | 
			
		||||
                        DDS_OFFERED_INCOMPATIBLE_QOS_STATUS     |\
 | 
			
		||||
                        DDS_PUBLICATION_MATCHED_STATUS
 | 
			
		||||
                        (DDS_LIVELINESS_LOST_STATUS              |\
 | 
			
		||||
                         DDS_OFFERED_DEADLINE_MISSED_STATUS      |\
 | 
			
		||||
                         DDS_OFFERED_INCOMPATIBLE_QOS_STATUS     |\
 | 
			
		||||
                         DDS_PUBLICATION_MATCHED_STATUS)
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_writer_instance_hdl(
 | 
			
		||||
        dds_entity *e,
 | 
			
		||||
        dds_instance_handle_t *i)
 | 
			
		||||
static dds_return_t dds_writer_status_validate (uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    assert(e);
 | 
			
		||||
    assert(i);
 | 
			
		||||
    *i = (dds_instance_handle_t)writer_instance_id(&e->m_guid);
 | 
			
		||||
    return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_writer_status_validate(
 | 
			
		||||
        uint32_t mask)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    if (mask & ~(DDS_WRITER_STATUS_MASK)) {
 | 
			
		||||
        DDS_ERROR("Invalid status mask\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
  return (mask & ~DDS_WRITER_STATUS_MASK) ? DDS_RETCODE_BAD_PARAMETER : DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -77,7 +58,7 @@ static void dds_writer_status_cb (void *ventity, const status_cb_data_t *data)
 | 
			
		|||
  {
 | 
			
		||||
    /* Release the initial claim that was done during the create. This
 | 
			
		||||
     * will indicate that further API deletion is now possible. */
 | 
			
		||||
    dds_handle_release (&entity->m_hdllink);
 | 
			
		||||
    dds_handle_unpin (&entity->m_hdllink);
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -94,7 +75,7 @@ static void dds_writer_status_cb (void *ventity, const status_cb_data_t *data)
 | 
			
		|||
 | 
			
		||||
  /* Reset the status for possible Listener call.
 | 
			
		||||
   * When a listener is not called, the status will be set (again). */
 | 
			
		||||
  dds_entity_status_reset (entity, 1u << status_id);
 | 
			
		||||
  dds_entity_status_reset (entity, (status_mask_t) (1u << status_id));
 | 
			
		||||
 | 
			
		||||
  /* Update status metrics. */
 | 
			
		||||
  dds_writer * const wr = (dds_writer *) entity;
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +147,7 @@ static void dds_writer_status_cb (void *ventity, const status_cb_data_t *data)
 | 
			
		|||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_status_set (entity, 1u << status_id);
 | 
			
		||||
    dds_entity_status_set (entity, (status_mask_t) (1u << status_id));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  entity->m_cb_count--;
 | 
			
		||||
| 
						 | 
				
			
			@ -174,422 +155,208 @@ static void dds_writer_status_cb (void *ventity, const status_cb_data_t *data)
 | 
			
		|||
  ddsrt_mutex_unlock (&entity->m_observers_lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static uint32_t
 | 
			
		||||
get_bandwidth_limit(
 | 
			
		||||
        nn_transport_priority_qospolicy_t transport_priority)
 | 
			
		||||
static uint32_t get_bandwidth_limit (dds_transport_priority_qospolicy_t transport_priority)
 | 
			
		||||
{
 | 
			
		||||
#ifdef DDSI_INCLUDE_NETWORK_CHANNELS
 | 
			
		||||
  struct config_channel_listelem *channel = find_channel (transport_priority);
 | 
			
		||||
  struct config_channel_listelem *channel = find_channel (&config, transport_priority);
 | 
			
		||||
  return channel->data_bandwidth_limit;
 | 
			
		||||
#else
 | 
			
		||||
  (void)transport_priority;
 | 
			
		||||
  (void) transport_priority;
 | 
			
		||||
  return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_writer_close(
 | 
			
		||||
        dds_entity *e)
 | 
			
		||||
static dds_return_t dds_writer_close (dds_entity *e) ddsrt_nonnull_all;
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_writer_close (dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
    dds_writer *wr = (dds_writer*)e;
 | 
			
		||||
  dds_writer * const wr = (dds_writer *) e;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  thread_state_awake (lookup_thread_state (), &e->m_domain->gv);
 | 
			
		||||
  nn_xpack_send (wr->m_xp, false);
 | 
			
		||||
  if ((ret = delete_writer (&e->m_domain->gv, &e->m_guid)) < 0)
 | 
			
		||||
    ret = DDS_RETCODE_ERROR;
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
    assert(e);
 | 
			
		||||
static dds_return_t dds_writer_delete (dds_entity *e) ddsrt_nonnull_all;
 | 
			
		||||
 | 
			
		||||
    thread_state_awake (lookup_thread_state ());
 | 
			
		||||
    nn_xpack_send (wr->m_xp, false);
 | 
			
		||||
    if (delete_writer (&e->m_guid) != 0) {
 | 
			
		||||
        DDS_ERROR("Internal error");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
    }
 | 
			
		||||
static dds_return_t dds_writer_delete (dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
  dds_writer * const wr = (dds_writer *) e;
 | 
			
		||||
  dds_return_t ret;
 | 
			
		||||
  /* FIXME: not freeing WHC here because it is owned by the DDSI entity */
 | 
			
		||||
  thread_state_awake (lookup_thread_state (), &e->m_domain->gv);
 | 
			
		||||
  nn_xpack_free (wr->m_xp);
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
  if ((ret = dds_delete (wr->m_topic->m_entity.m_hdllink.hdl)) == DDS_RETCODE_OK)
 | 
			
		||||
  {
 | 
			
		||||
    ret = dds_delete_impl (e->m_parent->m_hdllink.hdl, true);
 | 
			
		||||
    if (ret == DDS_RETCODE_BAD_PARAMETER)
 | 
			
		||||
      ret = DDS_RETCODE_OK;
 | 
			
		||||
  }
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t dds_writer_qos_set (dds_entity *e, const dds_qos_t *qos, bool enabled)
 | 
			
		||||
{
 | 
			
		||||
  /* note: e->m_qos is still the old one to allow for failure here */
 | 
			
		||||
  if (enabled)
 | 
			
		||||
  {
 | 
			
		||||
    struct writer *wr;
 | 
			
		||||
    thread_state_awake (lookup_thread_state (), &e->m_domain->gv);
 | 
			
		||||
    if ((wr = ephash_lookup_writer_guid (e->m_domain->gv.guid_hash, &e->m_guid)) != NULL)
 | 
			
		||||
      update_writer_qos (wr, qos);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    return ret;
 | 
			
		||||
  }
 | 
			
		||||
  return DDS_RETCODE_OK;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_writer_delete(
 | 
			
		||||
        dds_entity *e)
 | 
			
		||||
{
 | 
			
		||||
    dds_writer *wr = (dds_writer*)e;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    /* FIXME: not freeing WHC here because it is owned by the DDSI entity */
 | 
			
		||||
    thread_state_awake (lookup_thread_state ());
 | 
			
		||||
    nn_xpack_free(wr->m_xp);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    ret = dds_delete(wr->m_topic->m_entity.m_hdllink.hdl);
 | 
			
		||||
    if(ret == DDS_RETCODE_OK){
 | 
			
		||||
        ret = dds_delete_impl(e->m_parent->m_hdllink.hdl, true);
 | 
			
		||||
        if(dds_err_nr(ret) == DDS_RETCODE_BAD_PARAMETER){
 | 
			
		||||
            ret = DDS_RETCODE_OK;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_writer_qos_validate(
 | 
			
		||||
        const dds_qos_t *qos,
 | 
			
		||||
        bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    assert(qos);
 | 
			
		||||
 | 
			
		||||
    /* Check consistency. */
 | 
			
		||||
    if(dds_qos_validate_common(qos) != true){
 | 
			
		||||
        DDS_ERROR("Provided inconsistent QoS policy\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if((qos->present & QP_USER_DATA) && validate_octetseq(&qos->user_data) != true){
 | 
			
		||||
        DDS_ERROR("User Data QoS policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if ((qos->present & QP_DURABILITY_SERVICE) && validate_durability_service_qospolicy(&qos->durability_service) != 0){
 | 
			
		||||
        DDS_ERROR("Durability service QoS policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if ((qos->present & QP_LIFESPAN) && validate_duration(&qos->lifespan.duration) != 0){
 | 
			
		||||
        DDS_ERROR("Lifespan QoS policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if ((qos->present & QP_HISTORY) && (qos->present & QP_RESOURCE_LIMITS) && (validate_history_and_resource_limits(&qos->history, &qos->resource_limits) != 0)){
 | 
			
		||||
        DDS_ERROR("Resource limits QoS policy is inconsistent and caused an error\n");
 | 
			
		||||
        ret = DDS_ERRNO(DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    }
 | 
			
		||||
    if(ret == DDS_RETCODE_OK && enabled) {
 | 
			
		||||
        ret = dds_qos_validate_mutable_common(qos);
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_return_t
 | 
			
		||||
dds_writer_qos_set(
 | 
			
		||||
        dds_entity *e,
 | 
			
		||||
        const dds_qos_t *qos,
 | 
			
		||||
        bool enabled)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret = dds_writer_qos_validate(qos, enabled);
 | 
			
		||||
    if (ret == DDS_RETCODE_OK) {
 | 
			
		||||
        /*
 | 
			
		||||
         * TODO: CHAM-95: DDSI does not support changing QoS policies.
 | 
			
		||||
         *
 | 
			
		||||
         * Only Ownership is required for the minimum viable product. This seems
 | 
			
		||||
         * to be the only QoS policy that DDSI supports changes on.
 | 
			
		||||
         */
 | 
			
		||||
        if (qos->present & QP_OWNERSHIP_STRENGTH) {
 | 
			
		||||
            dds_ownership_kind_t kind;
 | 
			
		||||
            /* check for ownership before updating, ownership strength is applicable only if
 | 
			
		||||
             * writer is exclusive */
 | 
			
		||||
            dds_qget_ownership (e->m_qos, &kind);
 | 
			
		||||
 | 
			
		||||
            if (kind == DDS_OWNERSHIP_EXCLUSIVE) {
 | 
			
		||||
                struct writer * ddsi_wr = ((dds_writer*)e)->m_wr;
 | 
			
		||||
 | 
			
		||||
                dds_qset_ownership_strength (e->m_qos, qos->ownership_strength.value);
 | 
			
		||||
 | 
			
		||||
                thread_state_awake (lookup_thread_state ());
 | 
			
		||||
 | 
			
		||||
                /* FIXME: with QoS changes being unsupported by the underlying stack I wonder what will happen; locking the underlying DDSI writer is of doubtful value as well */
 | 
			
		||||
                ddsrt_mutex_lock (&ddsi_wr->e.lock);
 | 
			
		||||
                if (qos->ownership_strength.value != ddsi_wr->xqos->ownership_strength.value) {
 | 
			
		||||
                    ddsi_wr->xqos->ownership_strength.value = qos->ownership_strength.value;
 | 
			
		||||
                }
 | 
			
		||||
                ddsrt_mutex_unlock (&ddsi_wr->e.lock);
 | 
			
		||||
                thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
            } else {
 | 
			
		||||
                DDS_ERROR("Setting ownership strength doesn't make sense when the ownership is shared\n");
 | 
			
		||||
                ret = DDS_ERRNO(DDS_RETCODE_ERROR);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            if (enabled) {
 | 
			
		||||
                DDS_ERROR(DDS_PROJECT_NAME" does not support changing QoS policies yet\n");
 | 
			
		||||
                ret = DDS_ERRNO(DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct whc *make_whc(const dds_qos_t *qos)
 | 
			
		||||
static struct whc *make_whc (struct dds_domain *dom, const dds_qos_t *qos)
 | 
			
		||||
{
 | 
			
		||||
  bool handle_as_transient_local;
 | 
			
		||||
  unsigned hdepth, tldepth;
 | 
			
		||||
  uint32_t hdepth, tldepth;
 | 
			
		||||
  /* 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 == NN_TRANSIENT_LOCAL_DURABILITY_QOS);
 | 
			
		||||
  if (qos->history.kind == NN_KEEP_ALL_HISTORY_QOS)
 | 
			
		||||
     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 (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 == NN_KEEP_ALL_HISTORY_QOS)
 | 
			
		||||
    hdepth = (unsigned) qos->history.depth;
 | 
			
		||||
  if (!handle_as_transient_local)
 | 
			
		||||
    tldepth = 0;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    if (qos->durability_service.history.kind == DDS_HISTORY_KEEP_ALL)
 | 
			
		||||
      tldepth = 0;
 | 
			
		||||
    else
 | 
			
		||||
      tldepth = (unsigned)qos->durability_service.history.depth;
 | 
			
		||||
  } else {
 | 
			
		||||
    tldepth = 0;
 | 
			
		||||
      tldepth = (unsigned) qos->durability_service.history.depth;
 | 
			
		||||
  }
 | 
			
		||||
  return whc_new (handle_as_transient_local, hdepth, tldepth);
 | 
			
		||||
  return whc_new (&dom->gv, handle_as_transient_local, hdepth, tldepth);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct dds_entity_deriver dds_entity_deriver_writer = {
 | 
			
		||||
  .close = dds_writer_close,
 | 
			
		||||
  .delete = dds_writer_delete,
 | 
			
		||||
  .set_qos = dds_writer_qos_set,
 | 
			
		||||
  .validate_status = dds_writer_status_validate
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds_create_writer(
 | 
			
		||||
    dds_entity_t participant_or_publisher,
 | 
			
		||||
    dds_entity_t topic,
 | 
			
		||||
    const dds_qos_t *qos,
 | 
			
		||||
    const dds_listener_t *listener)
 | 
			
		||||
dds_entity_t dds_create_writer (dds_entity_t participant_or_publisher, dds_entity_t topic, const dds_qos_t *qos, const dds_listener_t *listener)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_qos_t * wqos;
 | 
			
		||||
    dds_writer * wr;
 | 
			
		||||
    dds_entity_t writer;
 | 
			
		||||
    dds_publisher * pub = NULL;
 | 
			
		||||
    dds_topic * tp;
 | 
			
		||||
    dds_entity_t publisher;
 | 
			
		||||
    ddsi_tran_conn_t conn = gv.data_conn_uc;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  dds_qos_t *wqos;
 | 
			
		||||
  dds_writer *wr;
 | 
			
		||||
  dds_entity_t writer;
 | 
			
		||||
  dds_publisher *pub = NULL;
 | 
			
		||||
  dds_topic *tp;
 | 
			
		||||
  dds_entity_t publisher;
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        dds_entity *p_or_p;
 | 
			
		||||
        if ((rc = dds_entity_claim (participant_or_publisher, &p_or_p)) != DDS_RETCODE_OK) {
 | 
			
		||||
            return DDS_ERRNO (rc);
 | 
			
		||||
        }
 | 
			
		||||
        if (dds_entity_kind (p_or_p) == DDS_KIND_PARTICIPANT) {
 | 
			
		||||
            publisher = dds_create_publisher(participant_or_publisher, qos, NULL);
 | 
			
		||||
        } else {
 | 
			
		||||
            publisher = participant_or_publisher;
 | 
			
		||||
        }
 | 
			
		||||
        dds_entity_release (p_or_p);
 | 
			
		||||
    }
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity *p_or_p;
 | 
			
		||||
    if ((rc = dds_entity_pin (participant_or_publisher, &p_or_p)) != DDS_RETCODE_OK)
 | 
			
		||||
      return rc;
 | 
			
		||||
    if (dds_entity_kind (p_or_p) == DDS_KIND_PARTICIPANT)
 | 
			
		||||
      publisher = dds_create_publisher(participant_or_publisher, qos, NULL);
 | 
			
		||||
    else
 | 
			
		||||
      publisher = participant_or_publisher;
 | 
			
		||||
    dds_entity_unpin (p_or_p);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    if ((rc = dds_publisher_lock(publisher, &pub)) != DDS_RETCODE_OK) {
 | 
			
		||||
        writer = DDS_ERRNO(rc);
 | 
			
		||||
        goto err_pub_lock;
 | 
			
		||||
    }
 | 
			
		||||
  if ((rc = dds_publisher_lock (publisher, &pub)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
 | 
			
		||||
    if (publisher != participant_or_publisher) {
 | 
			
		||||
        pub->m_entity.m_flags |= DDS_ENTITY_IMPLICIT;
 | 
			
		||||
    }
 | 
			
		||||
  ddsi_tran_conn_t conn = pub->m_entity.m_domain->gv.data_conn_uc;
 | 
			
		||||
  if (publisher != participant_or_publisher)
 | 
			
		||||
    pub->m_entity.m_flags |= DDS_ENTITY_IMPLICIT;
 | 
			
		||||
 | 
			
		||||
    rc = dds_topic_lock(topic, &tp);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking topic\n");
 | 
			
		||||
        writer = DDS_ERRNO(rc);
 | 
			
		||||
        goto err_tp_lock;
 | 
			
		||||
    }
 | 
			
		||||
    assert(tp->m_stopic);
 | 
			
		||||
    assert(pub->m_entity.m_domain == tp->m_entity.m_domain);
 | 
			
		||||
  if ((rc = dds_topic_lock (topic, &tp)) != DDS_RETCODE_OK)
 | 
			
		||||
    goto err_tp_lock;
 | 
			
		||||
 | 
			
		||||
    /* Merge Topic & Publisher qos */
 | 
			
		||||
    wqos = dds_create_qos();
 | 
			
		||||
    if (qos) {
 | 
			
		||||
        /* Only returns failure when one of the qos args is NULL, which
 | 
			
		||||
         * is not the case here. */
 | 
			
		||||
        (void)dds_copy_qos(wqos, qos);
 | 
			
		||||
    }
 | 
			
		||||
  assert (tp->m_stopic);
 | 
			
		||||
  assert (pub->m_entity.m_domain == tp->m_entity.m_domain);
 | 
			
		||||
 | 
			
		||||
    if (pub->m_entity.m_qos) {
 | 
			
		||||
        dds_merge_qos(wqos, pub->m_entity.m_qos);
 | 
			
		||||
    }
 | 
			
		||||
  /* Merge Topic & Publisher qos */
 | 
			
		||||
  wqos = dds_create_qos ();
 | 
			
		||||
  if (qos)
 | 
			
		||||
    nn_xqos_mergein_missing (wqos, qos, DDS_WRITER_QOS_MASK);
 | 
			
		||||
  if (pub->m_entity.m_qos)
 | 
			
		||||
    nn_xqos_mergein_missing (wqos, pub->m_entity.m_qos, ~(uint64_t)0);
 | 
			
		||||
  if (tp->m_entity.m_qos)
 | 
			
		||||
    nn_xqos_mergein_missing (wqos, tp->m_entity.m_qos, ~(uint64_t)0);
 | 
			
		||||
  nn_xqos_mergein_missing (wqos, &pub->m_entity.m_domain->gv.default_xqos_wr, ~(uint64_t)0);
 | 
			
		||||
 | 
			
		||||
    if (tp->m_entity.m_qos) {
 | 
			
		||||
        /* merge topic qos data to writer qos */
 | 
			
		||||
        dds_merge_qos(wqos, tp->m_entity.m_qos);
 | 
			
		||||
    }
 | 
			
		||||
    nn_xqos_mergein_missing(wqos, &gv.default_xqos_wr);
 | 
			
		||||
  if ((rc = nn_xqos_valid (&pub->m_entity.m_domain->gv.logconfig, wqos)) < 0)
 | 
			
		||||
  {
 | 
			
		||||
    dds_delete_qos(wqos);
 | 
			
		||||
    goto err_bad_qos;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
    ret = dds_writer_qos_validate(wqos, false);
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        dds_delete_qos(wqos);
 | 
			
		||||
        writer = ret;
 | 
			
		||||
        goto err_bad_qos;
 | 
			
		||||
    }
 | 
			
		||||
  /* Create writer */
 | 
			
		||||
  wr = dds_alloc (sizeof (*wr));
 | 
			
		||||
  writer = dds_entity_init (&wr->m_entity, &pub->m_entity, DDS_KIND_WRITER, wqos, listener, DDS_WRITER_STATUS_MASK);
 | 
			
		||||
 | 
			
		||||
    /* Create writer */
 | 
			
		||||
    wr = dds_alloc(sizeof (*wr));
 | 
			
		||||
    writer = dds_entity_init(&wr->m_entity, &pub->m_entity, DDS_KIND_WRITER, wqos, listener, DDS_WRITER_STATUS_MASK);
 | 
			
		||||
  wr->m_topic = tp;
 | 
			
		||||
  dds_entity_add_ref_locked (&tp->m_entity);
 | 
			
		||||
  wr->m_xp = nn_xpack_new (conn, get_bandwidth_limit (wqos->transport_priority), pub->m_entity.m_domain->gv.config.xpack_send_async);
 | 
			
		||||
  wr->m_whc = make_whc (pub->m_entity.m_domain, wqos);
 | 
			
		||||
  wr->whc_batch = pub->m_entity.m_domain->gv.config.whc_batch;
 | 
			
		||||
 | 
			
		||||
    wr->m_topic = tp;
 | 
			
		||||
    dds_entity_add_ref_nolock(&tp->m_entity);
 | 
			
		||||
    wr->m_xp = nn_xpack_new(conn, get_bandwidth_limit(wqos->transport_priority), config.xpack_send_async);
 | 
			
		||||
    wr->m_entity.m_deriver.close = dds_writer_close;
 | 
			
		||||
    wr->m_entity.m_deriver.delete = dds_writer_delete;
 | 
			
		||||
    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. */
 | 
			
		||||
  dds_handle_repin (&wr->m_entity.m_hdllink);
 | 
			
		||||
 | 
			
		||||
    /* 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. */
 | 
			
		||||
    dds_handle_claim_inc (&wr->m_entity.m_hdllink);
 | 
			
		||||
  ddsrt_mutex_unlock (&tp->m_entity.m_mutex);
 | 
			
		||||
  ddsrt_mutex_unlock (&pub->m_entity.m_mutex);
 | 
			
		||||
 | 
			
		||||
    ddsrt_mutex_unlock (&tp->m_entity.m_mutex);
 | 
			
		||||
    ddsrt_mutex_unlock (&pub->m_entity.m_mutex);
 | 
			
		||||
  thread_state_awake (lookup_thread_state (), &pub->m_entity.m_domain->gv);
 | 
			
		||||
  rc = new_writer (&wr->m_wr, &wr->m_entity.m_domain->gv, &wr->m_entity.m_guid, NULL, &pub->m_entity.m_participant->m_guid, tp->m_stopic, wqos, wr->m_whc, dds_writer_status_cb, wr);
 | 
			
		||||
  ddsrt_mutex_lock (&pub->m_entity.m_mutex);
 | 
			
		||||
  ddsrt_mutex_lock (&tp->m_entity.m_mutex);
 | 
			
		||||
  assert(rc == DDS_RETCODE_OK);
 | 
			
		||||
  thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
 | 
			
		||||
    thread_state_awake (lookup_thread_state ());
 | 
			
		||||
    ret = new_writer(&wr->m_wr, &wr->m_entity.m_guid, NULL, &pub->m_entity.m_participant->m_guid, tp->m_stopic, wqos, wr->m_whc, dds_writer_status_cb, wr);
 | 
			
		||||
    ddsrt_mutex_lock (&pub->m_entity.m_mutex);
 | 
			
		||||
    ddsrt_mutex_lock (&tp->m_entity.m_mutex);
 | 
			
		||||
    assert(ret == DDS_RETCODE_OK);
 | 
			
		||||
    thread_state_asleep (lookup_thread_state ());
 | 
			
		||||
    dds_topic_unlock(tp);
 | 
			
		||||
    dds_publisher_unlock(pub);
 | 
			
		||||
    return writer;
 | 
			
		||||
  wr->m_entity.m_iid = get_entity_instance_id (&wr->m_entity.m_domain->gv, &wr->m_entity.m_guid);
 | 
			
		||||
  dds_entity_register_child (&pub->m_entity, &wr->m_entity);
 | 
			
		||||
 | 
			
		||||
  dds_topic_unlock (tp);
 | 
			
		||||
  dds_publisher_unlock (pub);
 | 
			
		||||
  return writer;
 | 
			
		||||
 | 
			
		||||
err_bad_qos:
 | 
			
		||||
    dds_topic_unlock(tp);
 | 
			
		||||
  dds_topic_unlock (tp);
 | 
			
		||||
err_tp_lock:
 | 
			
		||||
    dds_publisher_unlock(pub);
 | 
			
		||||
    if((pub->m_entity.m_flags & DDS_ENTITY_IMPLICIT) != 0){
 | 
			
		||||
        (void)dds_delete(publisher);
 | 
			
		||||
    }
 | 
			
		||||
err_pub_lock:
 | 
			
		||||
    return writer;
 | 
			
		||||
  dds_publisher_unlock (pub);
 | 
			
		||||
  if ((pub->m_entity.m_flags & DDS_ENTITY_IMPLICIT) != 0){
 | 
			
		||||
    (void )dds_delete (publisher);
 | 
			
		||||
  }
 | 
			
		||||
  return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_entity_t
 | 
			
		||||
dds_get_publisher(
 | 
			
		||||
    dds_entity_t writer)
 | 
			
		||||
dds_entity_t dds_get_publisher (dds_entity_t writer)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity *e;
 | 
			
		||||
  dds_retcode_t rc;
 | 
			
		||||
  if ((rc = dds_entity_claim (writer, &e)) != DDS_RETCODE_OK)
 | 
			
		||||
    return DDS_ERRNO (rc);
 | 
			
		||||
  dds_return_t rc;
 | 
			
		||||
  if ((rc = dds_entity_pin (writer, &e)) != DDS_RETCODE_OK)
 | 
			
		||||
    return rc;
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    dds_entity_t pubh;
 | 
			
		||||
    if (dds_entity_kind (e) != DDS_KIND_WRITER)
 | 
			
		||||
      pubh = DDS_ERRNO (DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
      pubh = DDS_RETCODE_ILLEGAL_OPERATION;
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      assert (dds_entity_kind (e->m_parent) == DDS_KIND_PUBLISHER);
 | 
			
		||||
      pubh = e->m_parent->m_hdllink.hdl;
 | 
			
		||||
    }
 | 
			
		||||
    dds_entity_release (e);
 | 
			
		||||
    dds_entity_unpin (e);
 | 
			
		||||
    return pubh;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_get_publication_matched_status (
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_publication_matched_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking writer\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
        *status = wr->m_publication_matched_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&wr->m_entity.m_observers_lock);
 | 
			
		||||
    if (wr->m_entity.m_status_enable & DDS_PUBLICATION_MATCHED_STATUS) {
 | 
			
		||||
        wr->m_publication_matched_status.total_count_change = 0;
 | 
			
		||||
        wr->m_publication_matched_status.current_count_change = 0;
 | 
			
		||||
        dds_entity_status_reset(&wr->m_entity, DDS_PUBLICATION_MATCHED_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->m_entity.m_observers_lock);
 | 
			
		||||
    dds_writer_unlock(wr);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_get_liveliness_lost_status (
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_liveliness_lost_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking writer\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
      *status = wr->m_liveliness_lost_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&wr->m_entity.m_observers_lock);
 | 
			
		||||
    if (wr->m_entity.m_status_enable & DDS_LIVELINESS_LOST_STATUS) {
 | 
			
		||||
      wr->m_liveliness_lost_status.total_count_change = 0;
 | 
			
		||||
      dds_entity_status_reset(&wr->m_entity, DDS_LIVELINESS_LOST_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->m_entity.m_observers_lock);
 | 
			
		||||
    dds_writer_unlock(wr);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_get_offered_deadline_missed_status(
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_offered_deadline_missed_status_t *status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking writer\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
      *status = wr->m_offered_deadline_missed_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&wr->m_entity.m_observers_lock);
 | 
			
		||||
    if (wr->m_entity.m_status_enable & DDS_OFFERED_DEADLINE_MISSED_STATUS) {
 | 
			
		||||
      wr->m_offered_deadline_missed_status.total_count_change = 0;
 | 
			
		||||
      dds_entity_status_reset(&wr->m_entity, DDS_OFFERED_DEADLINE_MISSED_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->m_entity.m_observers_lock);
 | 
			
		||||
    dds_writer_unlock(wr);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dds_return_t
 | 
			
		||||
dds_get_offered_incompatible_qos_status (
 | 
			
		||||
    dds_entity_t writer,
 | 
			
		||||
    dds_offered_incompatible_qos_status_t * status)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_writer *wr;
 | 
			
		||||
    dds_return_t ret = DDS_RETCODE_OK;
 | 
			
		||||
 | 
			
		||||
    rc = dds_writer_lock(writer, &wr);
 | 
			
		||||
    if (rc != DDS_RETCODE_OK) {
 | 
			
		||||
        DDS_ERROR("Error occurred on locking writer\n");
 | 
			
		||||
        ret = DDS_ERRNO(rc);
 | 
			
		||||
        goto fail;
 | 
			
		||||
    }
 | 
			
		||||
    /* status = NULL, application do not need the status, but reset the counter & triggered bit */
 | 
			
		||||
    if (status) {
 | 
			
		||||
      *status = wr->m_offered_incompatible_qos_status;
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_lock (&wr->m_entity.m_observers_lock);
 | 
			
		||||
    if (wr->m_entity.m_status_enable & DDS_OFFERED_INCOMPATIBLE_QOS_STATUS) {
 | 
			
		||||
      wr->m_offered_incompatible_qos_status.total_count_change = 0;
 | 
			
		||||
      dds_entity_status_reset(&wr->m_entity, DDS_OFFERED_INCOMPATIBLE_QOS_STATUS);
 | 
			
		||||
    }
 | 
			
		||||
    ddsrt_mutex_unlock (&wr->m_entity.m_observers_lock);
 | 
			
		||||
    dds_writer_unlock(wr);
 | 
			
		||||
fail:
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
DDS_GET_STATUS(writer, publication_matched, PUBLICATION_MATCHED, total_count_change, current_count_change)
 | 
			
		||||
DDS_GET_STATUS(writer, liveliness_lost, LIVELINESS_LOST, total_count_change)
 | 
			
		||||
DDS_GET_STATUS(writer, offered_deadline_missed, OFFERED_DEADLINE_MISSED, total_count_change)
 | 
			
		||||
DDS_GET_STATUS(writer, offered_incompatible_qos, OFFERED_INCOMPATIBLE_QOS, total_count_change)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,7 +49,7 @@ static void config__check_env(
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        if ( !env_ok ) {
 | 
			
		||||
            dds_retcode_t r;
 | 
			
		||||
            dds_return_t r;
 | 
			
		||||
 | 
			
		||||
            r = ddsrt_setenv(env_variable, expected_value);
 | 
			
		||||
            CU_ASSERT_EQUAL_FATAL(r, DDS_RETCODE_OK);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,24 +13,23 @@
 | 
			
		|||
<CycloneDDS>
 | 
			
		||||
  <!-- Simple config-file for testing whether a config-file can be picked up
 | 
			
		||||
       correctly. -->
 | 
			
		||||
  <Domain>
 | 
			
		||||
    <Id>3</Id>
 | 
			
		||||
  <Domain id="3">
 | 
			
		||||
    <General>
 | 
			
		||||
      <NetworkInterfaceAddress>127.0.0.1</NetworkInterfaceAddress>
 | 
			
		||||
      <AllowMulticast>true</AllowMulticast>
 | 
			
		||||
      <EnableMulticastLoopback>true</EnableMulticastLoopback>
 | 
			
		||||
    </General>
 | 
			
		||||
    <Compatibility>
 | 
			
		||||
      <StandardsConformance>lax</StandardsConformance>
 | 
			
		||||
    </Compatibility>
 | 
			
		||||
    <Tracing>
 | 
			
		||||
      <Verbosity>warning</Verbosity>
 | 
			
		||||
      <OutputFile>vortexdds-<![CDATA[trace]]>.${NON_EXISTENT_ENV_VARIABLE:-l}${CYCLONEDDS_URI:+o}g </OutputFile>
 | 
			
		||||
    </Tracing>
 | 
			
		||||
    <Internal>
 | 
			
		||||
      <MaxParticipants>${MAX_PARTICIPANTS}</MaxParticipants>
 | 
			
		||||
      <HeartbeatInterval max="10 s"> 100 ms </HeartbeatInterval>
 | 
			
		||||
      <RediscoveryBlacklistDuration></RediscoveryBlacklistDuration>
 | 
			
		||||
    </Internal>
 | 
			
		||||
  </Domain>
 | 
			
		||||
  <General>
 | 
			
		||||
    <NetworkInterfaceAddress>127.0.0.1</NetworkInterfaceAddress>
 | 
			
		||||
    <AllowMulticast>true</AllowMulticast>
 | 
			
		||||
    <EnableMulticastLoopback>true</EnableMulticastLoopback>
 | 
			
		||||
  </General>
 | 
			
		||||
  <Compatibility>
 | 
			
		||||
    <StandardsConformance>lax</StandardsConformance>
 | 
			
		||||
  </Compatibility>
 | 
			
		||||
  <Tracing>
 | 
			
		||||
    <Verbosity>warning</Verbosity>
 | 
			
		||||
    <OutputFile>vortexdds-<![CDATA[trace]]>.${NON_EXISTENT_ENV_VARIABLE:-l}${CYCLONEDDS_URI:+o}g </OutputFile>
 | 
			
		||||
  </Tracing>
 | 
			
		||||
  <Internal>
 | 
			
		||||
    <MaxParticipants>${MAX_PARTICIPANTS}</MaxParticipants>
 | 
			
		||||
    <HeartbeatInterval max="10 s"> 100 ms </HeartbeatInterval>
 | 
			
		||||
    <RediscoveryBlacklistDuration></RediscoveryBlacklistDuration>
 | 
			
		||||
  </Internal>
 | 
			
		||||
</CycloneDDS>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -153,7 +153,7 @@ CU_Test(ddsc_writedispose, deleted, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_writedispose(g_writer, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -164,7 +164,7 @@ CU_Test(ddsc_writedispose, null, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_writedispose(g_writer, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -174,13 +174,12 @@ CU_TheoryDataPoints(ddsc_writedispose, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_writedispose, invalid_writers, .init=disposing_init, .fini=disposing_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_writedispose(writer, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +193,7 @@ CU_Theory((dds_entity_t *writer), ddsc_writedispose, non_writers, .init=disposin
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_writedispose(*writer, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -290,7 +289,7 @@ CU_Test(ddsc_writedispose, timeout, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    ret = dds_writedispose(g_writer, &newInstance1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_writedispose(g_writer, &newInstance2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_TIMEOUT);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_TIMEOUT);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -310,7 +309,7 @@ CU_Test(ddsc_writedispose_ts, deleted, .init=disposing_init, .fini=disposing_fin
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_writedispose_ts(g_writer, NULL, g_present);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -321,7 +320,7 @@ CU_Test(ddsc_writedispose_ts, null, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_writedispose_ts(g_writer, NULL, g_present);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -335,7 +334,7 @@ CU_Test(ddsc_writedispose_ts, timeout, .init=disposing_init, .fini=disposing_fin
 | 
			
		|||
    ret = dds_writedispose_ts(g_writer, &newInstance1, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_writedispose_ts(g_writer, &newInstance2, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_TIMEOUT);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_TIMEOUT);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -345,13 +344,12 @@ CU_TheoryDataPoints(ddsc_writedispose_ts, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_writedispose_ts, invalid_writers, .init=disposing_init, .fini=disposing_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_writedispose_ts(writer, NULL, g_present);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -365,7 +363,7 @@ CU_Theory((dds_entity_t *writer), ddsc_writedispose_ts, non_writers, .init=dispo
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_writedispose_ts(*writer, NULL, g_present);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -510,7 +508,7 @@ CU_Test(ddsc_dispose, deleted, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_dispose(g_writer, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -521,7 +519,7 @@ CU_Test(ddsc_dispose, null, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_dispose(g_writer, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -535,7 +533,7 @@ CU_Test(ddsc_dispose, timeout, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    ret = dds_dispose(g_writer, &newInstance1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_dispose(g_writer, &newInstance2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_TIMEOUT);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_TIMEOUT);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -545,13 +543,12 @@ CU_TheoryDataPoints(ddsc_dispose, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_dispose, invalid_writers, .init=disposing_init, .fini=disposing_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_dispose(writer, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -563,9 +560,10 @@ CU_Theory((dds_entity_t *writer), ddsc_dispose, non_writers, .init=disposing_ini
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_dispose(*writer, NULL);
 | 
			
		||||
    /* pass a non-null pointer that'll trigger a crash if it is read */
 | 
			
		||||
    ret = dds_dispose(*writer, (void *) 1);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -665,7 +663,7 @@ CU_Test(ddsc_dispose_ts, deleted, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_dispose_ts(g_writer, NULL, g_present);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -676,7 +674,7 @@ CU_Test(ddsc_dispose_ts, null, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_dispose_ts(g_writer, NULL, g_present);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -690,7 +688,7 @@ CU_Test(ddsc_dispose_ts, timeout, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    ret = dds_dispose_ts(g_writer, &newInstance1, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_dispose_ts(g_writer, &newInstance2, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_TIMEOUT);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_TIMEOUT);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -700,13 +698,12 @@ CU_TheoryDataPoints(ddsc_dispose_ts, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_dispose_ts, invalid_writers, .init=disposing_init, .fini=disposing_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_dispose_ts(writer, NULL, g_present);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -718,9 +715,10 @@ CU_Theory((dds_entity_t *writer), ddsc_dispose_ts, non_writers, .init=disposing_
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_dispose_ts(*writer, NULL, g_present);
 | 
			
		||||
    /* pass a non-null pointer that'll trigger a crash if it is read */
 | 
			
		||||
    ret = dds_dispose_ts(*writer, (void *) 1, g_present);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -861,7 +859,7 @@ CU_Test(ddsc_dispose_ih, deleted, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    ret = dds_dispose_ih(g_writer, DDS_HANDLE_NIL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -873,7 +871,7 @@ CU_Theory((dds_instance_handle_t handle), ddsc_dispose_ih, invalid_handles, .ini
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_dispose_ih(g_writer, handle);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -883,11 +881,10 @@ CU_TheoryDataPoints(ddsc_dispose_ih, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_dispose_ih, invalid_writers, .init=disposing_init, .fini=disposing_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_dispose_ih(writer, DDS_HANDLE_NIL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -899,7 +896,7 @@ CU_Theory((dds_entity_t *writer), ddsc_dispose_ih, non_writers, .init=disposing_
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_dispose_ih(*writer, DDS_HANDLE_NIL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -959,7 +956,7 @@ CU_Test(ddsc_dispose_ih_ts, deleted, .init=disposing_init, .fini=disposing_fini)
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    ret = dds_dispose_ih_ts(g_writer, DDS_HANDLE_NIL, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -971,7 +968,7 @@ CU_Theory((dds_instance_handle_t handle), ddsc_dispose_ih_ts, invalid_handles, .
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_dispose_ih_ts(g_writer, handle, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -981,11 +978,10 @@ CU_TheoryDataPoints(ddsc_dispose_ih_ts, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_dispose_ih_ts, invalid_writers, .init=disposing_init, .fini=disposing_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_dispose_ih_ts(writer, DDS_HANDLE_NIL, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -997,7 +993,7 @@ CU_Theory((dds_entity_t *writer), ddsc_dispose_ih_ts, non_writers, .init=disposi
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_dispose_ih_ts(*writer, DDS_HANDLE_NIL, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,10 +23,8 @@
 | 
			
		|||
 | 
			
		||||
static dds_entity_t entity = -1;
 | 
			
		||||
 | 
			
		||||
#define cu_assert_status_eq(s1, s2) CU_ASSERT_FATAL(dds_err_nr(s1)== s2)
 | 
			
		||||
 | 
			
		||||
/* Fixture to create prerequisite entity */
 | 
			
		||||
void create_entity(void)
 | 
			
		||||
static void create_entity(void)
 | 
			
		||||
{
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(entity, -1);
 | 
			
		||||
    entity = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
| 
						 | 
				
			
			@ -34,11 +32,11 @@ void create_entity(void)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
/* Fixture to delete prerequisite entity */
 | 
			
		||||
void delete_entity(void)
 | 
			
		||||
static void delete_entity(void)
 | 
			
		||||
{
 | 
			
		||||
    CU_ASSERT_FATAL(entity > 0);
 | 
			
		||||
    dds_return_t ret = dds_delete(entity);
 | 
			
		||||
    cu_assert_status_eq(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    entity = -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -55,20 +53,20 @@ CU_Test(ddsc_entity, enable, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
 | 
			
		||||
    /* Check enabling with bad parameters. */
 | 
			
		||||
    status = dds_enable(0);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Check actual enabling. */
 | 
			
		||||
    /* TODO: CHAM-96: Check enabling.
 | 
			
		||||
    status = dds_enable(&entity);
 | 
			
		||||
    cu_assert_status_eq(status, dds_err_nr(DDS_RETCODE_OK), "dds_enable (delayed enable)");
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK, "dds_enable (delayed enable)");
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    /* Check re-enabling (should be a noop). */
 | 
			
		||||
    status = dds_enable(entity);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void entity_qos_get_set(dds_entity_t e, const char* info)
 | 
			
		||||
static void entity_qos_get_set(dds_entity_t e, const char* info)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t status;
 | 
			
		||||
    dds_qos_t *qos = dds_create_qos();
 | 
			
		||||
| 
						 | 
				
			
			@ -77,10 +75,10 @@ void entity_qos_get_set(dds_entity_t e, const char* info)
 | 
			
		|||
 | 
			
		||||
    /* Get QoS. */
 | 
			
		||||
    status = dds_get_qos (e, qos);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    status = dds_set_qos (e, qos); /* Doesn't change anything, so no need to forbid. But we return NOT_SUPPORTED anyway for now*/
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    dds_delete_qos(qos);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -95,19 +93,19 @@ CU_Test(ddsc_entity, qos, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
 | 
			
		||||
    /* Check getting QoS with bad parameters. */
 | 
			
		||||
    status = dds_get_qos (0, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_qos (entity, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_qos (0, qos);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Check setting QoS with bad parameters. */
 | 
			
		||||
    status = dds_set_qos (0, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_set_qos (entity, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_set_qos (0, qos);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Check set/get with entity without initial qos. */
 | 
			
		||||
    entity_qos_get_set(entity, "{without initial qos}");
 | 
			
		||||
| 
						 | 
				
			
			@ -145,15 +143,15 @@ CU_Test(ddsc_entity, listener, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
 | 
			
		||||
    /* Check getting Listener with bad parameters. */
 | 
			
		||||
    status = dds_get_listener (0, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_listener (entity, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_listener (0, l1);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Get Listener, which should be unset. */
 | 
			
		||||
    status = dds_get_listener (entity, l1);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    dds_lget_liveliness_changed (l1, (dds_on_liveliness_changed_fn*)&cb1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb1, DDS_LUNSET);
 | 
			
		||||
    dds_lget_requested_deadline_missed (l1, (dds_on_requested_deadline_missed_fn*)&cb1);
 | 
			
		||||
| 
						 | 
				
			
			@ -165,15 +163,15 @@ CU_Test(ddsc_entity, listener, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
 | 
			
		||||
    /* Check setting Listener with bad parameters. */
 | 
			
		||||
    status = dds_set_listener (0, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_set_listener (0, l2);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Getting after setting should return set listener. */
 | 
			
		||||
    status = dds_set_listener (entity, l2);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    status = dds_get_listener (entity, l1);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    dds_lget_liveliness_changed (l1, (dds_on_liveliness_changed_fn*)&cb1);
 | 
			
		||||
    dds_lget_liveliness_changed (l2, (dds_on_liveliness_changed_fn*)&cb2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb1, cb2);
 | 
			
		||||
| 
						 | 
				
			
			@ -189,9 +187,9 @@ CU_Test(ddsc_entity, listener, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
 | 
			
		||||
    /* Reset listener. */
 | 
			
		||||
    status = dds_set_listener (entity, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    status = dds_get_listener (entity, l2);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    dds_lget_liveliness_changed (l2, (dds_on_liveliness_changed_fn*)&cb2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb2, DDS_LUNSET);
 | 
			
		||||
    dds_lget_requested_deadline_missed (l2, (dds_on_requested_deadline_missed_fn*)&cb2);
 | 
			
		||||
| 
						 | 
				
			
			@ -215,46 +213,46 @@ CU_Test(ddsc_entity, status, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
 | 
			
		||||
    /* Check getting Status with bad parameters. */
 | 
			
		||||
    status1 = dds_get_status_mask (0, NULL);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status1 = dds_get_status_mask (entity, NULL);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status1 = dds_get_status_mask (0, &s1);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Get Status, which should be 0 for a participant. */
 | 
			
		||||
    status1 = dds_get_status_mask (entity, &s1);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(s1, 0);
 | 
			
		||||
 | 
			
		||||
    /* Check setting Status with bad parameters. */
 | 
			
		||||
    status1 = dds_set_status_mask (0, 0);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* I shouldn't be able to set statuses on a participant. */
 | 
			
		||||
    status1 = dds_set_status_mask (entity, 0);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_OK);
 | 
			
		||||
    status1 = dds_set_status_mask (entity, DDS_DATA_AVAILABLE_STATUS);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Check getting Status changes with bad parameters. */
 | 
			
		||||
    status1 = dds_get_status_changes (0, NULL);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status1 = dds_get_status_changes (entity, NULL);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status1 = dds_get_status_changes (0, &s1);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status1 = dds_get_status_changes (entity, &s1);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    /* Status read and take shouldn't work either. */
 | 
			
		||||
    status1 = dds_read_status (0, &s1, 0);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status1 = dds_read_status (entity, &s1, 0);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_OK);
 | 
			
		||||
    status1 = dds_take_status (0, &s1, 0);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status1 = dds_take_status (entity, &s1, 0);
 | 
			
		||||
    cu_assert_status_eq(status1, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status1, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -268,15 +266,15 @@ CU_Test(ddsc_entity, instance_handle, .init = create_entity, .fini = delete_enti
 | 
			
		|||
 | 
			
		||||
    /* Check getting Handle with bad parameters. */
 | 
			
		||||
    status = dds_get_instance_handle (0, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_instance_handle (entity, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_instance_handle (0, &hdl);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Get Instance Handle, which should not be 0 for a participant. */
 | 
			
		||||
    status = dds_get_instance_handle (entity, &hdl);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_NOT_EQUAL_FATAL(hdl, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -290,17 +288,17 @@ CU_Test(ddsc_entity, get_entities, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
 | 
			
		||||
    /* Check getting Parent with bad parameters. */
 | 
			
		||||
    par = dds_get_parent (0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(par), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(par, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Get Parent, a participant doesn't have a parent. */
 | 
			
		||||
    par = dds_get_parent (entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(par), DDS_ENTITY_NIL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(par, DDS_ENTITY_NIL);
 | 
			
		||||
 | 
			
		||||
    /* ---------- Get Participant ------------ */
 | 
			
		||||
 | 
			
		||||
    /* Check getting Participant with bad parameters. */
 | 
			
		||||
    par = dds_get_participant (0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(par), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(par, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Get Participant, a participants' participant is itself. */
 | 
			
		||||
    par = dds_get_participant (entity);
 | 
			
		||||
| 
						 | 
				
			
			@ -310,15 +308,15 @@ CU_Test(ddsc_entity, get_entities, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
 | 
			
		||||
    /* Check getting Children with bad parameters. */
 | 
			
		||||
    status = dds_get_children (0, &child, 1);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_children (entity, NULL, 1);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_children (entity, &child, 0);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_children (0, NULL, 1);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_children (0, &child, 0);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Get Children, of which there are currently none. */
 | 
			
		||||
    status = dds_get_children (entity, NULL, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -338,30 +336,30 @@ CU_Test(ddsc_entity, get_entities, .init = create_entity, .fini = delete_entity)
 | 
			
		|||
CU_Test(ddsc_entity, get_domainid, .init = create_entity, .fini = delete_entity)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t status;
 | 
			
		||||
    dds_domainid_t id = -1;
 | 
			
		||||
    dds_domainid_t id = DDS_DOMAIN_DEFAULT;
 | 
			
		||||
 | 
			
		||||
    /* Check getting ID with bad parameters. */
 | 
			
		||||
    status = dds_get_domainid (0, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_domainid (entity, NULL);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    status = dds_get_domainid (0, &id);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    /* Get and check the domain id. */
 | 
			
		||||
    status = dds_get_domainid (entity, &id);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_FATAL(id != -1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_FATAL(id != DDS_DOMAIN_DEFAULT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_entity, delete, .init = create_entity)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t status;
 | 
			
		||||
    status = dds_delete(0);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    status = dds_delete(entity);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    entity = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -125,43 +125,43 @@ CU_Test(ddsc_entity_delete, recursive, .init=hierarchy_init, .fini=hierarchy_fin
 | 
			
		|||
 | 
			
		||||
    /* First be sure that 'dds_get_domainid' returns ok. */
 | 
			
		||||
    ret = dds_get_domainid(g_participant, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_get_domainid(g_topic, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_get_domainid(g_publisher, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_get_domainid(g_subscriber, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_get_domainid(g_writer, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_get_domainid(g_reader, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_get_domainid(g_readcond, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_get_domainid(g_querycond, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    /* Deleting the top dog (participant) should delete all children. */
 | 
			
		||||
    ret = dds_delete(g_participant);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    /* Check if all the entities are deleted now. */
 | 
			
		||||
    ret = dds_get_domainid(g_participant, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ret = dds_get_domainid(g_topic, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ret = dds_get_domainid(g_publisher, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ret = dds_get_domainid(g_subscriber, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ret = dds_get_domainid(g_writer, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ret = dds_get_domainid(g_reader, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ret = dds_get_domainid(g_readcond, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ret = dds_get_domainid(g_querycond, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -190,22 +190,22 @@ CU_Test(ddsc_entity_delete, recursive_with_deleted_topic)
 | 
			
		|||
     * reference to the topic and thus will delete it when it itself is
 | 
			
		||||
     * deleted. */
 | 
			
		||||
    ret = dds_delete(g_topic);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    /* Third, deleting the participant should delete all children of which
 | 
			
		||||
     * the writer with the last topic reference is one. */
 | 
			
		||||
    ret = dds_delete(g_participant);
 | 
			
		||||
    /* Before the CHAM-424 fix, we would not get here because of a crash,
 | 
			
		||||
     * or it (incidentally) continued but returned an error. */
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    /* Check if the entities are actually deleted. */
 | 
			
		||||
    ret = dds_get_domainid(g_participant, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER );
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER );
 | 
			
		||||
    ret = dds_get_domainid(g_topic, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    ret = dds_get_domainid(g_writer, &id);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    dds_delete(g_keep);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -240,7 +240,7 @@ CU_Theory((dds_entity_t *entity), ddsc_entity_get_participant, deleted_entities,
 | 
			
		|||
    dds_entity_t participant;
 | 
			
		||||
    dds_delete(*entity);
 | 
			
		||||
    participant = dds_get_participant(*entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(participant), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(participant, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -250,11 +250,10 @@ CU_TheoryDataPoints(ddsc_entity_get_participant, invalid_entities) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t entity), ddsc_entity_get_participant, invalid_entities, .init=hierarchy_init, .fini=hierarchy_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t participant;
 | 
			
		||||
 | 
			
		||||
    participant = dds_get_participant(entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(participant), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(participant, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -314,7 +313,7 @@ CU_Test(ddsc_entity_get_parent, participant, .init=hierarchy_init, .fini=hierarc
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t parent;
 | 
			
		||||
    parent = dds_get_parent(g_participant);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(parent), DDS_ENTITY_NIL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(parent, DDS_ENTITY_NIL);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -327,7 +326,7 @@ CU_Theory((dds_entity_t *entity), ddsc_entity_get_parent, deleted_entities, .ini
 | 
			
		|||
    dds_entity_t parent;
 | 
			
		||||
    dds_delete(*entity);
 | 
			
		||||
    parent = dds_get_parent(*entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(parent), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(parent, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -337,11 +336,10 @@ CU_TheoryDataPoints(ddsc_entity_get_parent, invalid_entities) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t entity), ddsc_entity_get_parent, invalid_entities, .init=hierarchy_init, .fini=hierarchy_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t parent;
 | 
			
		||||
 | 
			
		||||
    parent = dds_get_parent(entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(parent), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(parent, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -369,7 +367,7 @@ CU_Test(ddsc_entity_get_children, invalid_size, .init=hierarchy_init, .fini=hier
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_entity_t child;
 | 
			
		||||
    ret = dds_get_children(g_participant, &child, INT32_MAX);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -478,7 +476,7 @@ CU_Theory((dds_entity_t *entity), ddsc_entity_get_children, deleted_entities, .i
 | 
			
		|||
    dds_entity_t children[4];
 | 
			
		||||
    dds_delete(*entity);
 | 
			
		||||
    ret = dds_get_children(*entity, children, 4);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -488,12 +486,11 @@ CU_TheoryDataPoints(ddsc_entity_get_children, invalid_entities) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t entity), ddsc_entity_get_children, invalid_entities, .init=hierarchy_init, .fini=hierarchy_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t children[4];
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_children(entity, children, 4);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -527,7 +524,7 @@ CU_Theory((dds_entity_t *entity), ddsc_entity_get_topic, deleted_entities, .init
 | 
			
		|||
    dds_entity_t topic;
 | 
			
		||||
    dds_delete(*entity);
 | 
			
		||||
    topic = dds_get_topic(*entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -537,11 +534,10 @@ CU_TheoryDataPoints(ddsc_entity_get_topic, invalid_entities) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t entity), ddsc_entity_get_topic, invalid_entities, .init=hierarchy_init, .fini=hierarchy_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t topic;
 | 
			
		||||
 | 
			
		||||
    topic = dds_get_topic(entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -553,7 +549,7 @@ CU_Theory((dds_entity_t *entity), ddsc_entity_get_topic, non_data_entities, .ini
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t topic;
 | 
			
		||||
    topic = dds_get_topic(*entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -581,7 +577,7 @@ CU_Test(ddsc_entity_get_publisher, deleted_writer, .init=hierarchy_init, .fini=h
 | 
			
		|||
    dds_entity_t publisher;
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    publisher = dds_get_publisher(g_writer);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(publisher), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publisher, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -591,11 +587,10 @@ CU_TheoryDataPoints(ddsc_entity_get_publisher, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t entity), ddsc_entity_get_publisher, invalid_writers, .init=hierarchy_init, .fini=hierarchy_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t publisher;
 | 
			
		||||
 | 
			
		||||
    publisher = dds_get_publisher(entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(publisher), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publisher, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -607,7 +602,7 @@ CU_Theory((dds_entity_t *cond), ddsc_entity_get_publisher, non_writers, .init=hi
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t publisher;
 | 
			
		||||
    publisher = dds_get_publisher(*cond);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(publisher), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publisher, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -640,7 +635,7 @@ CU_Theory((dds_entity_t *entity), ddsc_entity_get_subscriber, deleted_readers, .
 | 
			
		|||
    dds_entity_t subscriber;
 | 
			
		||||
    dds_delete(*entity);
 | 
			
		||||
    subscriber = dds_get_subscriber(*entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(subscriber), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscriber, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -650,11 +645,10 @@ CU_TheoryDataPoints(ddsc_entity_get_subscriber, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t entity), ddsc_entity_get_subscriber, invalid_readers, .init=hierarchy_init, .fini=hierarchy_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t subscriber;
 | 
			
		||||
 | 
			
		||||
    subscriber = dds_get_subscriber(entity);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(subscriber), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscriber, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -666,7 +660,7 @@ CU_Theory((dds_entity_t *cond), ddsc_entity_get_subscriber, non_readers, .init=h
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t subscriber;
 | 
			
		||||
    subscriber = dds_get_subscriber(*cond);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(subscriber), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscriber, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -701,7 +695,7 @@ CU_Theory((dds_entity_t *cond), ddsc_entity_get_datareader, deleted_conds, .init
 | 
			
		|||
    dds_entity_t reader;
 | 
			
		||||
    dds_delete(*cond);
 | 
			
		||||
    reader = dds_get_datareader(*cond);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(reader), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(reader, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -711,11 +705,10 @@ CU_TheoryDataPoints(ddsc_entity_get_datareader, invalid_conds) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t cond), ddsc_entity_get_datareader, invalid_conds, .init=hierarchy_init, .fini=hierarchy_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t reader;
 | 
			
		||||
 | 
			
		||||
    reader = dds_get_datareader(cond);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(reader), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(reader, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -727,7 +720,7 @@ CU_Theory((dds_entity_t *cond), ddsc_entity_get_datareader, non_conds, .init=hie
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t reader;
 | 
			
		||||
    reader = dds_get_datareader(*cond);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(reader), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(reader, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -954,7 +947,7 @@ CU_Test(ddsc_entity_get_parent, implicit_publisher)
 | 
			
		|||
    dds_delete(writer);
 | 
			
		||||
 | 
			
		||||
    ret = dds_delete(parent);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    dds_delete(participant);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -985,7 +978,7 @@ CU_Test(ddsc_entity_get_parent, implicit_subscriber)
 | 
			
		|||
    dds_delete(reader);
 | 
			
		||||
 | 
			
		||||
    ret = dds_delete(parent);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    dds_delete(participant);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,7 +41,14 @@ static dds_time_t waitTimeout = DDS_SECS (2);
 | 
			
		|||
static dds_time_t shortTimeout = DDS_MSECS (10);
 | 
			
		||||
static dds_publication_matched_status_t publication_matched;
 | 
			
		||||
static dds_subscription_matched_status_t subscription_matched;
 | 
			
		||||
static dds_resource_limits_qospolicy_t resource_limits = {1,1,1};
 | 
			
		||||
 | 
			
		||||
struct reslimits {
 | 
			
		||||
  int32_t max_samples;
 | 
			
		||||
  int32_t max_instances;
 | 
			
		||||
  int32_t max_samples_per_instance;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct reslimits resource_limits = {1,1,1};
 | 
			
		||||
 | 
			
		||||
static dds_instance_handle_t reader_i_hdl = 0;
 | 
			
		||||
static dds_instance_handle_t writer_i_hdl = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -138,10 +145,19 @@ CU_Test(ddsc_entity_status, publication_matched, .init=init_entity_status, .fini
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count_change,   1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.last_subscription_handle, reader_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_publication_matched_status(wri, &publication_matched);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.current_count,        1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.current_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count,          1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count_change,   0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.last_subscription_handle, reader_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Getting the status should have reset the trigger,
 | 
			
		||||
     * meaning that the wait should timeout. */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetwr, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, 0);
 | 
			
		||||
 | 
			
		||||
    /* Un-match the publication by deleting the reader. */
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
| 
						 | 
				
			
			@ -156,6 +172,15 @@ CU_Test(ddsc_entity_status, publication_matched, .init=init_entity_status, .fini
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count,           1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count_change,    0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.last_subscription_handle, reader_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_publication_matched_status(wri, &publication_matched);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.current_count,        0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.current_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count,          1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count_change,   0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.last_subscription_handle, reader_i_hdl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_entity_status, subscription_matched, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
| 
						 | 
				
			
			@ -175,10 +200,19 @@ CU_Test(ddsc_entity_status, subscription_matched, .init=init_entity_status, .fin
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count_change,   1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.last_publication_handle, writer_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_subscription_matched_status(rea, &subscription_matched);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.current_count,        1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.current_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count,          1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count_change,   0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.last_publication_handle, writer_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Getting the status should have reset the trigger,
 | 
			
		||||
     * meaning that the wait should timeout. */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, 0);
 | 
			
		||||
 | 
			
		||||
    /* Un-match the subscription by deleting the writer. */
 | 
			
		||||
    dds_delete(wri);
 | 
			
		||||
| 
						 | 
				
			
			@ -193,6 +227,15 @@ CU_Test(ddsc_entity_status, subscription_matched, .init=init_entity_status, .fin
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count,           1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count_change,    0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.last_publication_handle, writer_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_subscription_matched_status(rea, &subscription_matched);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.current_count,        0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.current_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count,          1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count_change,   0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.last_publication_handle, writer_i_hdl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_entity, incompatible_qos, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
| 
						 | 
				
			
			@ -231,9 +274,16 @@ CU_Test(ddsc_entity, incompatible_qos, .init=init_entity_status, .fini=fini_enti
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(req_incompatible_qos.total_count_change,    1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(req_incompatible_qos.last_policy_id, DDS_DURABILITY_QOS_POLICY_ID);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_requested_incompatible_qos_status (reader2, &req_incompatible_qos);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(req_incompatible_qos.total_count,           1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(req_incompatible_qos.total_count_change,    0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(req_incompatible_qos.last_policy_id, DDS_DURABILITY_QOS_POLICY_ID);
 | 
			
		||||
 | 
			
		||||
    /*Getting the status should have reset the trigger, waitset should timeout */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, 0);
 | 
			
		||||
 | 
			
		||||
    /* Wait for offered incompatible QoS status */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetwr, wsresults, wsresultsize, waitTimeout);
 | 
			
		||||
| 
						 | 
				
			
			@ -244,9 +294,16 @@ CU_Test(ddsc_entity, incompatible_qos, .init=init_entity_status, .fini=fini_enti
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(off_incompatible_qos.total_count_change,    1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(off_incompatible_qos.last_policy_id, DDS_DURABILITY_QOS_POLICY_ID);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_offered_incompatible_qos_status (wri, &off_incompatible_qos);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(off_incompatible_qos.total_count,           1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(off_incompatible_qos.total_count_change,    0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(off_incompatible_qos.last_policy_id, DDS_DURABILITY_QOS_POLICY_ID);
 | 
			
		||||
 | 
			
		||||
    /*Getting the status should have reset the trigger, waitset should timeout */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, 0);
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_detach(waitSetrd, reader2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
| 
						 | 
				
			
			@ -278,9 +335,18 @@ CU_Test(ddsc_entity, liveliness_changed, .init=init_entity_status, .fini=fini_en
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change,0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_liveliness_changed_status (rea, &liveliness_changed);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count,           1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count_change,    0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count,       0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change,0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /*Getting the status should have reset the trigger, waitset should timeout */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, 0);
 | 
			
		||||
 | 
			
		||||
    /* Reset writer */
 | 
			
		||||
    ret = dds_waitset_detach(waitSetwr, wri);
 | 
			
		||||
| 
						 | 
				
			
			@ -298,6 +364,15 @@ CU_Test(ddsc_entity, liveliness_changed, .init=init_entity_status, .fini=fini_en
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count,       1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change,1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_i_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_liveliness_changed_status (rea, &liveliness_changed);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count,           0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count_change,    0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count,       1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change,0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_i_hdl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_entity, sample_rejected, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
| 
						 | 
				
			
			@ -339,9 +414,16 @@ CU_Test(ddsc_entity, sample_rejected, .init=init_entity_status, .fini=fini_entit
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(sample_rejected.total_count_change, 4);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_rejected.last_reason, DDS_REJECTED_BY_SAMPLES_LIMIT);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_sample_rejected_status (rea, &sample_rejected);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_rejected.total_count,        4);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_rejected.total_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_rejected.last_reason, DDS_REJECTED_BY_SAMPLES_LIMIT);
 | 
			
		||||
 | 
			
		||||
    /*Getting the status should have reset the trigger, waitset should timeout */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
| 
						 | 
				
			
			@ -370,7 +452,7 @@ Test(ddsc_entity, inconsistent_topic)
 | 
			
		|||
 | 
			
		||||
    /*Getting the status should have reset the trigger, waitset should timeout */
 | 
			
		||||
    status = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), 0, "returned %d", dds_err_nr(status));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, 0, "returned %d", status);
 | 
			
		||||
 | 
			
		||||
    /* Wait for sub inconsistent topic status callback */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, waitTimeout);
 | 
			
		||||
| 
						 | 
				
			
			@ -381,7 +463,7 @@ Test(ddsc_entity, inconsistent_topic)
 | 
			
		|||
 | 
			
		||||
    /*Getting the status should have reset the trigger, waitset should timeout */
 | 
			
		||||
    status = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, 0);
 | 
			
		||||
 | 
			
		||||
    dds_delete(top);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -426,12 +508,18 @@ CU_Test(ddsc_entity, sample_lost, .init=init_entity_status, .fini=fini_entity_st
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(ret, (dds_return_t)wsresultsize);
 | 
			
		||||
    ret = dds_get_sample_lost_status (rea, &sample_lost);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_lost.total_count,          1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_lost.total_count,        1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_lost.total_count_change, 1);
 | 
			
		||||
 | 
			
		||||
    /* Second call should reset the changed count. */
 | 
			
		||||
    ret = dds_get_sample_lost_status (rea, &sample_lost);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_lost.total_count,        1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_lost.total_count_change, 0);
 | 
			
		||||
 | 
			
		||||
    /*Getting the status should have reset the trigger, waitset should timeout */
 | 
			
		||||
    ret = dds_waitset_wait(waitSetrd, wsresults, wsresultsize, shortTimeout);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, 0);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -594,10 +682,9 @@ CU_TheoryDataPoints(ddsc_get_enabled_status, bad_param) = {
 | 
			
		|||
CU_Theory((dds_entity_t e), ddsc_get_enabled_status, bad_param, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask;
 | 
			
		||||
    dds_return_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_status_mask(e, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_get_enabled_status, deleted_reader, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
| 
						 | 
				
			
			@ -605,14 +692,14 @@ CU_Test(ddsc_get_enabled_status, deleted_reader, .init=init_entity_status, .fini
 | 
			
		|||
    uint32_t mask;
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_get_status_mask(rea, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_get_enabled_status, illegal, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask;
 | 
			
		||||
    ret = dds_get_status_mask(waitSetrd, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_TheoryDataPoints(ddsc_get_enabled_status, status_ok) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -632,23 +719,21 @@ CU_TheoryDataPoints(ddsc_set_enabled_status, bad_param) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t e), ddsc_set_enabled_status, bad_param, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_set_status_mask(e, 0 /*mask*/);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_set_enabled_status, deleted_reader, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_set_status_mask(rea, 0 /*mask*/);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_set_enabled_status, illegal, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_set_status_mask(waitSetrd, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_TheoryDataPoints(ddsc_set_enabled_status, status_ok) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -668,10 +753,9 @@ CU_TheoryDataPoints(ddsc_read_status, bad_param) = {
 | 
			
		|||
CU_Theory((dds_entity_t e), ddsc_read_status, bad_param, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_status(e, &status, 0 /*mask*/);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_read_status, deleted_reader, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
| 
						 | 
				
			
			@ -679,14 +763,14 @@ CU_Test(ddsc_read_status, deleted_reader, .init=init_entity_status, .fini=fini_e
 | 
			
		|||
    uint32_t status;
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_read_status(rea, &status, 0 /*mask*/);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_read_status, illegal, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
    ret = dds_read_status(waitSetrd, &status, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
CU_TheoryDataPoints(ddsc_read_status, status_ok) = {
 | 
			
		||||
        CU_DataPoints(dds_entity_t *,&rea, &wri, &participant, &top, &publisher, &subscriber),
 | 
			
		||||
| 
						 | 
				
			
			@ -702,14 +786,14 @@ CU_Test(ddsc_read_status, invalid_status_on_reader, .init=init_entity_status, .f
 | 
			
		|||
{
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
    ret = dds_read_status(rea, &status, DDS_PUBLICATION_MATCHED_STATUS);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_read_status, invalid_status_on_writer, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
    ret = dds_read_status(wri, &status, DDS_SUBSCRIPTION_MATCHED_STATUS);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -720,10 +804,9 @@ CU_TheoryDataPoints(ddsc_take_status, bad_param) = {
 | 
			
		|||
CU_Theory((dds_entity_t e), ddsc_take_status, bad_param, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_status(e, &status, 0 /*mask*/);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_take_status, deleted_reader, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
| 
						 | 
				
			
			@ -731,13 +814,13 @@ CU_Test(ddsc_take_status, deleted_reader, .init=init_entity_status, .fini=fini_e
 | 
			
		|||
    uint32_t status;
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_take_status(rea, &status, 0 /*mask*/);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
CU_Test(ddsc_take_status, illegal, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
    ret = dds_take_status(waitSetrd, &status, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_TheoryDataPoints(ddsc_take_status, status_ok) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -759,10 +842,9 @@ CU_TheoryDataPoints(ddsc_get_status_changes, bad_param) = {
 | 
			
		|||
CU_Theory((dds_entity_t e), ddsc_get_status_changes, bad_param, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_status_changes(e, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_get_status_changes, deleted_reader, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
| 
						 | 
				
			
			@ -770,14 +852,14 @@ CU_Test(ddsc_get_status_changes, deleted_reader, .init=init_entity_status, .fini
 | 
			
		|||
    uint32_t status;
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_get_status_changes(rea, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_get_status_changes, illegal, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
    ret = dds_get_status_changes(waitSetrd, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_TheoryDataPoints(ddsc_get_status_changes, status_ok) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -797,17 +879,15 @@ CU_TheoryDataPoints(ddsc_triggered, bad_param) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t e), ddsc_triggered, bad_param, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_triggered(e);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_triggered, deleted_reader, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_triggered(rea);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_TheoryDataPoints(ddsc_triggered, status_ok) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -825,7 +905,7 @@ CU_Test(ddsc_get_inconsistent_topic_status, inconsistent_topic_status, .init=ini
 | 
			
		|||
{
 | 
			
		||||
    dds_inconsistent_topic_status_t inconsistent_topic_status;
 | 
			
		||||
    ret = dds_get_inconsistent_topic_status(top, &inconsistent_topic_status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(inconsistent_topic_status.total_count,          0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(inconsistent_topic_status.total_count_change,   0);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -838,10 +918,9 @@ CU_TheoryDataPoints(ddsc_get_inconsistent_topic_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t topic), ddsc_get_inconsistent_topic_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_inconsistent_topic_status_t topic_status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_inconsistent_topic_status(topic, &topic_status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -850,7 +929,7 @@ CU_Test(ddsc_get_inconsistent_topic_status, null, .init=init_entity_status, .fin
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(top, 0);
 | 
			
		||||
    ret = dds_get_inconsistent_topic_status(top, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -861,7 +940,7 @@ CU_TheoryDataPoints(ddsc_get_inconsistent_topic_status, non_topics) = {
 | 
			
		|||
CU_Theory((dds_entity_t *topic), ddsc_get_inconsistent_topic_status, non_topics, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_inconsistent_topic_status(*topic, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -870,7 +949,7 @@ CU_Test(ddsc_get_inconsistent_topic_status, deleted_topic, .init=init_entity_sta
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(top);
 | 
			
		||||
    ret = dds_get_inconsistent_topic_status(top, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -881,10 +960,9 @@ CU_TheoryDataPoints(ddsc_get_publication_matched_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t writer), ddsc_get_publication_matched_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_publication_matched_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_publication_matched_status(writer, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -893,7 +971,7 @@ CU_Test(ddsc_get_publication_matched_status, null, .init=init_entity_status, .fi
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(wri, 0);
 | 
			
		||||
    ret = dds_get_publication_matched_status(wri, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -904,7 +982,7 @@ CU_TheoryDataPoints(ddsc_get_publication_matched_status, non_writers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *writer), ddsc_get_publication_matched_status, non_writers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_publication_matched_status(*writer, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -913,7 +991,7 @@ CU_Test(ddsc_get_publication_matched_status, deleted_writer, .init=init_entity_s
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(wri);
 | 
			
		||||
    ret = dds_get_publication_matched_status(wri, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -922,7 +1000,7 @@ CU_Test(ddsc_get_liveliness_lost_status, liveliness_lost_status, .init=init_enti
 | 
			
		|||
{
 | 
			
		||||
    dds_liveliness_lost_status_t liveliness_lost_status;
 | 
			
		||||
    ret = dds_get_liveliness_lost_status(wri, &liveliness_lost_status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_lost_status.total_count,        0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_lost_status.total_count_change, 0);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -935,10 +1013,9 @@ CU_TheoryDataPoints(ddsc_get_liveliness_lost_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t writer), ddsc_get_liveliness_lost_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_liveliness_lost_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_liveliness_lost_status(writer, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -947,7 +1024,7 @@ CU_Test(ddsc_get_liveliness_lost_status, null, .init=init_entity_status, .fini=f
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(wri, 0);
 | 
			
		||||
    ret = dds_get_liveliness_lost_status(wri, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -958,7 +1035,7 @@ CU_TheoryDataPoints(ddsc_get_liveliness_lost_status, non_writers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *writer), ddsc_get_liveliness_lost_status, non_writers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_liveliness_lost_status(*writer, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -967,7 +1044,7 @@ CU_Test(ddsc_get_liveliness_lost_status, deleted_writer, .init=init_entity_statu
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(wri);
 | 
			
		||||
    ret = dds_get_liveliness_lost_status(wri, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -976,7 +1053,7 @@ CU_Test(ddsc_get_offered_deadline_missed_status, offered_deadline_missed_status,
 | 
			
		|||
{
 | 
			
		||||
    dds_offered_deadline_missed_status_t offered_deadline_missed_status;
 | 
			
		||||
    ret = dds_get_offered_deadline_missed_status(wri, &offered_deadline_missed_status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(offered_deadline_missed_status.total_count,            0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(offered_deadline_missed_status.total_count_change,     0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(offered_deadline_missed_status.last_instance_handle,   0);
 | 
			
		||||
| 
						 | 
				
			
			@ -990,10 +1067,9 @@ CU_TheoryDataPoints(ddsc_get_offered_deadline_missed_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t writer), ddsc_get_offered_deadline_missed_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_offered_deadline_missed_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_offered_deadline_missed_status(writer, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1002,7 +1078,7 @@ CU_Test(ddsc_get_offered_deadline_missed_status, null, .init=init_entity_status,
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(wri, 0);
 | 
			
		||||
    ret = dds_get_offered_deadline_missed_status(wri, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1013,7 +1089,7 @@ CU_TheoryDataPoints(ddsc_get_offered_deadline_missed_status, non_writers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *writer), ddsc_get_offered_deadline_missed_status, non_writers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_offered_deadline_missed_status(*writer, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1022,7 +1098,7 @@ CU_Test(ddsc_get_offered_deadline_missed_status, deleted_writer, .init=init_enti
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(wri);
 | 
			
		||||
    ret = dds_get_offered_deadline_missed_status(wri, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1033,10 +1109,9 @@ CU_TheoryDataPoints(ddsc_get_offered_incompatible_qos_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t writer), ddsc_get_offered_incompatible_qos_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_offered_incompatible_qos_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_offered_incompatible_qos_status(writer, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1045,7 +1120,7 @@ CU_Test(ddsc_get_offered_incompatible_qos_status, null, .init=init_entity_status
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(wri, 0);
 | 
			
		||||
    ret = dds_get_offered_incompatible_qos_status(wri, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1056,7 +1131,7 @@ CU_TheoryDataPoints(ddsc_get_offered_incompatible_qos_status, non_writers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *writer), ddsc_get_offered_incompatible_qos_status, non_writers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_offered_incompatible_qos_status(*writer, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1065,7 +1140,7 @@ CU_Test(ddsc_get_offered_incompatible_qos_status, deleted_writer, .init=init_ent
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(wri);
 | 
			
		||||
    ret = dds_get_offered_incompatible_qos_status(wri, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1076,10 +1151,9 @@ CU_TheoryDataPoints(ddsc_get_subscription_matched_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t reader), ddsc_get_subscription_matched_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_subscription_matched_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_subscription_matched_status(reader, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1088,7 +1162,7 @@ CU_Test(ddsc_get_subscription_matched_status, null, .init=init_entity_status, .f
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(rea, 0);
 | 
			
		||||
    ret = dds_get_subscription_matched_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1099,7 +1173,7 @@ CU_TheoryDataPoints(ddsc_get_subscription_matched_status, non_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *reader), ddsc_get_subscription_matched_status, non_readers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_subscription_matched_status(*reader, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1108,7 +1182,7 @@ CU_Test(ddsc_get_subscription_matched_status, deleted_reader, .init=init_entity_
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_get_subscription_matched_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1119,10 +1193,9 @@ CU_TheoryDataPoints(ddsc_get_liveliness_changed_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t reader), ddsc_get_liveliness_changed_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_liveliness_changed_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_liveliness_changed_status(reader, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1131,7 +1204,7 @@ CU_Test(ddsc_get_liveliness_changed_status, null, .init=init_entity_status, .fin
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(rea, 0);
 | 
			
		||||
    ret = dds_get_liveliness_changed_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1142,7 +1215,7 @@ CU_TheoryDataPoints(ddsc_get_liveliness_changed_status, non_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *reader), ddsc_get_liveliness_changed_status, non_readers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_liveliness_changed_status(*reader, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1151,7 +1224,7 @@ CU_Test(ddsc_get_liveliness_changed_status, deleted_reader, .init=init_entity_st
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_get_liveliness_changed_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1162,10 +1235,9 @@ CU_TheoryDataPoints(ddsc_get_sample_rejected_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t reader), ddsc_get_sample_rejected_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_sample_rejected_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_sample_rejected_status(reader, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1174,7 +1246,7 @@ CU_Test(ddsc_get_sample_rejected_status, null, .init=init_entity_status, .fini=f
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(rea, 0);
 | 
			
		||||
    ret = dds_get_sample_rejected_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1185,7 +1257,7 @@ CU_TheoryDataPoints(ddsc_get_sample_rejected_status, non_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *reader), ddsc_get_sample_rejected_status, non_readers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_sample_rejected_status(*reader, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1194,7 +1266,7 @@ CU_Test(ddsc_get_sample_rejected_status, deleted_reader, .init=init_entity_statu
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_get_sample_rejected_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1205,10 +1277,9 @@ CU_TheoryDataPoints(ddsc_get_sample_lost_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t reader), ddsc_get_sample_lost_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_sample_lost_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_sample_lost_status(reader, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1217,7 +1288,7 @@ CU_Test(ddsc_get_sample_lost_status, null, .init=init_entity_status, .fini=fini_
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(rea, 0);
 | 
			
		||||
    ret = dds_get_sample_lost_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1228,7 +1299,7 @@ CU_TheoryDataPoints(ddsc_get_sample_lost_status, non_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *reader), ddsc_get_sample_lost_status, non_readers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_sample_lost_status(*reader, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1237,7 +1308,7 @@ CU_Test(ddsc_get_sample_lost_status, deleted_reader, .init=init_entity_status, .
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_get_sample_lost_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1246,7 +1317,7 @@ CU_Test(ddsc_get_requested_deadline_missed_status, requested_deadline_missed_sta
 | 
			
		|||
{
 | 
			
		||||
    dds_requested_deadline_missed_status_t requested_deadline_missed_status;
 | 
			
		||||
    ret = dds_get_requested_deadline_missed_status(rea, &requested_deadline_missed_status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(requested_deadline_missed_status.total_count,           0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(requested_deadline_missed_status.total_count_change,    0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(requested_deadline_missed_status.last_instance_handle,  DDS_HANDLE_NIL);
 | 
			
		||||
| 
						 | 
				
			
			@ -1260,10 +1331,9 @@ CU_TheoryDataPoints(ddsc_get_requested_deadline_missed_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t reader), ddsc_get_requested_deadline_missed_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_requested_deadline_missed_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_requested_deadline_missed_status(reader, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1272,7 +1342,7 @@ CU_Test(ddsc_get_requested_deadline_missed_status, null, .init=init_entity_statu
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(rea, 0);
 | 
			
		||||
    ret = dds_get_requested_deadline_missed_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1283,7 +1353,7 @@ CU_TheoryDataPoints(ddsc_get_requested_deadline_missed_status, non_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *reader), ddsc_get_requested_deadline_missed_status, non_readers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_requested_deadline_missed_status(*reader, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1292,7 +1362,7 @@ CU_Test(ddsc_get_requested_deadline_missed_status, deleted_reader, .init=init_en
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_get_requested_deadline_missed_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1303,10 +1373,9 @@ CU_TheoryDataPoints(ddsc_get_requested_incompatible_qos_status, bad_params) = {
 | 
			
		|||
CU_Theory((dds_entity_t reader), ddsc_get_requested_incompatible_qos_status, bad_params, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    dds_requested_incompatible_qos_status_t status;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_requested_incompatible_qos_status(reader, &status);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1315,7 +1384,7 @@ CU_Test(ddsc_get_requested_incompatible_qos_status, null, .init=init_entity_stat
 | 
			
		|||
{
 | 
			
		||||
    dds_set_status_mask(rea, 0);
 | 
			
		||||
    ret = dds_get_requested_incompatible_qos_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1326,7 +1395,7 @@ CU_TheoryDataPoints(ddsc_get_requested_incompatible_qos_status, non_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t *reader), ddsc_get_requested_incompatible_qos_status, non_readers, .init=init_entity_status, .fini=fini_entity_status)
 | 
			
		||||
{
 | 
			
		||||
    ret = dds_get_requested_incompatible_qos_status(*reader, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1335,7 +1404,7 @@ CU_Test(ddsc_get_requested_incompatible_qos_status, deleted_reader, .init=init_e
 | 
			
		|||
{
 | 
			
		||||
    dds_delete(rea);
 | 
			
		||||
    ret = dds_get_requested_incompatible_qos_status(rea, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,20 +18,40 @@
 | 
			
		|||
#include "dds/ddsrt/string.h"
 | 
			
		||||
#include "RoundTrip.h"
 | 
			
		||||
 | 
			
		||||
#define MAX_SAMPLES 10
 | 
			
		||||
 | 
			
		||||
static dds_entity_t participant = DDS_ENTITY_NIL;
 | 
			
		||||
static dds_entity_t waitset = DDS_ENTITY_NIL;
 | 
			
		||||
static dds_entity_t topic = DDS_ENTITY_NIL;
 | 
			
		||||
static dds_entity_t publisher = DDS_ENTITY_NIL;
 | 
			
		||||
static dds_entity_t subscriber = DDS_ENTITY_NIL;
 | 
			
		||||
static dds_entity_t writer = DDS_ENTITY_NIL;
 | 
			
		||||
 | 
			
		||||
static dds_entity_t reader = DDS_ENTITY_NIL;
 | 
			
		||||
static dds_entity_t readcondition = DDS_ENTITY_NIL;
 | 
			
		||||
static dds_entity_t querycondition = DDS_ENTITY_NIL;
 | 
			
		||||
static dds_instance_handle_t handle = DDS_HANDLE_NIL;
 | 
			
		||||
 | 
			
		||||
static bool
 | 
			
		||||
filter(const void * sample)
 | 
			
		||||
{
 | 
			
		||||
    const RoundTripModule_Address *s = sample;
 | 
			
		||||
    return (s->port == 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static RoundTripModule_Address data;
 | 
			
		||||
 | 
			
		||||
/* Fixture to create prerequisite entity */
 | 
			
		||||
static void setup(void)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    participant = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(participant > 0);
 | 
			
		||||
 | 
			
		||||
    waitset = dds_create_waitset(participant);
 | 
			
		||||
    CU_ASSERT_FATAL(waitset > 0);
 | 
			
		||||
 | 
			
		||||
    topic = dds_create_topic(participant, &RoundTripModule_Address_desc, "ddsc_instance_get_key", NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(topic > 0);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +61,24 @@ static void setup(void)
 | 
			
		|||
    writer = dds_create_writer(publisher, topic, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(writer > 0);
 | 
			
		||||
 | 
			
		||||
    subscriber = dds_create_subscriber(participant, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(subscriber > 0);
 | 
			
		||||
 | 
			
		||||
    reader = dds_create_reader(subscriber, topic, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(reader > 0);
 | 
			
		||||
 | 
			
		||||
    readcondition = dds_create_readcondition(reader, mask);
 | 
			
		||||
    CU_ASSERT_FATAL(readcondition > 0);
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_attach(waitset, readcondition, readcondition);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    querycondition = dds_create_querycondition(reader, mask, filter);
 | 
			
		||||
    CU_ASSERT_FATAL(querycondition > 0);
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_attach(waitset, querycondition, querycondition);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    memset(&data, 0, sizeof(data));
 | 
			
		||||
    data.ip = ddsrt_strdup("some data");
 | 
			
		||||
    CU_ASSERT_PTR_NOT_NULL_FATAL(data.ip);
 | 
			
		||||
| 
						 | 
				
			
			@ -52,9 +90,6 @@ static void teardown(void)
 | 
			
		|||
{
 | 
			
		||||
    RoundTripModule_Address_free(&data, DDS_FREE_CONTENTS);
 | 
			
		||||
 | 
			
		||||
    dds_delete(writer);
 | 
			
		||||
    dds_delete(publisher);
 | 
			
		||||
    dds_delete(topic);
 | 
			
		||||
    dds_delete(participant);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +98,7 @@ CU_Test(ddsc_instance_get_key, bad_entity, .init=setup, .fini=teardown)
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_instance_get_key(participant, handle, &data);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_instance_get_key, null_data, .init=setup, .fini=teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -71,7 +106,7 @@ CU_Test(ddsc_instance_get_key, null_data, .init=setup, .fini=teardown)
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_register_instance(writer, &handle, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_instance_get_key, null_handle, .init=setup, .fini=teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -81,7 +116,7 @@ CU_Test(ddsc_instance_get_key, null_handle, .init=setup, .fini=teardown)
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    ret = dds_instance_get_key(writer, DDS_HANDLE_NIL, &data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_instance_get_key, registered_instance, .init=setup, .fini=teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -99,8 +134,67 @@ CU_Test(ddsc_instance_get_key, registered_instance, .init=setup, .fini=teardown)
 | 
			
		|||
    CU_ASSERT_PTR_NOT_NULL_FATAL(key_data.ip);
 | 
			
		||||
    CU_ASSERT_STRING_EQUAL_FATAL(key_data.ip, data.ip);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(key_data.port, data.port);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    RoundTripModule_Address_free(&key_data, DDS_FREE_CONTENTS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_instance_get_key, readcondition, .init=setup, .fini=teardown)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    RoundTripModule_Address key_data;
 | 
			
		||||
 | 
			
		||||
    /* The instance handle of a successful write is by
 | 
			
		||||
     * design the same as the instance handle for the
 | 
			
		||||
     * readers,readconditions and queryconditions.
 | 
			
		||||
     * For that reason there is no need to actually read
 | 
			
		||||
     * the data. It is sufficient to do a successful write
 | 
			
		||||
     * and use the instance handle to obtain the key_data
 | 
			
		||||
     * for the readcondition. */
 | 
			
		||||
    ret = dds_write(writer, &data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    handle = dds_lookup_instance (writer, &data);
 | 
			
		||||
    CU_ASSERT_PTR_NOT_NULL_FATAL(handle);
 | 
			
		||||
 | 
			
		||||
    memset(&key_data, 0, sizeof(key_data));
 | 
			
		||||
 | 
			
		||||
    ret = dds_instance_get_key(readcondition, handle, &key_data);
 | 
			
		||||
 | 
			
		||||
    CU_ASSERT_PTR_NOT_NULL_FATAL(key_data.ip);
 | 
			
		||||
    CU_ASSERT_STRING_EQUAL_FATAL(key_data.ip, data.ip);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(key_data.port, data.port);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    RoundTripModule_Address_free(&key_data, DDS_FREE_CONTENTS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_instance_get_key, querycondition, .init=setup, .fini=teardown)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    RoundTripModule_Address key_data;
 | 
			
		||||
 | 
			
		||||
    /* The instance handle of a successful write is by
 | 
			
		||||
     * design the same as the instance handle for the
 | 
			
		||||
     * readers,readconditions and queryconditions.
 | 
			
		||||
     * For that reason there is no need to actually read
 | 
			
		||||
     * the data. It is sufficient to do a successful write
 | 
			
		||||
     * and use the instance handle to obtain the key_data
 | 
			
		||||
     * for the querycondition. */
 | 
			
		||||
    ret = dds_write(writer, &data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    handle = dds_lookup_instance (writer, &data);
 | 
			
		||||
    CU_ASSERT_PTR_NOT_NULL_FATAL(handle);
 | 
			
		||||
 | 
			
		||||
    memset(&key_data, 0, sizeof(key_data));
 | 
			
		||||
 | 
			
		||||
    ret = dds_instance_get_key(querycondition, handle, &key_data);
 | 
			
		||||
 | 
			
		||||
    CU_ASSERT_PTR_NOT_NULL_FATAL(key_data.ip);
 | 
			
		||||
    CU_ASSERT_STRING_EQUAL_FATAL(key_data.ip, data.ip);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(key_data.port, data.port);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    RoundTripModule_Address_free(&key_data, DDS_FREE_CONTENTS);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -692,6 +692,7 @@ CU_Test(ddsc_listener, matched, .init=init_triggering_base, .fini=fini_triggerin
 | 
			
		|||
 | 
			
		||||
CU_Test(ddsc_listener, publication_matched, .init=init_triggering_test, .fini=fini_triggering_test)
 | 
			
		||||
{
 | 
			
		||||
    dds_publication_matched_status_t publication_matched;
 | 
			
		||||
    dds_instance_handle_t reader_hdl;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    uint32_t triggered;
 | 
			
		||||
| 
						 | 
				
			
			@ -716,6 +717,15 @@ CU_Test(ddsc_listener, publication_matched, .init=init_triggering_test, .fini=fi
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, 0);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_publication_matched_status(g_writer, &publication_matched);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.current_count,        1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.current_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count,          1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count_change,   0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.last_subscription_handle, reader_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Reset the trigger flags. */
 | 
			
		||||
    cb_called = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -731,10 +741,20 @@ CU_Test(ddsc_listener, publication_matched, .init=init_triggering_test, .fini=fi
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(cb_publication_matched_status.total_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_publication_matched_status.total_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_publication_matched_status.last_subscription_handle, reader_hdl);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_publication_matched_status(g_writer, &publication_matched);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.current_count,        0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.current_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count,          1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.total_count_change,   0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(publication_matched.last_subscription_handle, reader_hdl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_listener, subscription_matched, .init=init_triggering_test, .fini=fini_triggering_test)
 | 
			
		||||
{
 | 
			
		||||
    dds_subscription_matched_status_t subscription_matched;
 | 
			
		||||
    dds_instance_handle_t writer_hdl;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    uint32_t triggered;
 | 
			
		||||
| 
						 | 
				
			
			@ -759,6 +779,15 @@ CU_Test(ddsc_listener, subscription_matched, .init=init_triggering_test, .fini=f
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, 0);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_subscription_matched_status(g_reader, &subscription_matched);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.current_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.current_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.last_publication_handle, writer_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Reset the trigger flags. */
 | 
			
		||||
    cb_called = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -774,10 +803,21 @@ CU_Test(ddsc_listener, subscription_matched, .init=init_triggering_test, .fini=f
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(cb_subscription_matched_status.total_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_subscription_matched_status.total_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_subscription_matched_status.last_publication_handle, writer_hdl);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_subscription_matched_status(g_reader, &subscription_matched);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.current_count, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.current_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.total_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(subscription_matched.last_publication_handle, writer_hdl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_listener, incompatible_qos, .init=init_triggering_base, .fini=fini_triggering_base)
 | 
			
		||||
{
 | 
			
		||||
    dds_offered_incompatible_qos_status_t offered_incompatible_qos;
 | 
			
		||||
    dds_requested_incompatible_qos_status_t requested_incompatible_qos;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    uint32_t triggered;
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
| 
						 | 
				
			
			@ -815,6 +855,18 @@ CU_Test(ddsc_listener, incompatible_qos, .init=init_triggering_base, .fini=fini_
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, 0);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_offered_incompatible_qos_status(g_writer, &offered_incompatible_qos);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_get_requested_incompatible_qos_status(g_reader, &requested_incompatible_qos);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(offered_incompatible_qos.total_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(offered_incompatible_qos.total_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(offered_incompatible_qos.last_policy_id, DDS_DURABILITY_QOS_POLICY_ID);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(requested_incompatible_qos.total_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(requested_incompatible_qos.total_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(requested_incompatible_qos.last_policy_id, DDS_DURABILITY_QOS_POLICY_ID);
 | 
			
		||||
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -997,6 +1049,7 @@ CU_Test(ddsc_listener, data_on_readers, .init=init_triggering_test, .fini=fini_t
 | 
			
		|||
 | 
			
		||||
CU_Test(ddsc_listener, sample_lost, .init=init_triggering_test, .fini=fini_triggering_test)
 | 
			
		||||
{
 | 
			
		||||
    dds_sample_lost_status_t sample_lost;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    uint32_t triggered;
 | 
			
		||||
    dds_time_t the_past;
 | 
			
		||||
| 
						 | 
				
			
			@ -1031,10 +1084,17 @@ CU_Test(ddsc_listener, sample_lost, .init=init_triggering_test, .fini=fini_trigg
 | 
			
		|||
    ret = dds_read_status(g_reader, &status, DDS_SAMPLE_LOST_STATUS);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, 0);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_sample_lost_status(g_reader, &sample_lost);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_lost.total_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_lost.total_count_change, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_listener, sample_rejected, .init=init_triggering_test, .fini=fini_triggering_test)
 | 
			
		||||
{
 | 
			
		||||
    dds_sample_rejected_status_t sample_rejected;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    uint32_t triggered;
 | 
			
		||||
    uint32_t status;
 | 
			
		||||
| 
						 | 
				
			
			@ -1060,15 +1120,24 @@ CU_Test(ddsc_listener, sample_rejected, .init=init_triggering_test, .fini=fini_t
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(cb_reader, g_reader);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_sample_rejected_status.total_count, 2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_sample_rejected_status.total_count_change, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_sample_rejected_status.last_reason, DDS_REJECTED_BY_SAMPLES_LIMIT);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have swallowed the status. */
 | 
			
		||||
    ret = dds_read_status(g_reader, &status, DDS_SAMPLE_REJECTED_STATUS);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, 0);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_sample_rejected_status(g_reader, &sample_rejected);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_rejected.total_count, 2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(sample_rejected.total_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_sample_rejected_status.last_reason, DDS_REJECTED_BY_SAMPLES_LIMIT);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_listener, liveliness_changed, .init=init_triggering_test, .fini=fini_triggering_base)
 | 
			
		||||
{
 | 
			
		||||
    dds_liveliness_changed_status_t liveliness_changed;
 | 
			
		||||
    dds_instance_handle_t writer_hdl;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    uint32_t triggered;
 | 
			
		||||
| 
						 | 
				
			
			@ -1095,6 +1164,15 @@ CU_Test(ddsc_listener, liveliness_changed, .init=init_triggering_test, .fini=fin
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, 0);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_liveliness_changed_status(g_reader, &liveliness_changed);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_hdl);
 | 
			
		||||
 | 
			
		||||
    /* Reset the trigger flags. */
 | 
			
		||||
    cb_called = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1110,6 +1188,15 @@ CU_Test(ddsc_listener, liveliness_changed, .init=init_triggering_test, .fini=fin
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.not_alive_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.not_alive_count_change, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cb_liveliness_changed_status.last_publication_handle, writer_hdl);
 | 
			
		||||
 | 
			
		||||
    /* The listener should have reset the count_change. */
 | 
			
		||||
    ret = dds_get_liveliness_changed_status(g_reader, &liveliness_changed);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.alive_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.not_alive_count_change, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(liveliness_changed.last_publication_handle, writer_hdl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,8 +17,6 @@
 | 
			
		|||
#include "dds/version.h"
 | 
			
		||||
#include "dds/ddsrt/environ.h"
 | 
			
		||||
 | 
			
		||||
#define cu_assert_status_eq(s1, s2) CU_ASSERT_EQUAL_FATAL(dds_err_nr(s1), s2)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_participant, create_and_delete) {
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -44,29 +42,25 @@ CU_Test(ddsc_participant, create_and_delete) {
 | 
			
		|||
/* Test for creating participant with no configuration file  */
 | 
			
		||||
CU_Test(ddsc_participant, create_with_no_conf_no_env)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity_t participant, participant2, participant3;
 | 
			
		||||
  dds_entity_t participant2, participant3;
 | 
			
		||||
  dds_return_t status;
 | 
			
		||||
  dds_domainid_t domain_id;
 | 
			
		||||
  dds_domainid_t valid_domain=3;
 | 
			
		||||
 | 
			
		||||
  ddsrt_unsetenv(DDS_PROJECT_NAME_NOSPACE_CAPS"_URI");
 | 
			
		||||
 | 
			
		||||
  //invalid domain
 | 
			
		||||
  participant = dds_create_participant (-2, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(participant < 0);
 | 
			
		||||
 | 
			
		||||
  //valid specific domain value
 | 
			
		||||
  participant2 = dds_create_participant (valid_domain, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(participant2 > 0);
 | 
			
		||||
  status = dds_get_domainid(participant2, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(domain_id, valid_domain);
 | 
			
		||||
 | 
			
		||||
  //DDS_DOMAIN_DEFAULT from user
 | 
			
		||||
  participant3 = dds_create_participant (DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(participant3 > 0);
 | 
			
		||||
  status = dds_get_domainid(participant3, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(domain_id, valid_domain);
 | 
			
		||||
 | 
			
		||||
  dds_delete(participant2);
 | 
			
		||||
| 
						 | 
				
			
			@ -74,11 +68,41 @@ CU_Test(ddsc_participant, create_with_no_conf_no_env)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Test for creating participants in multiple domains with no configuration file  */
 | 
			
		||||
CU_Test(ddsc_participant, create_multiple_domains)
 | 
			
		||||
{
 | 
			
		||||
  dds_entity_t participant1, participant2;
 | 
			
		||||
  dds_return_t status;
 | 
			
		||||
  dds_domainid_t domain_id;
 | 
			
		||||
 | 
			
		||||
  ddsrt_setenv("CYCLONEDDS_URI", "<Tracing><Verbosity>finest</><OutputFile>multi-domain-1.log</></>");
 | 
			
		||||
 | 
			
		||||
  //valid specific domain value
 | 
			
		||||
  participant1 = dds_create_participant (1, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(participant1 > 0);
 | 
			
		||||
  status = dds_get_domainid(participant1, &domain_id);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(domain_id, 1);
 | 
			
		||||
 | 
			
		||||
  ddsrt_setenv("CYCLONEDDS_URI", "<Tracing><Verbosity>finest</><OutputFile>multi-domain-2.log</></>");
 | 
			
		||||
 | 
			
		||||
  //DDS_DOMAIN_DEFAULT from user
 | 
			
		||||
  participant2 = dds_create_participant (2, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(participant2 > 0);
 | 
			
		||||
  status = dds_get_domainid(participant2, &domain_id);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(domain_id, 2);
 | 
			
		||||
 | 
			
		||||
  dds_delete(participant1);
 | 
			
		||||
  dds_delete(participant2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
////WITH CONF
 | 
			
		||||
 | 
			
		||||
/* Test for creating participant with valid configuration file  */
 | 
			
		||||
CU_Test(ddsc_participant, create_with_conf_no_env) {
 | 
			
		||||
    dds_entity_t participant, participant2, participant3;
 | 
			
		||||
    dds_entity_t participant2, participant3;
 | 
			
		||||
    dds_return_t status;
 | 
			
		||||
    dds_domainid_t domain_id;
 | 
			
		||||
    dds_domainid_t valid_domain=3;
 | 
			
		||||
| 
						 | 
				
			
			@ -90,16 +114,11 @@ CU_Test(ddsc_participant, create_with_conf_no_env) {
 | 
			
		|||
    ddsrt_getenv(DDS_PROJECT_NAME_NOSPACE_CAPS"_URI", &env_uri);
 | 
			
		||||
    CU_ASSERT_PTR_NOT_EQUAL_FATAL(env_uri, NULL);
 | 
			
		||||
 | 
			
		||||
    //invalid domain
 | 
			
		||||
    participant = dds_create_participant (1, NULL, NULL);
 | 
			
		||||
    printf("\n participant is %d\n", participant);
 | 
			
		||||
    CU_ASSERT_FATAL(participant < 0);
 | 
			
		||||
 | 
			
		||||
    //valid specific domain value
 | 
			
		||||
    participant2 = dds_create_participant (valid_domain, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(participant2 > 0);
 | 
			
		||||
    status = dds_get_domainid(participant2, &domain_id);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(domain_id, valid_domain);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +126,7 @@ CU_Test(ddsc_participant, create_with_conf_no_env) {
 | 
			
		|||
    participant3 = dds_create_participant (DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(participant3 > 0);
 | 
			
		||||
    status = dds_get_domainid(participant3, &domain_id);
 | 
			
		||||
    cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(domain_id, valid_domain);
 | 
			
		||||
 | 
			
		||||
    dds_delete(participant2);
 | 
			
		||||
| 
						 | 
				
			
			@ -128,7 +147,7 @@ CU_Test(ddsc_participant_lookup, one) {
 | 
			
		|||
 | 
			
		||||
  /* Get domain id */
 | 
			
		||||
  status = dds_get_domainid(participant, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
  num_of_found_pp = dds_lookup_participant( domain_id, participants, size);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(num_of_found_pp, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -154,7 +173,7 @@ CU_Test(ddsc_participant_lookup, multiple) {
 | 
			
		|||
 | 
			
		||||
  /* Get domain id */
 | 
			
		||||
  status = dds_get_domainid(participant, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
  num_of_found_pp = dds_lookup_participant( domain_id, participants, size);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(num_of_found_pp, 2);
 | 
			
		||||
| 
						 | 
				
			
			@ -186,7 +205,7 @@ CU_Test(ddsc_participant_lookup, array_too_small) {
 | 
			
		|||
 | 
			
		||||
  /* Get domain id */
 | 
			
		||||
  status = dds_get_domainid(participant, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
  num_of_found_pp = dds_lookup_participant( domain_id, participants, size);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(num_of_found_pp, 3);
 | 
			
		||||
| 
						 | 
				
			
			@ -212,7 +231,7 @@ CU_Test(ddsc_participant_lookup, null_zero){
 | 
			
		|||
 | 
			
		||||
  /* Get domain id */
 | 
			
		||||
  status = dds_get_domainid(participant, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
  num_of_found_pp = dds_lookup_participant( domain_id, NULL, size);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(num_of_found_pp, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -233,10 +252,10 @@ CU_Test(ddsc_participant_lookup, null_nonzero){
 | 
			
		|||
 | 
			
		||||
  /* Get domain id */
 | 
			
		||||
  status = dds_get_domainid(participant, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
  num_of_found_pp = dds_lookup_participant( domain_id, NULL, size);
 | 
			
		||||
  cu_assert_status_eq(num_of_found_pp, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(num_of_found_pp, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
  dds_delete (participant);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -255,7 +274,7 @@ CU_Test(ddsc_participant_lookup, unknown_id) {
 | 
			
		|||
 | 
			
		||||
  /* Get domain id */
 | 
			
		||||
  status = dds_get_domainid(participant, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
  domain_id ++;
 | 
			
		||||
 | 
			
		||||
  num_of_found_pp = dds_lookup_participant( domain_id, participants, size);
 | 
			
		||||
| 
						 | 
				
			
			@ -288,7 +307,7 @@ CU_Test(ddsc_participant_lookup, no_more) {
 | 
			
		|||
 | 
			
		||||
  /* Get domain id */
 | 
			
		||||
  status = dds_get_domainid(participant, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
  dds_delete (participant);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -313,7 +332,7 @@ CU_Test(ddsc_participant_lookup, deleted) {
 | 
			
		|||
 | 
			
		||||
  /* Get domain id */
 | 
			
		||||
  status = dds_get_domainid(participant, &domain_id);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_OK);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
  dds_delete (participant2);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,8 +19,6 @@
 | 
			
		|||
#pragma warning(disable: 28020)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define cu_assert_status_eq(s1, s2) CU_ASSERT_EQUAL_FATAL(dds_err_nr(s1), s2)
 | 
			
		||||
 | 
			
		||||
/* Dummy callback */
 | 
			
		||||
static void data_available_cb(dds_entity_t reader, void* arg)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +40,7 @@ CU_Test(ddsc_publisher, create)
 | 
			
		|||
 | 
			
		||||
  /* Use NULL participant */
 | 
			
		||||
  publisher = dds_create_publisher(0, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(dds_err_nr(publisher), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(publisher, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
 | 
			
		||||
  participant = dds_create_participant (DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(participant >  0);
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +51,7 @@ CU_Test(ddsc_publisher, create)
 | 
			
		|||
 | 
			
		||||
  /* Use entity that is not a participant */
 | 
			
		||||
  publisher1 = dds_create_publisher(publisher, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(dds_err_nr(publisher1), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(publisher1, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
  dds_delete(publisher);
 | 
			
		||||
 | 
			
		||||
  /* Create a non-null qos */
 | 
			
		||||
| 
						 | 
				
			
			@ -143,35 +141,35 @@ CU_Test(ddsc_publisher, suspend_resume)
 | 
			
		|||
 | 
			
		||||
  /* Suspend a 0 publisher */
 | 
			
		||||
  status = dds_suspend(0);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
 | 
			
		||||
  /* Resume a 0 publisher */
 | 
			
		||||
  status = dds_resume(0);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
 | 
			
		||||
  /* Uae dds_suspend on something else than a publisher */
 | 
			
		||||
  participant = dds_create_participant (DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(participant > 0);
 | 
			
		||||
  status = dds_suspend(participant);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
 | 
			
		||||
  /* Use dds_resume on something else than a publisher */
 | 
			
		||||
  status = dds_resume(participant);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
 | 
			
		||||
  /* Use dds_resume without calling dds_suspend */
 | 
			
		||||
  publisher = dds_create_publisher(participant, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(publisher > 0);
 | 
			
		||||
  status = dds_resume(publisher); /* Should be precondition not met? */
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  /* Use dds_suspend on non-null publisher */
 | 
			
		||||
  status = dds_suspend(publisher);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  /* Use dds_resume on non-null publisher */
 | 
			
		||||
  status = dds_resume(publisher);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  dds_delete(publisher);
 | 
			
		||||
  dds_delete(participant);
 | 
			
		||||
| 
						 | 
				
			
			@ -189,38 +187,38 @@ CU_Test(ddsc_publisher, wait_for_acks)
 | 
			
		|||
 | 
			
		||||
  /* Wait_for_acks on 0 publisher or writer and minusOneSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(0, minusOneSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on NULL publisher or writer and zeroSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(0, zeroSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
 | 
			
		||||
  /* wait_for_acks on NULL publisher or writer and oneSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(0, oneSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
 | 
			
		||||
  /* wait_for_acks on NULL publisher or writer and DDS_INFINITE timeout */
 | 
			
		||||
  status = dds_wait_for_acks(0, DDS_INFINITY);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
 | 
			
		||||
  participant = dds_create_participant (DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(participant > 0);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on participant and minusOneSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(participant, minusOneSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on participant and zeroSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(participant, zeroSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on participant and oneSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(participant, oneSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on participant and DDS_INFINITE timeout */
 | 
			
		||||
  status = dds_wait_for_acks(participant, DDS_INFINITY);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
 | 
			
		||||
  publisher = dds_create_publisher(participant, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(publisher > 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -228,40 +226,40 @@ CU_Test(ddsc_publisher, wait_for_acks)
 | 
			
		|||
  /* Wait_for_acks on publisher and minusOneSec timeout --
 | 
			
		||||
     either BAD_PARAMETER or UNSUPPORTED would be both be ok, really */
 | 
			
		||||
  status = dds_wait_for_acks(publisher, minusOneSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on publisher and zeroSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(publisher, zeroSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on publisher and oneSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(publisher, oneSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on publisher and DDS_INFINITE timeout */
 | 
			
		||||
  status = dds_wait_for_acks(publisher, DDS_INFINITY);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  /* TODO: create tests by calling dds_qwait_for_acks on writers */
 | 
			
		||||
 | 
			
		||||
  status = dds_suspend(publisher);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on suspended publisher and minusOneSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(publisher, minusOneSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on suspended publisher and zeroSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(publisher, zeroSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on suspended publisher and oneSec timeout */
 | 
			
		||||
  status = dds_wait_for_acks(publisher, oneSec);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  /* Wait_for_acks on suspended publisher and DDS_INFINITE timeout */
 | 
			
		||||
  status = dds_wait_for_acks(publisher, DDS_INFINITY);
 | 
			
		||||
  cu_assert_status_eq(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  dds_delete(publisher);
 | 
			
		||||
  dds_delete(participant);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -234,7 +234,7 @@ CU_Test(ddsc_qos, copy_bad_source, .init=qos_init, .fini=qos_fini)
 | 
			
		|||
    dds_return_t result;
 | 
			
		||||
 | 
			
		||||
        result = dds_copy_qos(g_qos, NULL);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(result), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(result, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_qos, copy_bad_destination, .init=qos_init, .fini=qos_fini)
 | 
			
		||||
| 
						 | 
				
			
			@ -242,7 +242,7 @@ CU_Test(ddsc_qos, copy_bad_destination, .init=qos_init, .fini=qos_fini)
 | 
			
		|||
        dds_return_t result;
 | 
			
		||||
 | 
			
		||||
        result = dds_copy_qos(NULL, g_qos);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(result), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(result, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_qos, copy_with_partition, .init=qos_init, .fini=qos_fini)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -245,7 +245,7 @@ CU_Test(ddsc_querycondition_create, deleted_reader, .init=querycondition_init, .
 | 
			
		|||
    dds_entity_t cond;
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    cond = dds_create_querycondition(g_reader, mask, filter_mod2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(cond), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cond, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -256,11 +256,10 @@ CU_TheoryDataPoints(ddsc_querycondition_create, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_querycondition_create, invalid_readers, .init=querycondition_init, .fini=querycondition_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t cond;
 | 
			
		||||
 | 
			
		||||
    cond = dds_create_querycondition(rdr, mask, filter_mod2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(cond), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cond, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -273,7 +272,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_querycondition_create, non_readers, .init=qu
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t cond;
 | 
			
		||||
    cond = dds_create_querycondition(*rdr, mask, filter_mod2);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(cond), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cond, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -297,7 +296,7 @@ CU_Test(ddsc_querycondition_get_mask, deleted, .init=querycondition_init, .fini=
 | 
			
		|||
    dds_delete(condition);
 | 
			
		||||
    mask = 0;
 | 
			
		||||
    ret = dds_get_mask(condition, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -312,7 +311,7 @@ CU_Test(ddsc_querycondition_get_mask, null, .init=querycondition_init, .fini=que
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_get_mask(condition, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    dds_delete(condition);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -323,12 +322,11 @@ CU_TheoryDataPoints(ddsc_querycondition_get_mask, invalid_conditions) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t cond), ddsc_querycondition_get_mask, invalid_conditions, .init=querycondition_init, .fini=querycondition_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    uint32_t mask;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_mask(cond, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -341,7 +339,7 @@ CU_Theory((dds_entity_t *cond), ddsc_querycondition_get_mask, non_conditions, .i
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    uint32_t mask;
 | 
			
		||||
    ret = dds_get_mask(*cond, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -362,7 +360,7 @@ CU_Theory((uint32_t ss, uint32_t vs, uint32_t is), ddsc_querycondition_get_mask,
 | 
			
		|||
    CU_ASSERT_FATAL(condition > 0);
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_mask(condition, &maskOut);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(maskIn, maskOut);
 | 
			
		||||
 | 
			
		||||
    dds_delete(condition);
 | 
			
		||||
| 
						 | 
				
			
			@ -924,7 +922,7 @@ CU_Test(ddsc_querycondition_read, already_deleted, .init=querycondition_init, .f
 | 
			
		|||
 | 
			
		||||
    /* Try to read with a deleted condition. */
 | 
			
		||||
    ret = dds_read(condition, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1487,7 +1485,7 @@ CU_Test(ddsc_querycondition_take, already_deleted, .init=querycondition_init, .f
 | 
			
		|||
 | 
			
		||||
    /* Try to take with a deleted condition. */
 | 
			
		||||
    ret = dds_take(condition, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -299,7 +299,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, size_t bufsz, u
 | 
			
		|||
     * However, that's not the case yet. So don't test it. */
 | 
			
		||||
    if (buf != g_loans) {
 | 
			
		||||
        ret = dds_read_instance(*ent, buf, si, bufsz, maxs, g_hdl_valid);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -320,7 +320,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, uint32_t maxs),
 | 
			
		|||
     * invalid and neither is the handle. So, don't test that. */
 | 
			
		||||
    if ((buf != g_loans) || (si != g_info) || (maxs == 0)) {
 | 
			
		||||
        ret = dds_read_instance_wl(*ent, buf, si, maxs, g_hdl_valid);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -350,7 +350,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, size_t bufsz, u
 | 
			
		|||
     * However, that's not the case yet. So don't test it. */
 | 
			
		||||
    if (buf != g_loans) {
 | 
			
		||||
        ret = dds_read_instance_mask(*ent, buf, si, bufsz, maxs, g_hdl_valid, mask);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -372,7 +372,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, uint32_t maxs),
 | 
			
		|||
     * invalid and neither is the handle. So, don't test that. */
 | 
			
		||||
    CU_ASSERT_FATAL((buf != g_loans) || (si != g_info) || (maxs == 0));
 | 
			
		||||
    ret = dds_read_instance_mask_wl(*ent, buf, si, maxs, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -394,7 +394,7 @@ CU_Theory((dds_entity_t *rdr, dds_instance_handle_t hdl), ddsc_read_instance, in
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_instance(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, hdl);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -407,7 +407,7 @@ CU_Theory((dds_entity_t *rdr, dds_instance_handle_t hdl), ddsc_read_instance_wl,
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_instance_wl(*rdr, g_loans, g_info, MAX_SAMPLES, hdl);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -421,7 +421,7 @@ CU_Theory((dds_entity_t *rdr, dds_instance_handle_t hdl), ddsc_read_instance_mas
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_instance_mask(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, hdl, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -435,7 +435,7 @@ CU_Theory((dds_entity_t *rdr, dds_instance_handle_t hdl), ddsc_read_instance_mas
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_instance_mask_wl(*rdr, g_loans, g_info, MAX_SAMPLES, hdl, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -454,11 +454,10 @@ CU_TheoryDataPoints(ddsc_read_instance, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_read_instance, invalid_readers, .init=read_instance_init, .fini=read_instance_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_instance(rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -468,11 +467,10 @@ CU_TheoryDataPoints(ddsc_read_instance_wl, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_read_instance_wl, invalid_readers, .init=read_instance_init, .fini=read_instance_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_instance_wl(rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -483,11 +481,10 @@ CU_TheoryDataPoints(ddsc_read_instance_mask, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_read_instance_mask, invalid_readers, .init=read_instance_init, .fini=read_instance_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_instance_mask(rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -498,11 +495,10 @@ CU_TheoryDataPoints(ddsc_read_instance_mask_wl, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_read_instance_mask_wl, invalid_readers, .init=read_instance_init, .fini=read_instance_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_instance_mask_wl(rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -524,7 +520,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_instance, non_readers, .init=read_insta
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_instance(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -536,7 +532,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_instance_wl, non_readers, .init=read_in
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_instance_wl(*rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -549,7 +545,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_instance_mask, non_readers, .init=read_
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_instance_mask(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -562,7 +558,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_instance_mask_wl, non_readers, .init=re
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_instance_mask_wl(*rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -586,7 +582,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_instance, already_deleted, .init=read_i
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_read_instance(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -600,7 +596,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_instance_wl, already_deleted, .init=rea
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_read_instance_wl(*rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -615,7 +611,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_instance_mask, already_deleted, .init=r
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_read_instance_mask(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -630,7 +626,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_instance_mask_wl, already_deleted, .ini
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_read_instance_mask_wl(*rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -227,7 +227,7 @@ CU_Test(ddsc_readcondition_create, deleted_reader, .init=readcondition_init, .fi
 | 
			
		|||
    dds_entity_t cond;
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    cond = dds_create_readcondition(g_reader, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(cond), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cond, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -238,11 +238,10 @@ CU_TheoryDataPoints(ddsc_readcondition_create, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_readcondition_create, invalid_readers, .init=readcondition_init, .fini=readcondition_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t cond;
 | 
			
		||||
 | 
			
		||||
    cond = dds_create_readcondition(rdr, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(cond), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cond, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -255,7 +254,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_readcondition_create, non_readers, .init=rea
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t cond;
 | 
			
		||||
    cond = dds_create_readcondition(*rdr, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(cond), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(cond, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -279,7 +278,7 @@ CU_Test(ddsc_readcondition_get_mask, deleted, .init=readcondition_init, .fini=re
 | 
			
		|||
    dds_delete(condition);
 | 
			
		||||
    mask = 0;
 | 
			
		||||
    ret = dds_get_mask(condition, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -294,7 +293,7 @@ CU_Test(ddsc_readcondition_get_mask, null, .init=readcondition_init, .fini=readc
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_get_mask(condition, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    dds_delete(condition);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -305,12 +304,11 @@ CU_TheoryDataPoints(ddsc_readcondition_get_mask, invalid_conditions) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t cond), ddsc_readcondition_get_mask, invalid_conditions, .init=readcondition_init, .fini=readcondition_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    uint32_t mask;
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_mask(cond, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -323,7 +321,7 @@ CU_Theory((dds_entity_t *cond), ddsc_readcondition_get_mask, non_conditions, .in
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    uint32_t mask;
 | 
			
		||||
    ret = dds_get_mask(*cond, &mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -344,7 +342,7 @@ CU_Theory((uint32_t ss, uint32_t vs, uint32_t is), ddsc_readcondition_get_mask,
 | 
			
		|||
    CU_ASSERT_FATAL(condition > 0);
 | 
			
		||||
 | 
			
		||||
    ret = dds_get_mask(condition, &maskOut);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(maskIn, maskOut);
 | 
			
		||||
 | 
			
		||||
    dds_delete(condition);
 | 
			
		||||
| 
						 | 
				
			
			@ -906,7 +904,7 @@ CU_Test(ddsc_readcondition_read, already_deleted, .init=readcondition_init, .fin
 | 
			
		|||
 | 
			
		||||
    /* Try to read with a deleted condition. */
 | 
			
		||||
    ret = dds_read(condition, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1462,7 +1460,7 @@ CU_Test(ddsc_readcondition_take, already_deleted, .init=readcondition_init, .fin
 | 
			
		|||
 | 
			
		||||
    /* Try to take with a deleted condition. */
 | 
			
		||||
    ret = dds_take(condition, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -241,7 +241,7 @@ CU_Test(ddsc_reader_create, invalid_qos_participant, .init=reader_init, .fini=re
 | 
			
		|||
    dds_qset_reader_data_lifecycle(qos, DDS_SECS(-1), DDS_SECS(-1));
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(28020);
 | 
			
		||||
    rdr = dds_create_reader(g_participant, g_topic, qos, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(rdr), DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(rdr, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    dds_delete_qos(qos);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -256,7 +256,7 @@ CU_Test(ddsc_reader_create, invalid_qos_subscriber, .init=reader_init, .fini=rea
 | 
			
		|||
    dds_qset_reader_data_lifecycle(qos, DDS_SECS(-1), DDS_SECS(-1));
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(28020);
 | 
			
		||||
    rdr = dds_create_reader(g_subscriber, g_topic, qos, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(rdr), DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(rdr, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    dds_delete_qos(qos);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -273,7 +273,7 @@ CU_Theory((dds_entity_t *par, dds_entity_t *top), ddsc_reader_create, non_partic
 | 
			
		|||
     * actually the topic. So, don't test that permutation. */
 | 
			
		||||
    CU_ASSERT_FATAL((par != &g_participant) || (top != &g_topic));
 | 
			
		||||
    rdr = dds_create_reader(*par, *top, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(rdr), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(rdr, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -307,7 +307,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs), ddsc
 | 
			
		|||
     * However, that's not the case yet. So don't test it. */
 | 
			
		||||
    if (buf != g_loans) {
 | 
			
		||||
        ret = dds_read(g_reader, buf, si, bufsz, maxs);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -320,11 +320,10 @@ CU_TheoryDataPoints(ddsc_read, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_read, invalid_readers, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read(rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -336,7 +335,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read, non_readers, .init=reader_init, .fini=
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -347,7 +346,7 @@ CU_Test(ddsc_read, already_deleted, .init=reader_init, .fini=reader_fini)
 | 
			
		|||
    /* Try to read with a deleted reader. */
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    ret = dds_read(g_reader, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -420,7 +419,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, uint32_t maxs), ddsc_read_wl, inva
 | 
			
		|||
     * invalid. So, don't test that. */
 | 
			
		||||
    CU_ASSERT_FATAL((buf != g_loans) || (si != g_info) || (maxs == 0));
 | 
			
		||||
    ret = dds_read_wl(g_reader, buf, si, maxs);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -430,11 +429,10 @@ CU_TheoryDataPoints(ddsc_read_wl, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_read_wl, invalid_readers, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_wl(rdr, g_loans, g_info, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -446,7 +444,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_wl, non_readers, .init=reader_init, .fi
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_wl(*rdr, g_loans, g_info, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -457,7 +455,7 @@ CU_Test(ddsc_read_wl, already_deleted, .init=reader_init, .fini=reader_fini)
 | 
			
		|||
    /* Try to read with a deleted reader. */
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    ret = dds_read_wl(g_reader, g_loans, g_info, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -541,7 +539,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs), ddsc
 | 
			
		|||
     * However, that's not the case yet. So don't test it. */
 | 
			
		||||
    if (buf != g_loans) {
 | 
			
		||||
        ret = dds_read_mask(g_reader, buf, si, bufsz, maxs, mask);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -555,11 +553,10 @@ CU_TheoryDataPoints(ddsc_read_mask, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_read_mask, invalid_readers, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_mask(rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -572,7 +569,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_mask, non_readers, .init=reader_init, .
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_mask(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -584,7 +581,7 @@ CU_Test(ddsc_read_mask, already_deleted, .init=reader_init, .fini=reader_fini)
 | 
			
		|||
    /* Try to read with a deleted reader. */
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    ret = dds_read_mask(g_reader, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1092,7 +1089,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, uint32_t maxs), ddsc_read_mask_wl,
 | 
			
		|||
     * invalid. So, don't test that. */
 | 
			
		||||
    CU_ASSERT_FATAL((buf != g_loans) || (si != g_info) || (maxs == 0));
 | 
			
		||||
    ret = dds_read_mask_wl(g_reader, buf, si, maxs, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1103,11 +1100,10 @@ CU_TheoryDataPoints(ddsc_read_mask_wl, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_read_mask_wl, invalid_readers, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_mask_wl(rdr, g_loans, g_info, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1120,7 +1116,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_mask_wl, non_readers, .init=reader_init
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_mask_wl(*rdr, g_loans, g_info, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1132,7 +1128,7 @@ CU_Test(ddsc_read_mask_wl, already_deleted, .init=reader_init, .fini=reader_fini
 | 
			
		|||
    /* Try to read with a deleted reader. */
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    ret = dds_read_mask_wl(g_reader, g_loans, g_info, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1677,7 +1673,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs), ddsc
 | 
			
		|||
     * However, that's not the case yet. So don't test it. */
 | 
			
		||||
    if (buf != g_loans) {
 | 
			
		||||
        ret = dds_take(g_reader, buf, si, bufsz, maxs);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1690,11 +1686,10 @@ CU_TheoryDataPoints(ddsc_take, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_take, invalid_readers, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take(rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1706,7 +1701,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take, non_readers, .init=reader_init, .fini=
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1717,7 +1712,7 @@ CU_Test(ddsc_take, already_deleted, .init=reader_init, .fini=reader_fini)
 | 
			
		|||
    /* Try to take with a deleted reader. */
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    ret = dds_take(g_reader, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1790,7 +1785,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, uint32_t maxs), ddsc_take_wl, inva
 | 
			
		|||
     * invalid. So, don't test that. */
 | 
			
		||||
    CU_ASSERT_FATAL((buf != g_loans) || (si != g_info) || (maxs == 0));
 | 
			
		||||
    ret = dds_take_wl(g_reader, buf, si, maxs);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1800,11 +1795,10 @@ CU_TheoryDataPoints(ddsc_take_wl, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_take_wl, invalid_readers, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_wl(rdr, g_loans, g_info, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1816,7 +1810,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_wl, non_readers, .init=reader_init, .fi
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_wl(*rdr, g_loans, g_info, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1827,7 +1821,7 @@ CU_Test(ddsc_take_wl, already_deleted, .init=reader_init, .fini=reader_fini)
 | 
			
		|||
    /* Try to read with a deleted reader. */
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    ret = dds_take_wl(g_reader, g_loans, g_info, MAX_SAMPLES);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1912,7 +1906,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, size_t bufsz, uint32_t maxs), ddsc
 | 
			
		|||
     * However, that's not the case yet. So don't test it. */
 | 
			
		||||
    if (buf != g_loans) {
 | 
			
		||||
        ret = dds_take_mask(g_reader, buf, si, bufsz, maxs, mask);
 | 
			
		||||
        CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1926,11 +1920,10 @@ CU_TheoryDataPoints(ddsc_take_mask, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_take_mask, invalid_readers, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_mask(rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1943,7 +1936,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_mask, non_readers, .init=reader_init, .
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_mask(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1955,7 +1948,7 @@ CU_Test(ddsc_take_mask, already_deleted, .init=reader_init, .fini=reader_fini)
 | 
			
		|||
    /* Try to read with a deleted reader. */
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    ret = dds_take_mask(g_reader, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2596,7 +2589,7 @@ CU_Theory((void **buf, dds_sample_info_t *si, uint32_t maxs), ddsc_take_mask_wl,
 | 
			
		|||
     * invalid. So, don't test that. */
 | 
			
		||||
    CU_ASSERT_FATAL((buf != g_loans) || (si != g_info) || (maxs == 0));
 | 
			
		||||
    ret = dds_take_mask_wl(g_reader, buf, si, maxs, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2607,11 +2600,10 @@ CU_TheoryDataPoints(ddsc_take_mask_wl, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_take_mask_wl, invalid_readers, .init=reader_init, .fini=reader_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_mask_wl(rdr, g_loans, g_info, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2624,7 +2616,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_mask_wl, non_readers, .init=reader_init
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_mask_wl(*rdr, g_loans, g_info, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2636,7 +2628,7 @@ CU_Test(ddsc_take_mask_wl, already_deleted, .init=reader_init, .fini=reader_fini
 | 
			
		|||
    /* Try to read with a deleted reader. */
 | 
			
		||||
    dds_delete(g_reader);
 | 
			
		||||
    ret = dds_take_mask_wl(g_reader, g_loans, g_info, MAX_SAMPLES, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -360,11 +360,10 @@ CU_TheoryDataPoints(ddsc_read_next, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_read_next, invalid_readers, .init=reader_iterator_init, .fini=reader_iterator_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_next(rdr, g_samples, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -376,7 +375,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_next, non_readers, .init=reader_iterato
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_next(*rdr, g_samples, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -390,7 +389,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_next, already_deleted, .init=reader_ite
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_read_next(*rdr, g_samples, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -405,7 +404,7 @@ CU_Theory((void **buf, dds_sample_info_t *si), ddsc_read_next, invalid_buffers,
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    if ((buf != g_samples || si != g_info) && (buf != g_loans)) {
 | 
			
		||||
        ret = dds_read_next(g_reader, buf, si);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -476,11 +475,10 @@ CU_TheoryDataPoints(ddsc_read_next_wl, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_read_next_wl, invalid_readers, .init=reader_iterator_init, .fini=reader_iterator_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_read_next_wl(rdr, g_loans, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -492,7 +490,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_next_wl, non_readers, .init=reader_iter
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_read_next_wl(*rdr, g_loans, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -506,7 +504,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_read_next_wl, already_deleted, .init=reader_
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_read_next_wl(*rdr, g_loans, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -521,7 +519,7 @@ CU_Theory((void **buf, dds_sample_info_t *si), ddsc_read_next_wl, invalid_buffer
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    if (buf != g_loans || si != g_info) {
 | 
			
		||||
        ret = dds_read_next_wl(g_reader, buf, si);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -586,11 +584,10 @@ CU_TheoryDataPoints(ddsc_take_next, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_take_next, invalid_readers, .init=reader_iterator_init, .fini=reader_iterator_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_next(rdr, g_samples, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -602,7 +599,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_next, non_readers, .init=reader_iterato
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_next(*rdr, g_samples, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -616,7 +613,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_next, already_deleted, .init=reader_ite
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_take_next(*rdr, g_samples, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +628,7 @@ CU_Theory((void **buf, dds_sample_info_t *si), ddsc_take_next, invalid_buffers,
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    if ((buf != g_samples || si != g_info) && (buf != g_loans)) {
 | 
			
		||||
        ret = dds_take_next(g_reader, buf, si);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -699,11 +696,10 @@ CU_TheoryDataPoints(ddsc_take_next_wl, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_take_next_wl, invalid_readers, .init=reader_iterator_init, .fini=reader_iterator_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_next_wl(rdr, g_loans, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -715,7 +711,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_next_wl, non_readers, .init=reader_iter
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_next_wl(*rdr, g_loans, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -729,7 +725,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_next_wl, already_deleted, .init=reader_
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_take_next_wl(*rdr, g_loans, g_info);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -743,7 +739,7 @@ CU_Theory((void **buf, dds_sample_info_t *si), ddsc_take_next_wl, invalid_buffer
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    if (buf != g_loans || si != g_info) {
 | 
			
		||||
        ret = dds_take_next_wl(g_reader, buf, si);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -150,7 +150,7 @@ CU_Test(ddsc_register_instance, deleted_entity, .init=registering_init, .fini=re
 | 
			
		|||
    dds_instance_handle_t handle;
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    ret = dds_register_instance(g_writer, &handle, g_data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_instance_handle_t hndle = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +169,7 @@ CU_Theory((dds_instance_handle_t *hndl2, void *datap), ddsc_register_instance, i
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    ret = dds_register_instance(g_writer, hndl2, datap);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_TheoryDataPoints(ddsc_register_instance, invalid_writers) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -177,12 +177,11 @@ CU_TheoryDataPoints(ddsc_register_instance, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_register_instance, invalid_writers, .init=registering_init, .fini=registering_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    dds_instance_handle_t handle;
 | 
			
		||||
 | 
			
		||||
    ret = dds_register_instance(writer, &handle, g_data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_TheoryDataPoints(ddsc_register_instance, non_writers) = {
 | 
			
		||||
| 
						 | 
				
			
			@ -193,7 +192,7 @@ CU_Theory((dds_entity_t *writer), ddsc_register_instance, non_writers, .init=reg
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_instance_handle_t handle;
 | 
			
		||||
    ret = dds_register_instance(*writer, &handle, g_data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_register_instance, registering_new_instance, .init=registering_init, .fini=registering_fini)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,9 +15,9 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include "CUnit/Test.h"
 | 
			
		||||
 | 
			
		||||
dds_entity_t participant = 0, topic = 0, reader = 0, read_condition = 0;
 | 
			
		||||
static dds_entity_t participant = 0, topic = 0, reader = 0, read_condition = 0;
 | 
			
		||||
 | 
			
		||||
void create_entities(void)
 | 
			
		||||
static void create_entities(void)
 | 
			
		||||
{
 | 
			
		||||
    participant = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(participant > 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -32,11 +32,11 @@ void create_entities(void)
 | 
			
		|||
    CU_ASSERT_FATAL(read_condition > 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void delete_entities(void)
 | 
			
		||||
static void delete_entities(void)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t result;
 | 
			
		||||
    result = dds_delete(participant);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(result), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(result, DDS_RETCODE_OK);
 | 
			
		||||
    dds_delete(read_condition);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +86,7 @@ CU_Test(ddsc_reader, return_loan_bad_params, .init = create_entities, .fini = de
 | 
			
		|||
    void **buf = NULL;
 | 
			
		||||
 | 
			
		||||
    result = dds_return_loan(reader, NULL, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(result), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(result, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#pragma warning(push)
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +96,7 @@ CU_Test(ddsc_reader, return_loan_bad_params, .init = create_entities, .fini = de
 | 
			
		|||
#ifdef _MSC_VER
 | 
			
		||||
#pragma warning(pop)
 | 
			
		||||
#endif
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(result), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(result, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    buf = create_loan_buf(10, false);
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
| 
						 | 
				
			
			@ -107,10 +107,10 @@ CU_Test(ddsc_reader, return_loan_bad_params, .init = create_entities, .fini = de
 | 
			
		|||
#ifdef _MSC_VER
 | 
			
		||||
#pragma warning(pop)
 | 
			
		||||
#endif
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(result), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL(result, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
    result = dds_return_loan(participant, buf, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(result), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL(result, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
 | 
			
		||||
    delete_loan_buf(buf, 10, false);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -124,17 +124,17 @@ CU_Test(ddsc_reader, return_loan_success, .init = create_entities, .fini = delet
 | 
			
		|||
 | 
			
		||||
    buf = create_loan_buf(10, false);
 | 
			
		||||
    result = dds_return_loan(reader, buf, 10);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(result), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL(result, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    result = dds_return_loan(reader, &buf2, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(result), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL(result, DDS_RETCODE_OK);
 | 
			
		||||
    delete_loan_buf(buf, 10, true);
 | 
			
		||||
 | 
			
		||||
    buf = create_loan_buf(10, false);
 | 
			
		||||
    result = dds_return_loan(read_condition, buf, 10);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(result), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL(result, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    result = dds_return_loan(read_condition, &buf2, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL(dds_err_nr(result), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL(result, DDS_RETCODE_OK);
 | 
			
		||||
    delete_loan_buf(buf, 10, true);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@
 | 
			
		|||
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 | 
			
		||||
 */
 | 
			
		||||
#include "dds/dds.h"
 | 
			
		||||
#include "dds/ddsrt/misc.h"
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "CUnit/Test.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -48,7 +49,7 @@ CU_Test(ddsc_subscriber, notify_readers) {
 | 
			
		|||
 | 
			
		||||
  /* todo implement tests */
 | 
			
		||||
  ret = dds_notify_readers(subscriber);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
 | 
			
		||||
  dds_delete(subscriber);
 | 
			
		||||
  dds_delete(participant);
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +68,7 @@ CU_Test(ddsc_subscriber, create) {
 | 
			
		|||
  /*** Verify participant parameter ***/
 | 
			
		||||
 | 
			
		||||
  subscriber = dds_create_subscriber(0, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(dds_err_nr(subscriber), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(subscriber, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
 | 
			
		||||
  subscriber = dds_create_subscriber(participant, NULL, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(subscriber > 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -82,16 +83,20 @@ CU_Test(ddsc_subscriber, create) {
 | 
			
		|||
  dds_delete_qos(sqos);
 | 
			
		||||
 | 
			
		||||
  sqos = dds_create_qos();
 | 
			
		||||
  DDSRT_WARNING_CLANG_OFF(assign-enum);
 | 
			
		||||
  dds_qset_destination_order(sqos, 3); /* Set invalid dest. order (ignored, not applicable for subscriber) */
 | 
			
		||||
  DDSRT_WARNING_CLANG_ON(assign-enum);
 | 
			
		||||
  subscriber = dds_create_subscriber(participant, sqos, NULL);
 | 
			
		||||
  CU_ASSERT_FATAL(subscriber > 0);
 | 
			
		||||
  dds_delete(subscriber);
 | 
			
		||||
  dds_delete_qos(sqos);
 | 
			
		||||
 | 
			
		||||
  sqos = dds_create_qos();
 | 
			
		||||
  DDSRT_WARNING_CLANG_OFF(assign-enum);
 | 
			
		||||
  dds_qset_presentation(sqos, 123, 1, 1); /* Set invalid presentation policy */
 | 
			
		||||
  DDSRT_WARNING_CLANG_ON(assign-enum);
 | 
			
		||||
  subscriber = dds_create_subscriber(participant, sqos, NULL);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(dds_err_nr(subscriber), DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
  CU_ASSERT_EQUAL_FATAL(subscriber, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
  dds_delete_qos(sqos);
 | 
			
		||||
 | 
			
		||||
  /*** Verify listener parameter ***/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -299,7 +299,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, size_t bufsz, u
 | 
			
		|||
     * However, that's not the case yet. So don't test it. */
 | 
			
		||||
    if (buf != g_loans) {
 | 
			
		||||
        ret = dds_take_instance(*ent, buf, si, bufsz, maxs, g_hdl_valid);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -320,7 +320,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, uint32_t maxs),
 | 
			
		|||
     * invalid and neither is the handle. So, don't test that. */
 | 
			
		||||
    CU_ASSERT_FATAL((buf != g_loans) || (si != g_info) || (maxs == 0));
 | 
			
		||||
    ret = dds_take_instance_wl(*ent, buf, si, maxs, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -347,7 +347,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, size_t bufsz, u
 | 
			
		|||
     * However, that's not the case yet. So don't test it. */
 | 
			
		||||
    if (buf != g_loans) {
 | 
			
		||||
        ret = dds_take_instance_mask(*ent, buf, si, bufsz, maxs, g_hdl_valid, mask);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    } else {
 | 
			
		||||
        CU_PASS("Skipped");
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -369,7 +369,7 @@ CU_Theory((dds_entity_t *ent, void **buf, dds_sample_info_t *si, uint32_t maxs),
 | 
			
		|||
     * invalid and neither is the handle. So, don't test that. */
 | 
			
		||||
    CU_ASSERT_FATAL((buf != g_loans) || (si != g_info) || (maxs == 0));
 | 
			
		||||
    ret = dds_take_instance_mask_wl(*ent, buf, si, maxs, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -391,7 +391,7 @@ CU_Theory((dds_entity_t *rdr, dds_instance_handle_t hdl), ddsc_take_instance, in
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_instance(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, hdl);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -404,7 +404,7 @@ CU_Theory((dds_entity_t *rdr, dds_instance_handle_t hdl), ddsc_take_instance_wl,
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_instance_wl(*rdr, g_loans, g_info, MAX_SAMPLES, hdl);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -418,7 +418,7 @@ CU_Theory((dds_entity_t *rdr, dds_instance_handle_t hdl), ddsc_take_instance_mas
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_instance_mask(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, hdl, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -432,7 +432,7 @@ CU_Theory((dds_entity_t *rdr, dds_instance_handle_t hdl), ddsc_take_instance_mas
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_instance_mask_wl(*rdr, g_loans, g_info, MAX_SAMPLES, hdl, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -451,11 +451,10 @@ CU_TheoryDataPoints(ddsc_take_instance, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_take_instance, invalid_readers, .init=take_instance_init, .fini=take_instance_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_instance(rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -465,11 +464,10 @@ CU_TheoryDataPoints(ddsc_take_instance_wl, invalid_readers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t rdr), ddsc_take_instance_wl, invalid_readers, .init=take_instance_init, .fini=take_instance_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_instance_wl(rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -480,11 +478,10 @@ CU_TheoryDataPoints(ddsc_take_instance_mask, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_take_instance_mask, invalid_readers, .init=take_instance_init, .fini=take_instance_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_instance_mask(rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -495,11 +492,10 @@ CU_TheoryDataPoints(ddsc_take_instance_mask_wl, invalid_readers) = {
 | 
			
		|||
CU_Theory((dds_entity_t rdr), ddsc_take_instance_mask_wl, invalid_readers, .init=take_instance_init, .fini=take_instance_fini)
 | 
			
		||||
{
 | 
			
		||||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_take_instance_mask_wl(rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -521,7 +517,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_instance, non_readers, .init=take_insta
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_instance(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -533,7 +529,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_instance_wl, non_readers, .init=take_in
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_instance_wl(*rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -546,7 +542,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_instance_mask, non_readers, .init=take_
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_instance_mask(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -559,7 +555,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_instance_mask_wl, non_readers, .init=ta
 | 
			
		|||
    uint32_t mask = DDS_ANY_SAMPLE_STATE | DDS_ANY_VIEW_STATE | DDS_ANY_INSTANCE_STATE;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_take_instance_mask_wl(*rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -583,7 +579,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_instance, already_deleted, .init=take_i
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_take_instance(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -597,7 +593,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_instance_wl, already_deleted, .init=tak
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_take_instance_wl(*rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -612,7 +608,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_instance_mask, already_deleted, .init=t
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_take_instance_mask(*rdr, g_samples, g_info, MAX_SAMPLES, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -627,7 +623,7 @@ CU_Theory((dds_entity_t *rdr), ddsc_take_instance_mask_wl, already_deleted, .ini
 | 
			
		|||
    ret = dds_delete(*rdr);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    ret = dds_take_instance_mask_wl(*rdr, g_loans, g_info, MAX_SAMPLES, g_hdl_valid, mask);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -105,10 +105,10 @@ CU_Test(ddsc_topic_create, invalid_qos, .init=ddsc_topic_init, .fini=ddsc_topic_
 | 
			
		|||
    dds_entity_t topic;
 | 
			
		||||
    dds_qos_t *qos = dds_create_qos();
 | 
			
		||||
    DDSRT_WARNING_MSVC_OFF(28020); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    dds_qset_lifespan(qos, DDS_SECS(-1));
 | 
			
		||||
    dds_qset_resource_limits(qos, 1, 1, 2);
 | 
			
		||||
    DDSRT_WARNING_MSVC_OFF(28020);
 | 
			
		||||
    topic = dds_create_topic(g_participant, &RoundTripModule_DataType_desc, "inconsistent", qos, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    dds_delete_qos(qos);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +118,7 @@ CU_Test(ddsc_topic_create, non_participants, .init=ddsc_topic_init, .fini=ddsc_t
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t topic;
 | 
			
		||||
    topic = dds_create_topic(g_topicRtmDataType, &RoundTripModule_DataType_desc, "non_participant", NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,7 +141,7 @@ CU_Test(ddsc_topic_create, same_name, .init=ddsc_topic_init, .fini=ddsc_topic_fi
 | 
			
		|||
    dds_entity_t topic;
 | 
			
		||||
    /* Creating the different topic with same name should fail.  */
 | 
			
		||||
    topic = dds_create_topic(g_participant, &RoundTripModule_Address_desc, g_topicRtmDataTypeName, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -169,7 +169,7 @@ CU_Test(ddsc_topic_create, desc_null, .init=ddsc_topic_init, .fini=ddsc_topic_fi
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    topic = dds_create_topic (g_participant, NULL, "desc_null", NULL, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -183,7 +183,7 @@ CU_Theory((char *name), ddsc_topic_create, invalid_names, .init=ddsc_topic_init,
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t topic;
 | 
			
		||||
    topic = dds_create_topic(g_participant, &RoundTripModule_DataType_desc, name, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +213,7 @@ CU_Test(ddsc_topic_find, non_participants, .init=ddsc_topic_init, .fini=ddsc_top
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t topic;
 | 
			
		||||
    topic = dds_find_topic(g_topicRtmDataType, "non_participant");
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -224,7 +224,7 @@ CU_Test(ddsc_topic_find, null, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(6387); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    topic = dds_find_topic(g_participant, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -233,7 +233,7 @@ CU_Test(ddsc_topic_find, unknown, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t topic;
 | 
			
		||||
    topic = dds_find_topic(g_participant, "unknown");
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -243,7 +243,7 @@ CU_Test(ddsc_topic_find, deleted, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
 | 
			
		|||
    dds_entity_t topic;
 | 
			
		||||
    dds_delete(g_topicRtmDataType);
 | 
			
		||||
    topic = dds_find_topic(g_participant, g_topicRtmDataTypeName);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(topic), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(topic, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -289,7 +289,7 @@ CU_Test(ddsc_topic_get_name, non_topic, .init=ddsc_topic_init, .fini=ddsc_topic_
 | 
			
		|||
    char name[MAX_NAME_SIZE];
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_get_name(g_participant, name, MAX_NAME_SIZE);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -303,7 +303,7 @@ CU_Theory((char *name, size_t size), ddsc_topic_get_name, invalid_params, .init=
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    CU_ASSERT_FATAL((name != g_nameBuffer) || (size != MAX_NAME_SIZE));
 | 
			
		||||
    ret = dds_get_name(g_topicRtmDataType, name, size);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -314,7 +314,7 @@ CU_Test(ddsc_topic_get_name, deleted, .init=ddsc_topic_init, .fini=ddsc_topic_fi
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(g_topicRtmDataType);
 | 
			
		||||
    ret = dds_get_name(g_topicRtmDataType, name, MAX_NAME_SIZE);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -362,7 +362,7 @@ CU_Test(ddsc_topic_get_type_name, non_topic, .init=ddsc_topic_init, .fini=ddsc_t
 | 
			
		|||
    char name[MAX_NAME_SIZE];
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_get_type_name(g_participant, name, MAX_NAME_SIZE);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -376,7 +376,7 @@ CU_Theory((char *name, size_t size), ddsc_topic_get_type_name, invalid_params, .
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    CU_ASSERT_FATAL((name != g_nameBuffer) || (size != MAX_NAME_SIZE));
 | 
			
		||||
    ret = dds_get_type_name(g_topicRtmDataType, name, size);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -387,7 +387,7 @@ CU_Test(ddsc_topic_get_type_name, deleted, .init=ddsc_topic_init, .fini=ddsc_top
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(g_topicRtmDataType);
 | 
			
		||||
    ret = dds_get_type_name(g_topicRtmDataType, name, MAX_NAME_SIZE);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -405,7 +405,7 @@ CU_Test(ddsc_topic_set_qos, valid, .init=ddsc_topic_init, .fini=ddsc_topic_fini)
 | 
			
		|||
    /* Latency is the only one allowed to change. */
 | 
			
		||||
    dds_qset_latency_budget(g_qos, DDS_SECS(1));
 | 
			
		||||
    ret = dds_set_qos(g_topicRtmDataType, g_qos);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_UNSUPPORTED);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -417,7 +417,7 @@ CU_Test(ddsc_topic_set_qos, inconsistent, .init=ddsc_topic_init, .fini=ddsc_topi
 | 
			
		|||
    dds_qset_lifespan(g_qos, DDS_SECS(-1));
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(28020);
 | 
			
		||||
    ret = dds_set_qos(g_topicRtmDataType, g_qos);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_INCONSISTENT_POLICY);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -427,6 +427,6 @@ CU_Test(ddsc_topic_set_qos, immutable, .init=ddsc_topic_init, .fini=ddsc_topic_f
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_qset_destination_order(g_qos, DDS_DESTINATIONORDER_BY_SOURCE_TIMESTAMP); /* Immutable */
 | 
			
		||||
    ret = dds_set_qos(g_topicRtmDataType, g_qos);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_IMMUTABLE_POLICY);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_IMMUTABLE_POLICY);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,7 +30,7 @@
 | 
			
		|||
        CU_ASSERT_FATAL(wri > 0); \
 | 
			
		||||
        \
 | 
			
		||||
        status = dds_write(wri, &data); \
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_OK); \
 | 
			
		||||
        CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK); \
 | 
			
		||||
        \
 | 
			
		||||
        dds_delete(wri); \
 | 
			
		||||
        dds_delete(top); \
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ CU_Test(ddsc_types, alltypeskey)
 | 
			
		|||
    CU_ASSERT_FATAL(wri > 0);
 | 
			
		||||
 | 
			
		||||
    status = dds_write(wri, &atk_data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    dds_delete(wri);
 | 
			
		||||
    dds_delete(top);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -152,7 +152,7 @@ CU_Test(ddsc_unregister_instance, deleted, .init=unregistering_init, .fini=unreg
 | 
			
		|||
    dds_delete(g_writer);
 | 
			
		||||
 | 
			
		||||
    ret = dds_unregister_instance(g_writer, g_data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -161,7 +161,7 @@ CU_Test(ddsc_unregister_instance, null, .init=unregistering_init, .fini=unregist
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_unregister_instance(g_writer, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -171,11 +171,10 @@ CU_TheoryDataPoints(ddsc_unregister_instance, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_unregister_instance, invalid_writers, .init=unregistering_init, .fini=unregistering_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_unregister_instance(writer, g_data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +186,7 @@ CU_Theory((dds_entity_t *writer), ddsc_unregister_instance, non_writers, .init=u
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_unregister_instance(*writer, g_data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -246,7 +245,7 @@ CU_Test(ddsc_unregister_instance_ts, deleted, .init=unregistering_init, .fini=un
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    ret = dds_unregister_instance_ts(g_writer, g_data, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -255,7 +254,7 @@ CU_Test(ddsc_unregister_instance_ts, null, .init=unregistering_init, .fini=unreg
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_unregister_instance_ts(g_writer, NULL, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -265,11 +264,10 @@ CU_TheoryDataPoints(ddsc_unregister_instance_ts, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_unregister_instance_ts, invalid_writers, .init=unregistering_init, .fini=unregistering_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_unregister_instance_ts(writer, g_data, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -281,7 +279,7 @@ CU_Theory((dds_entity_t *writer), ddsc_unregister_instance_ts, non_writers, .ini
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_unregister_instance_ts(*writer, g_data, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -383,7 +381,7 @@ CU_Test(ddsc_unregister_instance_ih, deleted, .init=unregistering_init, .fini=un
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    ret = dds_unregister_instance_ih(g_writer, DDS_HANDLE_NIL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -395,7 +393,7 @@ CU_Theory((dds_instance_handle_t handle), ddsc_unregister_instance_ih, invalid_h
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_unregister_instance_ih(g_writer, handle);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -405,11 +403,10 @@ CU_TheoryDataPoints(ddsc_unregister_instance_ih, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_unregister_instance_ih, invalid_writers, .init=unregistering_init, .fini=unregistering_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_unregister_instance_ih(writer, DDS_HANDLE_NIL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -421,7 +418,7 @@ CU_Theory((dds_entity_t *writer), ddsc_unregister_instance_ih, non_writers, .ini
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_unregister_instance_ih(*writer, DDS_HANDLE_NIL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -481,7 +478,7 @@ CU_Test(ddsc_unregister_instance_ih_ts, deleted, .init=unregistering_init, .fini
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    ret = dds_unregister_instance_ih_ts(g_writer, DDS_HANDLE_NIL, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -493,7 +490,7 @@ CU_Theory((dds_instance_handle_t handle), ddsc_unregister_instance_ih_ts, invali
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_unregister_instance_ih_ts(g_writer, handle, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -503,11 +500,10 @@ CU_TheoryDataPoints(ddsc_unregister_instance_ih_ts, invalid_writers) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t writer), ddsc_unregister_instance_ih_ts, invalid_writers, .init=unregistering_init, .fini=unregistering_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_unregister_instance_ih_ts(writer, DDS_HANDLE_NIL, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -519,7 +515,7 @@ CU_Theory((dds_entity_t *writer), ddsc_unregister_instance_ih_ts, non_writers, .
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_unregister_instance_ih_ts(*writer, DDS_HANDLE_NIL, g_present);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -609,6 +605,37 @@ CU_Test(ddsc_unregister_instance_ih_ts, unregistering_past_sample, .init=unregis
 | 
			
		|||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
CU_Test(ddsc_unregister_instance_ih_ts, unregistering_instance)
 | 
			
		||||
{
 | 
			
		||||
    Space_Type1 testData = { 0, 22, 22 };
 | 
			
		||||
    dds_instance_handle_t ih = 0;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    char name[100];
 | 
			
		||||
 | 
			
		||||
    /* Create a writer that WILL automatically dispose unregistered samples. */
 | 
			
		||||
    g_participant = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(g_participant > 0);
 | 
			
		||||
    g_topic = dds_create_topic(g_participant, &Space_Type1_desc, create_topic_name("ddsc_unregistering_instance_test", name, 100), NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(g_topic > 0);
 | 
			
		||||
    g_writer = dds_create_writer(g_participant, g_topic, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_FATAL(g_writer > 0);
 | 
			
		||||
 | 
			
		||||
    /* Register the instance. */
 | 
			
		||||
    ret = dds_register_instance(g_writer, &ih, &testData);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_NOT_EQUAL_FATAL(ih, DDS_HANDLE_NIL);
 | 
			
		||||
 | 
			
		||||
    /* Unregister the instance. */
 | 
			
		||||
    ret = dds_unregister_instance_ih_ts(g_writer, ih, dds_time());
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    dds_delete(g_writer);
 | 
			
		||||
    dds_delete(g_topic);
 | 
			
		||||
    dds_delete(g_participant);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
CU_Test(ddsc_unregister_instance, dispose_unregistered_sample, .init=unregistering_init, .fini=unregistering_fini)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -76,11 +76,11 @@ CU_Test(ddsc_unsupported, dds_begin_end_coherent, .init = setup, .fini = teardow
 | 
			
		|||
        {BAD, DDS_RETCODE_BAD_PARAMETER}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    for (int i=0; i < 5; i++) {
 | 
			
		||||
    for (size_t i=0; i < sizeof (pars) / sizeof (pars[0]);i++) {
 | 
			
		||||
        result = dds_begin_coherent(e[pars[i].index]);
 | 
			
		||||
        CU_ASSERT_EQUAL(dds_err_nr(result), pars[i].exp_res);
 | 
			
		||||
        CU_ASSERT_EQUAL(result, pars[i].exp_res);
 | 
			
		||||
        result = dds_end_coherent(e[pars[i].index]);
 | 
			
		||||
        CU_ASSERT_EQUAL(dds_err_nr(result), pars[i].exp_res);
 | 
			
		||||
        CU_ASSERT_EQUAL(result, pars[i].exp_res);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -93,9 +93,9 @@ CU_Test(ddsc_unsupported, dds_wait_for_acks, .init = setup, .fini = teardown)
 | 
			
		|||
        {BAD, DDS_RETCODE_BAD_PARAMETER}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    for (int i=0; i< 3; i++) {
 | 
			
		||||
    for (size_t i=0; i < sizeof (pars) / sizeof (pars[0]);i++) {
 | 
			
		||||
        result = dds_wait_for_acks(e[pars[i].index], 0);
 | 
			
		||||
        CU_ASSERT_EQUAL(dds_err_nr(result), pars[i].exp_res);
 | 
			
		||||
        CU_ASSERT_EQUAL(result, pars[i].exp_res);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -108,11 +108,11 @@ CU_Test(ddsc_unsupported, dds_suspend_resume, .init = setup, .fini = teardown)
 | 
			
		|||
        {BAD, DDS_RETCODE_BAD_PARAMETER}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    for (int i=0; i< 3; i++) {
 | 
			
		||||
    for (size_t i=0; i < sizeof (pars) / sizeof (pars[0]);i++) {
 | 
			
		||||
        result = dds_suspend(e[pars[i].index]);
 | 
			
		||||
        CU_ASSERT_EQUAL(dds_err_nr(result), pars[i].exp_res);
 | 
			
		||||
        CU_ASSERT_EQUAL(result, pars[i].exp_res);
 | 
			
		||||
        result = dds_resume(e[pars[i].index]);
 | 
			
		||||
        CU_ASSERT_EQUAL(dds_err_nr(result), pars[i].exp_res);
 | 
			
		||||
        CU_ASSERT_EQUAL(result, pars[i].exp_res);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -121,16 +121,19 @@ CU_Test(ddsc_unsupported, dds_get_instance_handle, .init = setup, .fini = teardo
 | 
			
		|||
    dds_return_t result;
 | 
			
		||||
    dds_instance_handle_t ih;
 | 
			
		||||
    static struct index_result pars[] = {
 | 
			
		||||
        {TOP, DDS_RETCODE_ILLEGAL_OPERATION}, /* TODO: Shouldn't this be either supported or unsupported? */
 | 
			
		||||
        {PUB, DDS_RETCODE_UNSUPPORTED},
 | 
			
		||||
        {SUB, DDS_RETCODE_UNSUPPORTED},
 | 
			
		||||
        {RCD, DDS_RETCODE_ILLEGAL_OPERATION},
 | 
			
		||||
        {TOP, DDS_RETCODE_OK},
 | 
			
		||||
        {PUB, DDS_RETCODE_OK},
 | 
			
		||||
        {SUB, DDS_RETCODE_OK},
 | 
			
		||||
        {RCD, DDS_RETCODE_OK},
 | 
			
		||||
        {BAD, DDS_RETCODE_BAD_PARAMETER}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    for (int i=0; i < 5; i++) {
 | 
			
		||||
    for (size_t i=0; i < sizeof (pars) / sizeof (pars[0]);i++) {
 | 
			
		||||
        result = dds_get_instance_handle(e[pars[i].index], &ih);
 | 
			
		||||
        CU_ASSERT_EQUAL(dds_err_nr(result), pars[i].exp_res);
 | 
			
		||||
        CU_ASSERT_EQUAL(result, pars[i].exp_res);
 | 
			
		||||
        if (pars[i].exp_res == DDS_RETCODE_OK) {
 | 
			
		||||
          CU_ASSERT(ih > 0);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -139,20 +142,14 @@ CU_Test(ddsc_unsupported, dds_set_qos, .init = setup, .fini = teardown)
 | 
			
		|||
    dds_return_t result;
 | 
			
		||||
    dds_qos_t *qos;
 | 
			
		||||
    static struct index_result pars[] = {
 | 
			
		||||
        {PAR, DDS_RETCODE_UNSUPPORTED},
 | 
			
		||||
        {TOP, DDS_RETCODE_UNSUPPORTED},
 | 
			
		||||
        {PUB, DDS_RETCODE_UNSUPPORTED},
 | 
			
		||||
        {WRI, DDS_RETCODE_UNSUPPORTED},
 | 
			
		||||
        {SUB, DDS_RETCODE_UNSUPPORTED},
 | 
			
		||||
        {REA, DDS_RETCODE_UNSUPPORTED},
 | 
			
		||||
        {RCD, DDS_RETCODE_ILLEGAL_OPERATION},
 | 
			
		||||
        {BAD, DDS_RETCODE_BAD_PARAMETER}
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    qos = dds_create_qos();
 | 
			
		||||
    for (int i=0; i < 8;i++) {
 | 
			
		||||
    for (size_t i=0; i < sizeof (pars) / sizeof (pars[0]);i++) {
 | 
			
		||||
        result = dds_set_qos(e[pars[i].index], qos);
 | 
			
		||||
        CU_ASSERT_EQUAL(dds_err_nr(result), pars[i].exp_res);
 | 
			
		||||
        CU_ASSERT_EQUAL(result, pars[i].exp_res);
 | 
			
		||||
    }
 | 
			
		||||
    dds_delete_qos(qos);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@
 | 
			
		|||
#include "dds/ddsrt/misc.h"
 | 
			
		||||
#include "dds/ddsrt/process.h"
 | 
			
		||||
#include "dds/ddsrt/threads.h"
 | 
			
		||||
#include "dds/ddsrt/atomics.h"
 | 
			
		||||
#include "dds/ddsrt/time.h"
 | 
			
		||||
 | 
			
		||||
/**************************************************************************************************
 | 
			
		||||
| 
						 | 
				
			
			@ -36,7 +37,7 @@ typedef enum thread_state_t {
 | 
			
		|||
 | 
			
		||||
typedef struct thread_arg_t {
 | 
			
		||||
    ddsrt_thread_t tid;
 | 
			
		||||
    thread_state_t state;
 | 
			
		||||
    ddsrt_atomic_uint32_t state;
 | 
			
		||||
    dds_entity_t   expected;
 | 
			
		||||
} thread_arg_t;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -226,7 +227,7 @@ CU_Test(ddsc_waitset_create, deleted_participant, .init=ddsc_waitset_basic_init,
 | 
			
		|||
    deleted = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
 | 
			
		||||
    dds_delete(deleted);
 | 
			
		||||
    ws = dds_create_waitset(deleted);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ws), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ws, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -236,11 +237,10 @@ CU_TheoryDataPoints(ddsc_waitset_create, invalid_params) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t par), ddsc_waitset_create, invalid_params, .init=ddsc_waitset_basic_init, .fini=ddsc_waitset_basic_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_entity_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t ws;
 | 
			
		||||
 | 
			
		||||
    ws = dds_create_waitset(par);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ws), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ws, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -252,7 +252,7 @@ CU_Theory((dds_entity_t *par), ddsc_waitset_create, non_participants, .init=ddsc
 | 
			
		|||
{
 | 
			
		||||
    dds_entity_t ws;
 | 
			
		||||
    ws = dds_create_waitset(*par);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ws), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ws, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -276,7 +276,7 @@ CU_Theory((dds_entity_t e, dds_attach_t a), ddsc_waitset_attach, invalid_params,
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_waitset_attach(waitset, e, a);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -287,11 +287,10 @@ CU_TheoryDataPoints(ddsc_waitset_attach, invalid_waitsets) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t ws, dds_attach_t a), ddsc_waitset_attach, invalid_waitsets, .init=ddsc_waitset_basic_init, .fini=ddsc_waitset_basic_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_attach(ws, participant, a);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -305,7 +304,7 @@ CU_Theory((dds_entity_t *ws, dds_entity_t *e, dds_attach_t a), ddsc_waitset_atta
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_waitset_attach(*ws, *e, a);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -315,7 +314,7 @@ CU_Test(ddsc_waitset_attach, deleted_waitset, .init=ddsc_waitset_basic_init, .fi
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(waitset);
 | 
			
		||||
    ret = dds_waitset_attach(waitset, participant, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -347,7 +346,7 @@ CU_Theory((dds_entity_t *ws, dds_entity_t *e, dds_attach_t a), ddsc_waitset_atta
 | 
			
		|||
 | 
			
		||||
    /* Try to attach. */
 | 
			
		||||
    ret = dds_waitset_attach(*ws, *e, a);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), exp);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, exp);
 | 
			
		||||
 | 
			
		||||
    /* Detach when needed. */
 | 
			
		||||
    if (ret == DDS_RETCODE_OK) {
 | 
			
		||||
| 
						 | 
				
			
			@ -366,13 +365,13 @@ CU_Test(ddsc_waitset_attach_detach, second, .init=ddsc_waitset_basic_init, .fini
 | 
			
		|||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_attach(waitset, waitset, 0);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_detach(waitset, waitset);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_detach(waitset, waitset);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_PRECONDITION_NOT_MET);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -399,7 +398,7 @@ CU_Theory((dds_entity_t e), ddsc_waitset_detach, invalid_params, .init=ddsc_wait
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_waitset_detach(waitset, e);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -409,11 +408,10 @@ CU_TheoryDataPoints(ddsc_waitset_detach, invalid_waitsets) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t ws), ddsc_waitset_detach, invalid_waitsets, .init=ddsc_waitset_basic_init, .fini=ddsc_waitset_basic_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_detach(ws, participant);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -436,7 +434,7 @@ CU_Theory((dds_entity_t *ws, dds_entity_t *e), ddsc_waitset_detach, valid_entiti
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_detach(*ws, *e);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), exp);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, exp);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -580,7 +578,7 @@ CU_Test(ddsc_waitset_set_trigger, deleted_waitset, .init=ddsc_waitset_basic_init
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(waitset);
 | 
			
		||||
    ret = dds_waitset_set_trigger(waitset, true);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -590,11 +588,10 @@ CU_TheoryDataPoints(ddsc_waitset_set_trigger, invalid_params) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t ws), ddsc_waitset_set_trigger, invalid_params, .init=ddsc_waitset_basic_init, .fini=ddsc_waitset_basic_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_set_trigger(ws, true);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -606,7 +603,7 @@ CU_Theory((dds_entity_t *ws), ddsc_waitset_set_trigger, non_waitsets, .init=ddsc
 | 
			
		|||
{
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_waitset_set_trigger(*ws, true);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -625,7 +622,7 @@ CU_Test(ddsc_waitset_wait, deleted_waitset, .init=ddsc_waitset_attached_init, .f
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(waitset);
 | 
			
		||||
    ret = dds_waitset_wait(waitset, &triggered, 1, DDS_SECS(1));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -636,11 +633,10 @@ CU_TheoryDataPoints(ddsc_waitset_wait, invalid_waitsets) = {
 | 
			
		|||
CU_Theory((dds_entity_t ws), ddsc_waitset_wait, invalid_waitsets, .init=ddsc_waitset_basic_init, .fini=ddsc_waitset_basic_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_attach_t triggered;
 | 
			
		||||
    dds_return_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_wait(ws, &triggered, 1, DDS_SECS(1));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -653,7 +649,7 @@ CU_Theory((dds_entity_t *ws), ddsc_waitset_wait, non_waitsets, .init=ddsc_waitse
 | 
			
		|||
    dds_attach_t triggered;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_waitset_wait(*ws, &triggered, 1, DDS_SECS(1));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -672,7 +668,7 @@ CU_Theory((dds_attach_t *a, size_t size, int msec), ddsc_waitset_wait, invalid_p
 | 
			
		|||
    CU_ASSERT_FATAL(((a == NULL) && (size != 0)) || ((a != NULL) && (size == 0)) || (msec < 0));
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_wait(waitset, a, size, DDS_MSECS(msec));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -683,7 +679,7 @@ CU_Test(ddsc_waitset_wait_until, deleted_waitset, .init=ddsc_waitset_attached_in
 | 
			
		|||
    dds_return_t ret;
 | 
			
		||||
    dds_delete(waitset);
 | 
			
		||||
    ret = dds_waitset_wait_until(waitset, &triggered, 1, dds_time());
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -694,11 +690,10 @@ CU_TheoryDataPoints(ddsc_waitset_wait_until, invalid_waitsets) = {
 | 
			
		|||
CU_Theory((dds_entity_t ws), ddsc_waitset_wait_until, invalid_waitsets, .init=ddsc_waitset_basic_init, .fini=ddsc_waitset_basic_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_attach_t triggered;
 | 
			
		||||
    dds_return_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_wait_until(ws, &triggered, 1, dds_time());
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -711,7 +706,7 @@ CU_Theory((dds_entity_t *ws), ddsc_waitset_wait_until, non_waitsets, .init=ddsc_
 | 
			
		|||
    dds_attach_t triggered;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_waitset_wait_until(*ws, &triggered, 1, dds_time());
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -729,7 +724,7 @@ CU_Theory((dds_attach_t *a, size_t size), ddsc_waitset_wait_until, invalid_param
 | 
			
		|||
    CU_ASSERT_FATAL(((a == NULL) && (size != 0)) || ((a != NULL) && (size == 0)));
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_wait_until(waitset, a, size, dds_time());
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -843,7 +838,7 @@ CU_Test(ddsc_waitset_get_entities, deleted_waitset, .init=ddsc_waitset_attached_
 | 
			
		|||
    dds_entity_t entities[MAX_ENTITIES_CNT];
 | 
			
		||||
    dds_delete(waitset);
 | 
			
		||||
    ret = dds_waitset_get_entities(waitset, entities, MAX_ENTITIES_CNT);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -853,12 +848,11 @@ CU_TheoryDataPoints(ddsc_waitset_get_entities, invalid_params) = {
 | 
			
		|||
};
 | 
			
		||||
CU_Theory((dds_entity_t ws), ddsc_waitset_get_entities, invalid_params, .init=ddsc_waitset_attached_init, .fini=ddsc_waitset_attached_fini)
 | 
			
		||||
{
 | 
			
		||||
    dds_return_t exp = DDS_RETCODE_BAD_PARAMETER * -1;
 | 
			
		||||
    dds_entity_t entities[MAX_ENTITIES_CNT];
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    ret = dds_waitset_get_entities(ws, entities, MAX_ENTITIES_CNT);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), dds_err_nr(exp));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -871,7 +865,7 @@ CU_Theory((dds_entity_t *ws), ddsc_waitset_get_entities, non_waitsets, .init=dds
 | 
			
		|||
    dds_entity_t entities[MAX_ENTITIES_CNT];
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
    ret = dds_waitset_get_entities(*ws, entities, MAX_ENTITIES_CNT);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(ret), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
/*************************************************************************************************/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1063,26 +1057,26 @@ waiting_thread(void *a)
 | 
			
		|||
    dds_attach_t triggered;
 | 
			
		||||
    dds_return_t ret;
 | 
			
		||||
 | 
			
		||||
    arg->state = WAITING;
 | 
			
		||||
    ddsrt_atomic_st32 (&arg->state, WAITING);
 | 
			
		||||
    /* This should block until the main test released all claims. */
 | 
			
		||||
    ret = dds_waitset_wait(waitset, &triggered, 1, DDS_SECS(1000));
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(ret, 1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(arg->expected, (dds_entity_t)(intptr_t)triggered);
 | 
			
		||||
    arg->state = STOPPED;
 | 
			
		||||
    ddsrt_atomic_st32 (&arg->state, STOPPED);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static dds_retcode_t
 | 
			
		||||
thread_reached_state(thread_state_t *actual, thread_state_t expected, int32_t msec)
 | 
			
		||||
static dds_return_t
 | 
			
		||||
thread_reached_state(ddsrt_atomic_uint32_t *actual, thread_state_t expected, int32_t msec)
 | 
			
		||||
{
 | 
			
		||||
    /* Convenience function. */
 | 
			
		||||
    dds_time_t msec10 = DDS_MSECS(10);
 | 
			
		||||
    while ((msec > 0) && (*actual != expected)) {
 | 
			
		||||
    while ((msec > 0) && ((thread_state_t) ddsrt_atomic_ld32 (actual) != expected)) {
 | 
			
		||||
        dds_sleepfor(msec10);
 | 
			
		||||
        msec -= 10;
 | 
			
		||||
    }
 | 
			
		||||
    return (*actual == expected) ? DDS_RETCODE_OK : DDS_RETCODE_TIMEOUT;
 | 
			
		||||
    return ((thread_state_t) ddsrt_atomic_ld32 (actual) == expected) ? DDS_RETCODE_OK : DDS_RETCODE_TIMEOUT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
| 
						 | 
				
			
			@ -1090,13 +1084,13 @@ waiting_thread_start(struct thread_arg_t *arg, dds_entity_t expected)
 | 
			
		|||
{
 | 
			
		||||
    ddsrt_thread_t thread_id;
 | 
			
		||||
    ddsrt_threadattr_t thread_attr;
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_return_t rc;
 | 
			
		||||
 | 
			
		||||
    assert(arg);
 | 
			
		||||
 | 
			
		||||
    /* Create an other thread that will blocking wait on the waitset. */
 | 
			
		||||
    arg->expected = expected;
 | 
			
		||||
    arg->state   = STARTING;
 | 
			
		||||
    ddsrt_atomic_st32 (&arg->state, STARTING);
 | 
			
		||||
    ddsrt_threadattr_init(&thread_attr);
 | 
			
		||||
    rc = ddsrt_thread_create(&thread_id, "waiting_thread", &thread_attr, waiting_thread, arg);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(rc, DDS_RETCODE_OK);
 | 
			
		||||
| 
						 | 
				
			
			@ -1115,7 +1109,7 @@ waiting_thread_start(struct thread_arg_t *arg, dds_entity_t expected)
 | 
			
		|||
static dds_return_t
 | 
			
		||||
waiting_thread_expect_exit(struct thread_arg_t *arg)
 | 
			
		||||
{
 | 
			
		||||
    dds_retcode_t rc;
 | 
			
		||||
    dds_return_t rc;
 | 
			
		||||
    assert(arg);
 | 
			
		||||
    rc = thread_reached_state(&(arg->state), STOPPED, 5000);
 | 
			
		||||
    if (rc == DDS_RETCODE_OK) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ CU_Test(ddsc_write, basic, .init = setup, .fini = teardown)
 | 
			
		|||
    dds_return_t status;
 | 
			
		||||
 | 
			
		||||
    status = dds_write(writer, &data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_write, null_writer, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +76,7 @@ CU_Test(ddsc_write, null_writer, .init = setup, .fini = teardown)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(28020);
 | 
			
		||||
    status = dds_write(0, &data);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(28020);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_write, bad_writer, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -84,7 +84,7 @@ CU_Test(ddsc_write, bad_writer, .init = setup, .fini = teardown)
 | 
			
		|||
    dds_return_t status;
 | 
			
		||||
 | 
			
		||||
    status = dds_write(publisher, &data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_write, closed_writer, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -92,10 +92,10 @@ CU_Test(ddsc_write, closed_writer, .init = setup, .fini = teardown)
 | 
			
		|||
    dds_return_t status;
 | 
			
		||||
 | 
			
		||||
    status = dds_delete(writer);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
    status = dds_write(writer, &data);
 | 
			
		||||
    writer = 0;
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_write, null_sample, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ CU_Test(ddsc_write, null_sample, .init = setup, .fini = teardown)
 | 
			
		|||
    status = dds_write(writer, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(6387);
 | 
			
		||||
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_write_ts, basic, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -115,7 +115,7 @@ CU_Test(ddsc_write_ts, basic, .init = setup, .fini = teardown)
 | 
			
		|||
    dds_return_t status;
 | 
			
		||||
 | 
			
		||||
    status = dds_write_ts(writer, &data, dds_time());
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_write_ts, bad_timestamp, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -123,7 +123,7 @@ CU_Test(ddsc_write_ts, bad_timestamp, .init = setup, .fini = teardown)
 | 
			
		|||
    dds_return_t status;
 | 
			
		||||
 | 
			
		||||
    status = dds_write_ts(writer, &data, -1);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_write, simpletypes)
 | 
			
		||||
| 
						 | 
				
			
			@ -152,7 +152,7 @@ CU_Test(ddsc_write, simpletypes)
 | 
			
		|||
    CU_ASSERT_FATAL(wri > 0);
 | 
			
		||||
 | 
			
		||||
    status = dds_write(wri, &st_data);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(status), DDS_RETCODE_OK);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(status, DDS_RETCODE_OK);
 | 
			
		||||
 | 
			
		||||
    dds_delete(wri);
 | 
			
		||||
    dds_delete(top);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,13 +57,13 @@ CU_Test(ddsc_create_writer, null_parent, .init = setup, .fini = teardown)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(28020); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    writer = dds_create_writer(0, topic, NULL, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(28020);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(writer), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(writer, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_create_writer, bad_parent, .init = setup, .fini = teardown)
 | 
			
		||||
{
 | 
			
		||||
    writer = dds_create_writer(topic, topic, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(writer), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(writer, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_create_writer, participant, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +83,7 @@ CU_Test(ddsc_create_writer, deleted_publisher, .init = setup, .fini = teardown)
 | 
			
		|||
    dds_delete(publisher);
 | 
			
		||||
 | 
			
		||||
    writer = dds_create_writer(publisher, topic, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(writer), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(writer, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_create_writer, null_topic, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -91,13 +91,13 @@ CU_Test(ddsc_create_writer, null_topic, .init = setup, .fini = teardown)
 | 
			
		|||
    DDSRT_WARNING_MSVC_OFF(28020); /* Disable SAL warning on intentional misuse of the API */
 | 
			
		||||
    writer = dds_create_writer(publisher, 0, NULL, NULL);
 | 
			
		||||
    DDSRT_WARNING_MSVC_ON(28020);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(writer), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(writer, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_create_writer, bad_topic, .init = setup, .fini = teardown)
 | 
			
		||||
{
 | 
			
		||||
    writer = dds_create_writer(publisher, publisher, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(writer), DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(writer, DDS_RETCODE_ILLEGAL_OPERATION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
CU_Test(ddsc_create_writer, deleted_topic, .init = setup, .fini = teardown)
 | 
			
		||||
| 
						 | 
				
			
			@ -105,5 +105,5 @@ CU_Test(ddsc_create_writer, deleted_topic, .init = setup, .fini = teardown)
 | 
			
		|||
    dds_delete(topic);
 | 
			
		||||
 | 
			
		||||
    writer = dds_create_writer(publisher, topic, NULL, NULL);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(dds_err_nr(writer), DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
    CU_ASSERT_EQUAL_FATAL(writer, DDS_RETCODE_BAD_PARAMETER);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,7 +22,6 @@ PREPEND(srcs_ddsi "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    ddsi_serdata_default.c
 | 
			
		||||
    ddsi_sertopic.c
 | 
			
		||||
    ddsi_sertopic_default.c
 | 
			
		||||
    ddsi_rhc_plugin.c
 | 
			
		||||
    ddsi_iid.c
 | 
			
		||||
    ddsi_tkmap.c
 | 
			
		||||
    ddsi_vendor.c
 | 
			
		||||
| 
						 | 
				
			
			@ -54,6 +53,7 @@ PREPEND(srcs_ddsi "${CMAKE_CURRENT_LIST_DIR}/src"
 | 
			
		|||
    q_transmit.c
 | 
			
		||||
    q_inverse_uint32_set.c
 | 
			
		||||
    q_whc.c
 | 
			
		||||
    q_rhc.c
 | 
			
		||||
    q_xevent.c
 | 
			
		||||
    q_xmsg.c
 | 
			
		||||
    q_freelist.c
 | 
			
		||||
| 
						 | 
				
			
			@ -73,11 +73,11 @@ PREPEND(hdrs_private_ddsi "${CMAKE_CURRENT_LIST_DIR}/include/dds/ddsi"
 | 
			
		|||
    ddsi_serdata.h
 | 
			
		||||
    ddsi_sertopic.h
 | 
			
		||||
    ddsi_serdata_default.h
 | 
			
		||||
    ddsi_rhc_plugin.h
 | 
			
		||||
    ddsi_iid.h
 | 
			
		||||
    ddsi_tkmap.h
 | 
			
		||||
    ddsi_vendor.h
 | 
			
		||||
    ddsi_threadmon.h
 | 
			
		||||
    ddsi_builtin_topic_if.h
 | 
			
		||||
    q_addrset.h
 | 
			
		||||
    q_bitset.h
 | 
			
		||||
    q_bswap.h
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +86,6 @@ PREPEND(hdrs_private_ddsi "${CMAKE_CURRENT_LIST_DIR}/include/dds/ddsi"
 | 
			
		|||
    q_debmon.h
 | 
			
		||||
    q_entity.h
 | 
			
		||||
    q_ephash.h
 | 
			
		||||
    q_error.h
 | 
			
		||||
    q_feature_check.h
 | 
			
		||||
    q_freelist.h
 | 
			
		||||
    q_gc.h
 | 
			
		||||
| 
						 | 
				
			
			@ -103,10 +102,10 @@ PREPEND(hdrs_private_ddsi "${CMAKE_CURRENT_LIST_DIR}/include/dds/ddsi"
 | 
			
		|||
    q_qosmatch.h
 | 
			
		||||
    q_radmin.h
 | 
			
		||||
    q_receive.h
 | 
			
		||||
    q_rhc.h
 | 
			
		||||
    q_rtps.h
 | 
			
		||||
    q_security.h
 | 
			
		||||
    q_sockwaitset.h
 | 
			
		||||
    q_static_assert.h
 | 
			
		||||
    q_thread.h
 | 
			
		||||
    q_time.h
 | 
			
		||||
    q_transmit.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										53
									
								
								src/core/ddsi/include/dds/ddsi/ddsi_builtin_topic_if.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/core/ddsi/include/dds/ddsi/ddsi_builtin_topic_if.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,53 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Copyright(c) 2019 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 _DDSI_BUILTIN_TOPIC_IF_H_
 | 
			
		||||
#define _DDSI_BUILTIN_TOPIC_IF_H_
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsi/ddsi_vendor.h"
 | 
			
		||||
#include "dds/ddsi/q_time.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct entity_common;
 | 
			
		||||
struct ddsi_tkmap_instance;
 | 
			
		||||
struct ddsi_sertopic;
 | 
			
		||||
struct nn_guid;
 | 
			
		||||
 | 
			
		||||
struct ddsi_builtin_topic_interface {
 | 
			
		||||
  void *arg;
 | 
			
		||||
 | 
			
		||||
  bool (*builtintopic_is_builtintopic) (const struct ddsi_sertopic *topic, void *arg);
 | 
			
		||||
  bool (*builtintopic_is_visible) (const struct nn_guid *guid, nn_vendorid_t vendorid, void *arg);
 | 
			
		||||
  struct ddsi_tkmap_instance * (*builtintopic_get_tkmap_entry) (const struct nn_guid *guid, void *arg);
 | 
			
		||||
  void (*builtintopic_write) (const struct entity_common *e, nn_wctime_t timestamp, bool alive, void *arg);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline bool builtintopic_is_visible (const struct ddsi_builtin_topic_interface *btif, const struct nn_guid *guid, nn_vendorid_t vendorid) {
 | 
			
		||||
  return btif ? btif->builtintopic_is_visible (guid, vendorid, btif->arg) : false;
 | 
			
		||||
}
 | 
			
		||||
inline bool builtintopic_is_builtintopic (const struct ddsi_builtin_topic_interface *btif, const struct ddsi_sertopic *topic) {
 | 
			
		||||
  return btif ? btif->builtintopic_is_builtintopic (topic, btif->arg) : false;
 | 
			
		||||
}
 | 
			
		||||
inline struct ddsi_tkmap_instance *builtintopic_get_tkmap_entry (const struct ddsi_builtin_topic_interface *btif, const struct nn_guid *guid) {
 | 
			
		||||
  return btif ? btif->builtintopic_get_tkmap_entry (guid, btif->arg) : NULL;
 | 
			
		||||
}
 | 
			
		||||
inline void builtintopic_write (const struct ddsi_builtin_topic_interface *btif, const struct entity_common *e, nn_wctime_t timestamp, bool alive) {
 | 
			
		||||
  if (btif) btif->builtintopic_write (e, timestamp, alive, btif->arg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +18,7 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
enum ddsi_nearby_address_result ddsi_ipaddr_is_nearby_address (ddsi_tran_factory_t tran, const nn_locator_t *loc, size_t ninterf, const struct nn_interface *interf);
 | 
			
		||||
enum ddsi_nearby_address_result ddsi_ipaddr_is_nearby_address (ddsi_tran_factory_t tran, const nn_locator_t *loc, const nn_locator_t *ownloc, size_t ninterf, const struct nn_interface *interf);
 | 
			
		||||
enum ddsi_locator_from_string_result ddsi_ipaddr_from_string (ddsi_tran_factory_t tran, nn_locator_t *loc, const char *str, int32_t kind);
 | 
			
		||||
int ddsi_ipaddr_compare (const struct sockaddr *const sa1, const struct sockaddr *const sa2);
 | 
			
		||||
char *ddsi_ipaddr_to_string (ddsi_tran_factory_t tran, char *dst, size_t sizeof_dst, const nn_locator_t *loc, int with_port);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,10 +22,10 @@ struct nn_group_membership;
 | 
			
		|||
 | 
			
		||||
struct nn_group_membership *new_group_membership (void);
 | 
			
		||||
void free_group_membership (struct nn_group_membership *mship);
 | 
			
		||||
int ddsi_join_mc (ddsi_tran_conn_t conn, const nn_locator_t *srcip, const nn_locator_t *mcip);
 | 
			
		||||
int ddsi_leave_mc (ddsi_tran_conn_t conn, const nn_locator_t *srcip, const nn_locator_t *mcip);
 | 
			
		||||
void ddsi_transfer_group_membership (ddsi_tran_conn_t conn, ddsi_tran_conn_t newconn);
 | 
			
		||||
int ddsi_rejoin_transferred_mcgroups (ddsi_tran_conn_t conn);
 | 
			
		||||
int ddsi_join_mc (const struct q_globals *gv, struct nn_group_membership *mship, ddsi_tran_conn_t conn, const nn_locator_t *srcip, const nn_locator_t *mcip);
 | 
			
		||||
int ddsi_leave_mc (const struct q_globals *gv, struct nn_group_membership *mship, ddsi_tran_conn_t conn, const nn_locator_t *srcip, const nn_locator_t *mcip);
 | 
			
		||||
void ddsi_transfer_group_membership (struct nn_group_membership *mship, ddsi_tran_conn_t conn, ddsi_tran_conn_t newconn);
 | 
			
		||||
int ddsi_rejoin_transferred_mcgroups (const struct q_globals *gv, struct nn_group_membership *mship, ddsi_tran_conn_t conn);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int ddsi_raweth_init (void);
 | 
			
		||||
int ddsi_raweth_init (struct q_globals *gv);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,53 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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 DDSI_RHC_PLUGIN_H
 | 
			
		||||
#define DDSI_RHC_PLUGIN_H
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct rhc;
 | 
			
		||||
struct nn_xqos;
 | 
			
		||||
struct ddsi_tkmap_instance;
 | 
			
		||||
struct ddsi_serdata;
 | 
			
		||||
struct ddsi_sertopic;
 | 
			
		||||
struct entity_common;
 | 
			
		||||
 | 
			
		||||
struct proxy_writer_info
 | 
			
		||||
{
 | 
			
		||||
  nn_guid_t guid;
 | 
			
		||||
  bool auto_dispose;
 | 
			
		||||
  int32_t ownership_strength;
 | 
			
		||||
  uint64_t iid;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct ddsi_rhc_plugin
 | 
			
		||||
{
 | 
			
		||||
  void (*rhc_free_fn) (struct rhc *rhc);
 | 
			
		||||
  bool (*rhc_store_fn)
 | 
			
		||||
  (struct rhc * __restrict rhc, const struct proxy_writer_info * __restrict pwr_info,
 | 
			
		||||
   struct ddsi_serdata * __restrict sample, struct ddsi_tkmap_instance * __restrict tk);
 | 
			
		||||
  void (*rhc_unregister_wr_fn)
 | 
			
		||||
  (struct rhc * __restrict rhc, const struct proxy_writer_info * __restrict pwr_info);
 | 
			
		||||
  void (*rhc_relinquish_ownership_fn)
 | 
			
		||||
  (struct rhc * __restrict rhc, const uint64_t wr_iid);
 | 
			
		||||
  void (*rhc_set_qos_fn) (struct rhc * rhc, const struct nn_xqos * qos);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void make_proxy_writer_info(struct proxy_writer_info *pwr_info, const struct entity_common *e, const struct nn_xqos *xqos);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +13,7 @@
 | 
			
		|||
#define DDSI_SERDATA_DEFAULT_H
 | 
			
		||||
 | 
			
		||||
#include "dds/ddsrt/endian.h"
 | 
			
		||||
#include "dds/ddsi/q_plist.h" /* for nn_prismtech_writer_info */
 | 
			
		||||
#include "dds/ddsi/q_protocol.h" /* for nn_parameterid_t */
 | 
			
		||||
#include "dds/ddsi/q_freelist.h"
 | 
			
		||||
#include "dds/ddsrt/avl.h"
 | 
			
		||||
#include "dds/ddsi/ddsi_serdata.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -43,33 +43,58 @@ struct serdatapool {
 | 
			
		|||
  struct nn_freelist freelist;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef struct dds_key_hash {
 | 
			
		||||
  char m_hash [16];          /* Key hash value. Also possibly key. Suitably aligned for accessing as uint32_t's */
 | 
			
		||||
typedef struct dds_keyhash {
 | 
			
		||||
  unsigned char m_hash [16]; /* Key hash value. Also possibly key. Suitably aligned for accessing as uint32_t's */
 | 
			
		||||
  unsigned m_set : 1;        /* has it been initialised? */
 | 
			
		||||
  unsigned m_iskey : 1;      /* m_hash is key value */
 | 
			
		||||
}
 | 
			
		||||
dds_key_hash_t;
 | 
			
		||||
} dds_keyhash_t;
 | 
			
		||||
 | 
			
		||||
/* Debug builds may want to keep some additional state */
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
#define DDSI_SERDATA_DEFAULT_DEBUG_FIELDS \
 | 
			
		||||
  bool fixed;
 | 
			
		||||
#else
 | 
			
		||||
#define DDSI_SERDATA_DEFAULT_DEBUG_FIELDS
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* There is an alignment requirement on the raw data (it must be at
 | 
			
		||||
   offset mod 8 for the conversion to/from a dds_stream to work).
 | 
			
		||||
   So we define two types: one without any additional padding, and
 | 
			
		||||
   one where the appropriate amount of padding is inserted */
 | 
			
		||||
#define DDSI_SERDATA_DEFAULT_PREPAD   \
 | 
			
		||||
  struct ddsi_serdata c;              \
 | 
			
		||||
  uint32_t pos;                       \
 | 
			
		||||
  uint32_t size;                      \
 | 
			
		||||
  DDSI_SERDATA_DEFAULT_DEBUG_FIELDS   \
 | 
			
		||||
  dds_keyhash_t keyhash;              \
 | 
			
		||||
  struct serdatapool *serpool;        \
 | 
			
		||||
  struct ddsi_serdata_default *next /* in pool->freelist */
 | 
			
		||||
#define DDSI_SERDATA_DEFAULT_POSTPAD  \
 | 
			
		||||
  struct CDRHeader hdr;               \
 | 
			
		||||
  char data[]
 | 
			
		||||
 | 
			
		||||
struct ddsi_serdata_default_unpadded {
 | 
			
		||||
  DDSI_SERDATA_DEFAULT_PREPAD;
 | 
			
		||||
  DDSI_SERDATA_DEFAULT_POSTPAD;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
#define DDSI_SERDATA_DEFAULT_PAD(n) ((n) % 8)
 | 
			
		||||
#else
 | 
			
		||||
#define DDSI_SERDATA_DEFAULT_PAD(n) (n)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
struct ddsi_serdata_default {
 | 
			
		||||
  struct ddsi_serdata c;
 | 
			
		||||
  uint32_t pos;
 | 
			
		||||
  uint32_t size;
 | 
			
		||||
#ifndef NDEBUG
 | 
			
		||||
  bool fixed;
 | 
			
		||||
#endif
 | 
			
		||||
  dds_key_hash_t keyhash;
 | 
			
		||||
 | 
			
		||||
  struct serdatapool *pool;
 | 
			
		||||
  struct ddsi_serdata_default *next; /* in pool->freelist */
 | 
			
		||||
 | 
			
		||||
  /* padding to ensure CDRHeader is at an offset 4 mod 8 from the
 | 
			
		||||
     start of the memory, so that data is 8-byte aligned provided
 | 
			
		||||
     serdata is 8-byte aligned */
 | 
			
		||||
  char pad[8 - ((sizeof (struct ddsi_serdata) + 4) % 8)];
 | 
			
		||||
  struct CDRHeader hdr;
 | 
			
		||||
  char data[1];
 | 
			
		||||
  DDSI_SERDATA_DEFAULT_PREPAD;
 | 
			
		||||
  char pad[DDSI_SERDATA_DEFAULT_PAD (8 - (offsetof (struct ddsi_serdata_default_unpadded, data) % 8))];
 | 
			
		||||
  DDSI_SERDATA_DEFAULT_POSTPAD;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#undef DDSI_SERDATA_DEFAULT_PAD
 | 
			
		||||
#undef DDSI_SERDATA_DEFAULT_POSTPAD
 | 
			
		||||
#undef DDSI_SERDATA_DEFAULT_PREPAD
 | 
			
		||||
#undef DDSI_SERDATA_DEFAULT_FIXED_FIELD
 | 
			
		||||
 | 
			
		||||
struct dds_key_descriptor;
 | 
			
		||||
struct dds_topic_descriptor;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -81,6 +106,7 @@ typedef bool (*dds_topic_intern_filter_fn) (const void * sample, void *ctx);
 | 
			
		|||
struct ddsi_sertopic_default {
 | 
			
		||||
  struct ddsi_sertopic c;
 | 
			
		||||
  uint16_t native_encoding_identifier; /* (PL_)?CDR_(LE|BE) */
 | 
			
		||||
  struct serdatapool *serpool;
 | 
			
		||||
 | 
			
		||||
  struct dds_topic_descriptor * type;
 | 
			
		||||
  unsigned nkeys;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,27 +22,32 @@ extern "C" {
 | 
			
		|||
 | 
			
		||||
struct ddsi_serdata;
 | 
			
		||||
struct ddsi_serdata_ops;
 | 
			
		||||
 | 
			
		||||
struct dds_topic;
 | 
			
		||||
typedef void (*topic_cb_t) (struct dds_topic * topic);
 | 
			
		||||
 | 
			
		||||
struct ddsi_sertopic_ops;
 | 
			
		||||
 | 
			
		||||
struct ddsi_sertopic {
 | 
			
		||||
  ddsrt_avl_node_t avlnode; /* index on name_typename */
 | 
			
		||||
  const struct ddsi_sertopic_ops *ops;
 | 
			
		||||
  const struct ddsi_serdata_ops *serdata_ops;
 | 
			
		||||
  uint32_t serdata_basehash;
 | 
			
		||||
  bool topickind_no_key;
 | 
			
		||||
  char *name_type_name;
 | 
			
		||||
  char *name;
 | 
			
		||||
  char *type_name;
 | 
			
		||||
  uint64_t iid;
 | 
			
		||||
  ddsrt_atomic_uint32_t refc; /* counts refs from entities, not from data */
 | 
			
		||||
 | 
			
		||||
  topic_cb_t status_cb;
 | 
			
		||||
  struct dds_topic * status_cb_entity;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* The old and the new happen to have the same memory layout on a 64-bit machine
 | 
			
		||||
   and so any user that memset's the ddsi_sertopic to 0 before filling out the
 | 
			
		||||
   required fields gets unchanged behaviour.  32-bit machines have a different
 | 
			
		||||
   layout and no such luck.
 | 
			
		||||
 | 
			
		||||
   There are presumably very few users of this type outside Cyclone DDS itself,
 | 
			
		||||
   but the ROS2 RMW implementation does use it -- indeed, it prompted the change.
 | 
			
		||||
   This define makes it possible to have a single version of the source that is
 | 
			
		||||
   compatible with the old and the new definition, even if it is only partially
 | 
			
		||||
   binary compatible. */
 | 
			
		||||
#define DDSI_SERTOPIC_HAS_TOPICKIND_NO_KEY 1
 | 
			
		||||
 | 
			
		||||
/* Called when the refcount dropped to zero */
 | 
			
		||||
typedef void (*ddsi_sertopic_free_t) (struct ddsi_sertopic *tp);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -63,6 +68,9 @@ struct ddsi_sertopic_ops {
 | 
			
		|||
  ddsi_sertopic_free_samples_t free_samples;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT void ddsi_sertopic_init (struct ddsi_sertopic *tp, const char *name, const char *type_name, const struct ddsi_sertopic_ops *sertopic_ops, const struct ddsi_serdata_ops *serdata_ops, bool topickind_no_key);
 | 
			
		||||
DDS_EXPORT void ddsi_sertopic_init_anon (struct ddsi_sertopic *tp, const struct ddsi_sertopic_ops *sertopic_ops, const struct ddsi_serdata_ops *serdata_ops, bool topickind_no_key);
 | 
			
		||||
DDS_EXPORT void ddsi_sertopic_fini (struct ddsi_sertopic *tp);
 | 
			
		||||
DDS_EXPORT struct ddsi_sertopic *ddsi_sertopic_ref (const struct ddsi_sertopic *tp);
 | 
			
		||||
DDS_EXPORT void ddsi_sertopic_unref (struct ddsi_sertopic *tp);
 | 
			
		||||
DDS_EXPORT uint32_t ddsi_sertopic_compute_serdata_basehash (const struct ddsi_serdata_ops *ops);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,28 +24,28 @@ extern "C" {
 | 
			
		|||
 | 
			
		||||
struct ddsi_ssl_plugins
 | 
			
		||||
{
 | 
			
		||||
  bool (*init) (void);
 | 
			
		||||
  bool (*init) (struct q_globals *gv);
 | 
			
		||||
  void (*fini) (void);
 | 
			
		||||
  void (*ssl_free) (SSL *ssl);
 | 
			
		||||
  void (*bio_vfree) (BIO *bio);
 | 
			
		||||
  ssize_t (*read) (SSL *ssl, void *buf, size_t len, dds_retcode_t *err);
 | 
			
		||||
  ssize_t (*write) (SSL *ssl, const void *msg, size_t len, dds_retcode_t *err);
 | 
			
		||||
  SSL * (*connect) (ddsrt_socket_t sock);
 | 
			
		||||
  ssize_t (*read) (SSL *ssl, void *buf, size_t len, dds_return_t *err);
 | 
			
		||||
  ssize_t (*write) (SSL *ssl, const void *msg, size_t len, dds_return_t *err);
 | 
			
		||||
  SSL * (*connect) (const struct q_globals *gv, ddsrt_socket_t sock);
 | 
			
		||||
  BIO * (*listen) (ddsrt_socket_t sock);
 | 
			
		||||
  SSL * (*accept) (BIO *bio, ddsrt_socket_t *sock);
 | 
			
		||||
  SSL * (*accept) (const struct q_globals *gv, BIO *bio, ddsrt_socket_t *sock);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* DDSI_INCLUDE_SSL */
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int ddsi_tcp_init (void);
 | 
			
		||||
int ddsi_tcp_init (struct q_globals *gv);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,12 +17,14 @@ extern "C" {
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
struct ddsi_threadmon;
 | 
			
		||||
struct q_globals;
 | 
			
		||||
 | 
			
		||||
struct ddsi_threadmon *ddsi_threadmon_new (void);
 | 
			
		||||
int ddsi_threadmon_start (struct ddsi_threadmon *sl);
 | 
			
		||||
struct ddsi_threadmon *ddsi_threadmon_new (int64_t liveliness_monitoring_interval, bool noprogress_log_stacktraces);
 | 
			
		||||
dds_return_t ddsi_threadmon_start (struct ddsi_threadmon *sl, const char *name);
 | 
			
		||||
void ddsi_threadmon_register_domain (struct ddsi_threadmon *sl, const struct q_globals *gv);
 | 
			
		||||
void ddsi_threadmon_unregister_domain (struct ddsi_threadmon *sl, const struct q_globals *gv);
 | 
			
		||||
void ddsi_threadmon_stop (struct ddsi_threadmon *sl);
 | 
			
		||||
void ddsi_threadmon_free (struct ddsi_threadmon *sl);
 | 
			
		||||
void ddsi_threadmon_statechange_barrier (struct ddsi_threadmon *sl);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,22 +22,23 @@ extern "C" {
 | 
			
		|||
struct ddsi_tkmap;
 | 
			
		||||
struct ddsi_serdata;
 | 
			
		||||
struct dds_topic;
 | 
			
		||||
struct q_globals;
 | 
			
		||||
 | 
			
		||||
struct ddsi_tkmap_instance
 | 
			
		||||
{
 | 
			
		||||
  struct ddsi_serdata * m_sample;
 | 
			
		||||
  struct ddsi_serdata *m_sample;
 | 
			
		||||
  uint64_t m_iid;
 | 
			
		||||
  ddsrt_atomic_uint32_t m_refc;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
DDS_EXPORT struct ddsi_tkmap * ddsi_tkmap_new (void);
 | 
			
		||||
DDS_EXPORT struct ddsi_tkmap *ddsi_tkmap_new (struct q_globals *gv);
 | 
			
		||||
DDS_EXPORT void ddsi_tkmap_free (struct ddsi_tkmap *tkmap);
 | 
			
		||||
DDS_EXPORT void ddsi_tkmap_instance_ref (struct ddsi_tkmap_instance *tk);
 | 
			
		||||
DDS_EXPORT uint64_t ddsi_tkmap_lookup (struct ddsi_tkmap *tkmap, const struct ddsi_serdata *serdata);
 | 
			
		||||
DDS_EXPORT struct ddsi_tkmap_instance * ddsi_tkmap_find(struct ddsi_serdata *sd, const bool rd, const bool create);
 | 
			
		||||
DDS_EXPORT struct ddsi_tkmap_instance * ddsi_tkmap_find(struct ddsi_tkmap *map, struct ddsi_serdata *sd, const bool create);
 | 
			
		||||
DDS_EXPORT struct ddsi_tkmap_instance * ddsi_tkmap_find_by_id (struct ddsi_tkmap *map, uint64_t iid);
 | 
			
		||||
DDS_EXPORT struct ddsi_tkmap_instance * ddsi_tkmap_lookup_instance_ref (struct ddsi_serdata * sd);
 | 
			
		||||
DDS_EXPORT void ddsi_tkmap_instance_unref (struct ddsi_tkmap_instance *tk);
 | 
			
		||||
DDS_EXPORT struct ddsi_tkmap_instance * ddsi_tkmap_lookup_instance_ref (struct ddsi_tkmap *map, struct ddsi_serdata * sd);
 | 
			
		||||
DDS_EXPORT void ddsi_tkmap_instance_unref (struct ddsi_tkmap *map, struct ddsi_tkmap_instance *tk);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,6 +17,7 @@
 | 
			
		|||
#include "dds/ddsrt/ifaddrs.h"
 | 
			
		||||
#include "dds/ddsrt/atomics.h"
 | 
			
		||||
#include "dds/ddsi/q_protocol.h"
 | 
			
		||||
#include "dds/ddsi/q_config.h"
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
extern "C" {
 | 
			
		||||
| 
						 | 
				
			
			@ -51,16 +52,16 @@ typedef struct ddsi_tran_qos * ddsi_tran_qos_t;
 | 
			
		|||
 | 
			
		||||
typedef ssize_t (*ddsi_tran_read_fn_t) (ddsi_tran_conn_t, unsigned char *, size_t, bool, nn_locator_t *);
 | 
			
		||||
typedef ssize_t (*ddsi_tran_write_fn_t) (ddsi_tran_conn_t, const nn_locator_t *, size_t, const ddsrt_iovec_t *, uint32_t);
 | 
			
		||||
typedef int (*ddsi_tran_locator_fn_t) (ddsi_tran_base_t, nn_locator_t *);
 | 
			
		||||
typedef bool (*ddsi_tran_supports_fn_t) (int32_t);
 | 
			
		||||
typedef int (*ddsi_tran_locator_fn_t) (ddsi_tran_factory_t, ddsi_tran_base_t, nn_locator_t *);
 | 
			
		||||
typedef bool (*ddsi_tran_supports_fn_t) (const struct ddsi_tran_factory *, int32_t);
 | 
			
		||||
typedef ddsrt_socket_t (*ddsi_tran_handle_fn_t) (ddsi_tran_base_t);
 | 
			
		||||
typedef int (*ddsi_tran_listen_fn_t) (ddsi_tran_listener_t);
 | 
			
		||||
typedef void (*ddsi_tran_free_fn_t) (void);
 | 
			
		||||
typedef void (*ddsi_tran_free_fn_t) (ddsi_tran_factory_t);
 | 
			
		||||
typedef void (*ddsi_tran_peer_locator_fn_t) (ddsi_tran_conn_t, nn_locator_t *);
 | 
			
		||||
typedef void (*ddsi_tran_disable_multiplexing_fn_t) (ddsi_tran_conn_t);
 | 
			
		||||
typedef ddsi_tran_conn_t (*ddsi_tran_accept_fn_t) (ddsi_tran_listener_t);
 | 
			
		||||
typedef ddsi_tran_conn_t (*ddsi_tran_create_conn_fn_t) (uint32_t, ddsi_tran_qos_t);
 | 
			
		||||
typedef ddsi_tran_listener_t (*ddsi_tran_create_listener_fn_t) (int port, ddsi_tran_qos_t);
 | 
			
		||||
typedef ddsi_tran_conn_t (*ddsi_tran_create_conn_fn_t) (ddsi_tran_factory_t fact, uint32_t, ddsi_tran_qos_t);
 | 
			
		||||
typedef ddsi_tran_listener_t (*ddsi_tran_create_listener_fn_t) (ddsi_tran_factory_t fact, int port, ddsi_tran_qos_t);
 | 
			
		||||
typedef void (*ddsi_tran_release_conn_fn_t) (ddsi_tran_conn_t);
 | 
			
		||||
typedef void (*ddsi_tran_close_conn_fn_t) (ddsi_tran_conn_t);
 | 
			
		||||
typedef void (*ddsi_tran_unblock_listener_fn_t) (ddsi_tran_listener_t);
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +77,7 @@ enum ddsi_nearby_address_result {
 | 
			
		|||
  DNAR_SAME
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef enum ddsi_nearby_address_result (*ddsi_is_nearby_address_fn_t) (ddsi_tran_factory_t tran, const nn_locator_t *loc, size_t ninterf, const struct nn_interface *interf);
 | 
			
		||||
typedef enum ddsi_nearby_address_result (*ddsi_is_nearby_address_fn_t) (ddsi_tran_factory_t tran, const nn_locator_t *loc, const nn_locator_t *ownloc, size_t ninterf, const struct nn_interface *interf);
 | 
			
		||||
 | 
			
		||||
enum ddsi_locator_from_string_result {
 | 
			
		||||
  AFSR_OK,      /* conversion succeeded */
 | 
			
		||||
| 
						 | 
				
			
			@ -89,10 +90,10 @@ typedef enum ddsi_locator_from_string_result (*ddsi_locator_from_string_fn_t) (d
 | 
			
		|||
 | 
			
		||||
typedef char * (*ddsi_locator_to_string_fn_t) (ddsi_tran_factory_t tran, char *dst, size_t sizeof_dst, const nn_locator_t *loc, int with_port);
 | 
			
		||||
 | 
			
		||||
typedef int (*ddsi_enumerate_interfaces_fn_t) (ddsi_tran_factory_t tran, ddsrt_ifaddrs_t **interfs);
 | 
			
		||||
typedef int (*ddsi_enumerate_interfaces_fn_t) (ddsi_tran_factory_t tran, enum transport_selector transport_selector, ddsrt_ifaddrs_t **interfs);
 | 
			
		||||
 | 
			
		||||
/* Data types */
 | 
			
		||||
 | 
			
		||||
struct q_globals;
 | 
			
		||||
struct ddsi_tran_base
 | 
			
		||||
{
 | 
			
		||||
  /* Data */
 | 
			
		||||
| 
						 | 
				
			
			@ -100,10 +101,10 @@ struct ddsi_tran_base
 | 
			
		|||
  uint32_t m_port;
 | 
			
		||||
  uint32_t m_trantype;
 | 
			
		||||
  bool m_multicast;
 | 
			
		||||
  struct q_globals *gv;
 | 
			
		||||
 | 
			
		||||
  /* Functions */
 | 
			
		||||
 | 
			
		||||
  ddsi_tran_locator_fn_t m_locator_fn;
 | 
			
		||||
  ddsi_tran_handle_fn_t m_handle_fn;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -117,6 +118,7 @@ struct ddsi_tran_conn
 | 
			
		|||
  ddsi_tran_write_fn_t m_write_fn;
 | 
			
		||||
  ddsi_tran_peer_locator_fn_t m_peer_locator_fn;
 | 
			
		||||
  ddsi_tran_disable_multiplexing_fn_t m_disable_multiplexing_fn;
 | 
			
		||||
  ddsi_tran_locator_fn_t m_locator_fn;
 | 
			
		||||
 | 
			
		||||
  /* Data */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,6 +143,7 @@ struct ddsi_tran_listener
 | 
			
		|||
 | 
			
		||||
  ddsi_tran_listen_fn_t m_listen_fn;
 | 
			
		||||
  ddsi_tran_accept_fn_t m_accept_fn;
 | 
			
		||||
  ddsi_tran_locator_fn_t m_locator_fn;
 | 
			
		||||
 | 
			
		||||
  /* Relationships */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -173,10 +176,11 @@ struct ddsi_tran_factory
 | 
			
		|||
  /* Data */
 | 
			
		||||
 | 
			
		||||
  int32_t m_kind;
 | 
			
		||||
  const char * m_typename;
 | 
			
		||||
  const char * m_default_spdp_address;
 | 
			
		||||
  const char *m_typename;
 | 
			
		||||
  const char *m_default_spdp_address;
 | 
			
		||||
  bool m_connless;
 | 
			
		||||
  bool m_stream;
 | 
			
		||||
  struct q_globals *gv;
 | 
			
		||||
 | 
			
		||||
  /* Relationships */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -191,21 +195,21 @@ struct ddsi_tran_qos
 | 
			
		|||
  int m_diffserv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void ddsi_tran_factories_fini (void);
 | 
			
		||||
void ddsi_factory_add (ddsi_tran_factory_t factory);
 | 
			
		||||
void ddsi_tran_factories_fini (struct q_globals *gv);
 | 
			
		||||
void ddsi_factory_add (struct q_globals *gv, ddsi_tran_factory_t factory);
 | 
			
		||||
void ddsi_factory_free (ddsi_tran_factory_t factory);
 | 
			
		||||
ddsi_tran_factory_t ddsi_factory_find (const char * type);
 | 
			
		||||
ddsi_tran_factory_t ddsi_factory_find_supported_kind (int32_t kind);
 | 
			
		||||
void ddsi_factory_conn_init (ddsi_tran_factory_t factory, ddsi_tran_conn_t conn);
 | 
			
		||||
ddsi_tran_factory_t ddsi_factory_find (const struct q_globals *gv, const char * type);
 | 
			
		||||
ddsi_tran_factory_t ddsi_factory_find_supported_kind (const struct q_globals *gv, int32_t kind);
 | 
			
		||||
void ddsi_factory_conn_init (const struct ddsi_tran_factory *factory, ddsi_tran_conn_t conn);
 | 
			
		||||
 | 
			
		||||
inline bool ddsi_factory_supports (ddsi_tran_factory_t factory, int32_t kind) {
 | 
			
		||||
  return factory->m_supports_fn (kind);
 | 
			
		||||
inline bool ddsi_factory_supports (const struct ddsi_tran_factory *factory, int32_t kind) {
 | 
			
		||||
  return factory->m_supports_fn (factory, kind);
 | 
			
		||||
}
 | 
			
		||||
inline ddsi_tran_conn_t ddsi_factory_create_conn (ddsi_tran_factory_t factory, uint32_t port, ddsi_tran_qos_t qos) {
 | 
			
		||||
  return factory->m_create_conn_fn (port, qos);
 | 
			
		||||
  return factory->m_create_conn_fn (factory, port, qos);
 | 
			
		||||
}
 | 
			
		||||
inline ddsi_tran_listener_t ddsi_factory_create_listener (ddsi_tran_factory_t factory, int port, ddsi_tran_qos_t qos) {
 | 
			
		||||
  return factory->m_create_listener_fn (port, qos);
 | 
			
		||||
  return factory->m_create_listener_fn (factory, port, qos);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ddsi_tran_free (ddsi_tran_base_t base);
 | 
			
		||||
| 
						 | 
				
			
			@ -214,10 +218,6 @@ ddsi_tran_qos_t ddsi_tran_create_qos (void);
 | 
			
		|||
inline ddsrt_socket_t ddsi_tran_handle (ddsi_tran_base_t base) {
 | 
			
		||||
  return base->m_handle_fn (base);
 | 
			
		||||
}
 | 
			
		||||
inline int ddsi_tran_locator (ddsi_tran_base_t base, nn_locator_t * loc) {
 | 
			
		||||
  return base->m_locator_fn (base, loc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline ddsrt_socket_t ddsi_conn_handle (ddsi_tran_conn_t conn) {
 | 
			
		||||
  return conn->m_base.m_handle_fn (&conn->m_base);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -228,7 +228,7 @@ inline uint32_t ddsi_conn_port (ddsi_tran_conn_t conn) {
 | 
			
		|||
  return conn->m_base.m_port;
 | 
			
		||||
}
 | 
			
		||||
inline int ddsi_conn_locator (ddsi_tran_conn_t conn, nn_locator_t * loc) {
 | 
			
		||||
  return conn->m_base.m_locator_fn (&conn->m_base, loc);
 | 
			
		||||
  return conn->m_locator_fn (conn->m_factory, &conn->m_base, loc);
 | 
			
		||||
}
 | 
			
		||||
inline ssize_t ddsi_conn_write (ddsi_tran_conn_t conn, const nn_locator_t *dst, size_t niov, const ddsrt_iovec_t *iov, uint32_t flags) {
 | 
			
		||||
  return conn->m_closed ? -1 : (conn->m_write_fn) (conn, dst, niov, iov, flags);
 | 
			
		||||
| 
						 | 
				
			
			@ -244,11 +244,11 @@ int ddsi_conn_join_mc (ddsi_tran_conn_t conn, const nn_locator_t *srcip, const n
 | 
			
		|||
int ddsi_conn_leave_mc (ddsi_tran_conn_t conn, const nn_locator_t *srcip, const nn_locator_t *mcip, const struct nn_interface *interf);
 | 
			
		||||
void ddsi_conn_transfer_group_membership (ddsi_tran_conn_t conn, ddsi_tran_conn_t newconn);
 | 
			
		||||
int ddsi_conn_rejoin_transferred_mcgroups (ddsi_tran_conn_t conn);
 | 
			
		||||
int ddsi_is_mcaddr (const nn_locator_t *loc);
 | 
			
		||||
int ddsi_is_ssm_mcaddr (const nn_locator_t *loc);
 | 
			
		||||
enum ddsi_nearby_address_result ddsi_is_nearby_address (const nn_locator_t *loc, size_t ninterf, const struct nn_interface *interf);
 | 
			
		||||
int ddsi_is_mcaddr (const struct q_globals *gv, const nn_locator_t *loc);
 | 
			
		||||
int ddsi_is_ssm_mcaddr (const struct q_globals *gv, const nn_locator_t *loc);
 | 
			
		||||
enum ddsi_nearby_address_result ddsi_is_nearby_address (const struct q_globals *gv, const nn_locator_t *loc, const nn_locator_t *ownloc, size_t ninterf, const struct nn_interface *interf);
 | 
			
		||||
 | 
			
		||||
enum ddsi_locator_from_string_result ddsi_locator_from_string (nn_locator_t *loc, const char *str);
 | 
			
		||||
enum ddsi_locator_from_string_result ddsi_locator_from_string (const struct q_globals *gv, nn_locator_t *loc, const char *str, ddsi_tran_factory_t default_factory);
 | 
			
		||||
 | 
			
		||||
/*  8 for transport/
 | 
			
		||||
    1 for [
 | 
			
		||||
| 
						 | 
				
			
			@ -261,13 +261,13 @@ enum ddsi_locator_from_string_result ddsi_locator_from_string (nn_locator_t *loc
 | 
			
		|||
*/
 | 
			
		||||
#define DDSI_LOCSTRLEN 70
 | 
			
		||||
 | 
			
		||||
char *ddsi_locator_to_string (char *dst, size_t sizeof_dst, const nn_locator_t *loc);
 | 
			
		||||
char *ddsi_locator_to_string_no_port (char *dst, size_t sizeof_dst, const nn_locator_t *loc);
 | 
			
		||||
char *ddsi_locator_to_string (const struct q_globals *gv, char *dst, size_t sizeof_dst, const nn_locator_t *loc);
 | 
			
		||||
char *ddsi_locator_to_string_no_port (const struct q_globals *gv, char *dst, size_t sizeof_dst, const nn_locator_t *loc);
 | 
			
		||||
 | 
			
		||||
int ddsi_enumerate_interfaces (ddsi_tran_factory_t factory, ddsrt_ifaddrs_t **interfs);
 | 
			
		||||
int ddsi_enumerate_interfaces (ddsi_tran_factory_t factory, enum transport_selector transport_selector, ddsrt_ifaddrs_t **interfs);
 | 
			
		||||
 | 
			
		||||
inline int ddsi_listener_locator (ddsi_tran_listener_t listener, nn_locator_t * loc) {
 | 
			
		||||
  return listener->m_base.m_locator_fn (&listener->m_base, loc);
 | 
			
		||||
inline int ddsi_listener_locator (ddsi_tran_listener_t listener, nn_locator_t *loc) {
 | 
			
		||||
  return listener->m_locator_fn (listener->m_factory, &listener->m_base, loc);
 | 
			
		||||
}
 | 
			
		||||
inline int ddsi_listener_listen (ddsi_tran_listener_t listener) {
 | 
			
		||||
  return listener->m_listen_fn (listener);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,15 @@
 | 
			
		|||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int ddsi_udp_init (void);
 | 
			
		||||
typedef struct nn_udpv4mcgen_address {
 | 
			
		||||
  /* base IPv4 MC address is ipv4, host bits are bits base .. base+count-1, this machine is bit idx */
 | 
			
		||||
  struct in_addr ipv4;
 | 
			
		||||
  uint8_t base;
 | 
			
		||||
  uint8_t count;
 | 
			
		||||
  uint8_t idx; /* must be last: then sorting will put them consecutively */
 | 
			
		||||
} nn_udpv4mcgen_address_t;
 | 
			
		||||
 | 
			
		||||
int ddsi_udp_init (struct q_globals *gv);
 | 
			
		||||
 | 
			
		||||
#if defined (__cplusplus)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,6 +60,9 @@ inline bool vendor_is_opensplice (nn_vendorid_t vendor) {
 | 
			
		|||
inline bool vendor_is_twinoaks (nn_vendorid_t vendor) {
 | 
			
		||||
  return vendor_equals (vendor, (nn_vendorid_t) {{ 0x01, NN_VENDORID_MINOR_TWINOAKS }});
 | 
			
		||||
}
 | 
			
		||||
inline bool vendor_is_eprosima (nn_vendorid_t vendor) {
 | 
			
		||||
  return vendor_equals (vendor, (nn_vendorid_t) {{ 0x01, NN_VENDORID_MINOR_EPROSIMA }});
 | 
			
		||||
}
 | 
			
		||||
inline bool vendor_is_cloud (nn_vendorid_t vendor) {
 | 
			
		||||
  return vendor_equals (vendor, (nn_vendorid_t) {{ 0x01, NN_VENDORID_MINOR_PRISMTECH_CLOUD }});
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue