Published FAQ List

Technical Questions


Question 1.1: Latency

I have seen documentation and graphs that boast 70 usec latencies using CoreDX DDS. However, my own latency tests show latencies between .5 and 10 msec. I understand networking hardware and other environmental factors will affect latency results, but I should be able to do better than 10 msec, right? How do I achieve better latency numbers?

Answer 1.1:

Latencies in the "microseconds" (50-200 usec) are certainly achievable with CoreDX DDS on all common platforms.

The first place to look for latency improvements is the Latency Budget QoS Policy. This important QoS policy, supported by CoreDX DDS, allows your application to balance low latency versus high throughput performance. The Latency Budget QoS Policy specifies the acceptable delay between when the publishing application writes data and when the data is made available to the reading application. Configuring a Latency Budget delay > 0 will reduce overhead and help CPU and throughput performance. However, it will increase latencies. When low latency is the most important criteria, the Latency Budget QoS policy should be configured with a delay of 0.0 seconds on the relevant DataReaders and DataWriters.

The CoreDX DDS distribution includes sample application code, including a latency test. This example latency test can be used as a benchmark in your environment, as well as a reference for writing your own latency tests.

Return to Table of Contents...


Question 1.2: Conditions and WaitSets

Can I build a single WaitSet with ReadConditions for all my subscriptions? For example, I would like to use a single event loop where my application can wait for the next message(s) then switch on received message type. Is this possible with WaitSets?

Answer 1.2:

Yes! You can add multiple Conditions from multiple DDS Entities to one WaitSet. This can be accomplished by making multiple calls to WaitSet::attach_condition(). Let's look at a C++ example, where our application has multiple DataReaders, and would like to be notified when any of them have data available (DATA_AVAILABLE_STATUS). Here is some example code that does this:

DataReader *dr1, *dr2, *dr3;
WaitSet ws;
StatusCondition *status_cond1, *status_cond2, *status_cond3;
ReturnCode_t retval;

// code removed to create the data readers and waitset

status_cond1 = dr1->get_statuscondition();
status_cond1->set_enabled_statuses( DATA_AVAILABLE_STATUS );

ws . attach_condition( *status_cond1 );
if ( retval != RETCODE_OK )
printf("Error attaching Condition1 to WaitSet\n");

status_cond2 = dr2->get_statuscondition();
status_cond2->set_enabled_statuses( DATA_AVAILABLE_STATUS );

ws . attach_condition( *status_cond2 );
if ( retval != RETCODE_OK )
printf("Error attaching Condition2 to WaitSet\n");

status_cond3 = dr3->get_statuscondition();
status_cond3->set_enabled_statuses( DATA_AVAILABLE_STATUS );

ws . attach_condition( *status_cond3 );
if ( retval != RETCODE_OK )
printf("Error attaching Condition3 to WaitSet\n");

// now we can wait() for a trigger on any of the attached conditions

Return to Table of Contents...


Question 1.3: Missing Samples

I am having difficulty receiving samples across multiple machines on the same subnet. Do you have any information on firewall settings and/or logging/debugging options to diagnose handshaking?

Answer 1.3:

Firewalls are commonly a problem (especially with default Linux and Windows configurations). For a quick test, you can try turning off the firewall all together - to see if that's the problem.

Another quick check is to add listeners for "publication_matched" (DataWriter), "subscription_matched" (DataReader), and "inconsistent_topic" (Topic). This will give you an indication if the problem is in the discovery or matching of entities.

Another useful tool is wireshark: if you can start a capture and then start your DDS applications, let it run for a few seconds and then save off the capture file to send to us, we can take a look at what is (and is not) making it onto the wire. This “quick look” is a free service provided to all evaluators of our CoreDX DDS products!

Return to Table of Contents...


Question 1.4: Unbounded Data Types

Can I have truly unbounded sequences and strings in my DDS data type? How does this work with CoreDX DDS?

Answer 1.4:

Yes! CoreDX DDS provides both bounded and unbounded strings and sequences for use in application defined data types.

With CoreDX DDS, unbounded strings and sequences are truly unbounded – the application can dynamically size and add to these data types, and memory will be allocated as necessary to hold the data. This means a sample containing a 10-byte string will use less memory than a sample with a 100-byte string. Not all DDS implementations offer these truly unbounded data types.

CoreDX DDS allows the application developer to choose between the flexibility of unbounded data types and the deterministic and real-time performance of fixed sized and bounded data types. When designing your data types, you are free to choose the data types best suited to each particular Topic and application.

Return to Table of Contents...


Question 1.5: INCONSISTENT_POLICY error

When I try to change the set the default QoS settings for a DataReader to set the Reliability QoS to a RELIABLE setting, I get the following error:

SUB : ERROR : DDS_Subscriber_create_datareader() failed setting qos: INCONSISTENT_POLICY

What is wrong?

Answer 1.5:

The (perhaps) obvious answer is the QoS policy you are attempting to set on the DataReader contains values that are inconsistent with each other. For example, setting a History.depth > ResourceLimits.max_samples_per_instance will result in an INCONSISTENT_POLICY error. The DataReader QoS policies that must be compatible are:

  • Deadline.period must be >= TimeBasedFilter.minimum_separation
  • ResourceLimits.max_samples must be >= max_samples_per_instance
  • ResourceLimits.max_samples_per_instance must be >= History.depth

Another common error is neglecting to completely initialize the QoS before using it in the create_datareader() call (or a set_qos() call). The easiest way to initialize a QoS structure is to get the default QoS from the parent Entity. For example, to initialize a DataReaderQoS structure, use:

DDS::DataReaderQos qos;
retval = sub->get_default_datareader_qos(&qos);

Once you have an initialized QoS structure, set (override from default) the desired QoS settings:

qos.reliability.kind = DDS::RELIABLE_RELIABILITY_QOS;

And then use the resulting QoS to create the DataReader:

retval = sub->create_datareader((TopicDescription*)Topic, &qos,
NULL, 0 );

Return to Table of Contents...


Question 1.6: Using keys in data types

I have found that I need to make every member of my data types a key, in order to not lose any data samples. If I remove the key definitions, my subscribing applications lose a lot of samples. Why does a key definition affect data delivery?

Answer 1.6:

Great question!

The use of keys in your application data types does (indirectly) affect data delivery – because of the way CoreDX DDS handles instances. Each unique key value will have its own instance. If there are no keys on a data type, it will have only 1 instance.

Data samples are collected and grouped within instances. For example, with a History.kind = KEEP_LAST and a HISTORY.Depth = 1, DDS will keep one sample for each instance in the system. If you have only 1 instance, only one sample will be kept in the DataWriter and DataReader caches (newer samples will push out the older samples, possibly before they read by the application). If you have multiple instances, multiple samples will be kept (one for each instance). If your entire data structure is a key, then every unique sample will be its own instance, and nothing will be dropped.

That being said, you do not need to have instances in order to avoid lost samples. You can instead use a QoS configuration:

Reliability.kind = RELIABLE
History.kind = KEEP_ALL
ResourceLimits.max_samples_per_instance = (whatever makes sense for your application, could be 1, 10, or any other number)

With this QoS configuration, no samples will ever be overwritten (because of KEEP_ALL) and you will be limited to a fixed number of samples for each instance (max_samples_per_instance). If samples accumulate at the DataReader up to the limits configured in its Resource Limits QoS policy, the DataReader will stop accepting new samples. With the same QoS on the DataWriter, the DataWriter will also start accumulating samples up to the limits configured in its Resource Limits QoS policy. Any new writes() performed by the application will either block the application or return an error (as configured in the Reliability QoS policy on the DataWriter).

Return to Table of Contents...


Question 1.7: OUT_OF_RESOURCES error

My DataWriter::write() calls occasionally return OUT_OF_RESOURCES – why?

Answer 1.7:

Here are all the possible reasons write() might return OUT_OF_RESOURCES:

  1. In older versions of CoreDX DDS, the 'instance_data' passed to write() is NULL (this has since been changed to return BAD_PARAMETER)
  2. malloc returns NULL during the processing of write() - (system quota reached?)
  3. The 'handle' passed to write() is HANDLE_NIL (0) and register_instance() fails due to resource_limits.max_instances
  4. Sample is not added to cache due to resource_limits.max_samples or max_samples_per_instance
  5. If your version of CoreDX DDS does not support DATAFRAG, and the sample is too large to fit into the transmit buffer

When a data type includes a string or sequence, a common programming error is to not appropriately initialize the member, resulting in a very large sample to write. This includes re-using the same sample without first clearing the sequence, so that the sequence (and resulting sample) continuously grows.

Return to Table of Contents...


Question 1.8: Content Filters

I remember reading somewhere that CoreDX DDS can apply content filters at the writer or reader, is this true? How can I configure the content filters?

Answer 1.8:

You are correct – CoreDX DDS can apply content filters at the DataWriter or the DataReader, and in fact, the application can configure where filters are applied. This is done using a QoS policy on the DataWriter: CoreDX_RTPSWriterQoSPolicy.apply_filters. When this option has a value of ‘1’ or ‘true’ (which is the default), the DataWriter filters the data appropriately for all matched DataReaders. When this option has a value of ‘0’ or ‘false’, the filtering happens on the DataReader.

This configuration has an impact on how data is communicated between the DataWriter and DataReaders, and the best configuration is dependent on your communications architecture (the number of DataReaders matched to this DataWriter, and the amount of data that is filtered for each DataReader).

When content filters are applied at the DataWriter, and at least one matched DataReader has a content filter configured, the DataWriter will use UNICAST communications to all matched DataReaders, to ensure the appropriate data samples reach the appropriate DataReaders. This may or may not result in less network traffic than applying the content filters at the DataReaders.

Return to Table of Contents...


Question 1.9: Disable Threading

I would like to use CoreDX DDS in with my embedded operating system that does not support pthreads. How do I use the no-threads version of CoreDX DDS?

Answer 1.9:

Small and embedded environments are our passion and specialty, so it is great to hear that you will be using CoreDX DDS with your embedded environment!

Your application will use the same (standard) CoreDX DDS libraries, weather or not they are using threading. To thread or not to thread is configured in CoreDX DDS using a QoS policy on the DomainParticipant: CoreDX_ThreadModelQosPolicy. In this QoS policy, configure the “no_threads” option to ‘1’ or ‘true’.

We provide an example application using CoreDX DDS without threading (including setting the QoS policy and periodically handing over control to CoreDX DDS) included with your CoreDX DDS evaluation package: “hello_nothr”.

Return to Table of Contents...


Question 1.10: Possible Memory Leak

My subscribing CoreDX DDS application has a memory leak somewhere. I’ve trimmed it down to a simplified application using CoreDX DDS, so I’m wondering if it is possible the leak is in CoreDX DDS?

Answer 1.10:

Of course, anything is possible. However, we regularly and thoroughly test our CoreDX DDS products with an eye on memory, including very detailed profiling of every memory allocation and de-allocation. Let start at some common mistakes that can cause memory leaks in a subscribing CoreDX DDS application.

  1. Neglecting to call return_loan() after every successful read() and take() call.
  2. Neglecting to clear your data and sample_info sequences in between successive calls to read() or take().
  3. Allowing the samples to grow in your DataReader cache (for example, a History.kind = KEEP_ALL with infinite Resource Limits where the samples are not removed using take() or a configured Lifespan).
  4. Allowing the instances to grow in your DataReader cache (for example, an infinite ResourceLimits.max_instances where the DataWriter is not properly managing instance lifecycles).

If none of these are applicable in your application, please provide us with some sample code and/or the output from a memory profiling tool (for example, valgrind) and we will provide additional assistance.

Return to Table of Contents...


Support Questions


Question 2.1: Evaluation Support

What kind of support can I receive during my evaluation?

Answer 2.1:

We really do understand (and respect!) that your time is valuable. This is the foundation for all our technical support, whether you are on a paid support contract or using one of our free evaluations. You will find our support staff is extremely responsive to any questions or issues that come up during your evaluation of CoreDX DDS. You can email, call, or post to our online forum, all evaluators receive a courteous, helpful response within a few hours, if not immediately.

Return to Table of Contents...


Question 2.2: Obtaining an Evaluation

I see that CoreDX DDS supports a wide variety of hardware platforms and operating systems – is it possible to evaluate CoreDX DDS on my (specific) platform?

Answer 2.2:

In most cases – Yes! You probably noticed our standard evaluation platforms are available for download from our website. We love to see our software tried on all kinds of environments, and since our software is so easy for us to port, we tend to provide evaluations on most combinations of hardware platforms, operating systems, and compilers. All we need to get started are the appropriate build tools and we can custom build an evaluation for you, even if your particular platform is not in our formal list of supported platforms. If we can build it, we will provide an evaluation for you!

Return to Table of Contents...


Question 2.3: Maintenance

What comes with the standard ‘Annual Maintenance’ offered with CoreDX DDS licenses?

Answer 2.3:

First and foremost, you have access to our outstanding customer and technical support. From license move requests to a problem you are experiencing or a detailed technical question, you will receive prompt, courteous, and, useful support, no matter which of us picks up your support request. In short, we respect your time and your expertise in your field, and we try to show this respect in every email, forum post response, phone call, and in person visit we might have with you.

Annual Maintenance also comes with product updates: you have access to any and all updates we might make to your licensed products. This includes all patches, updates, and new features that are added during your Maintenance period.

So, while Annual Maintenance is never required with a CoreDX DDS license purchase, I think you will be pleasantly surprised by the resulting service if you choose to include it.

Return to Table of Contents...


Question 2.4: Bundling

Other vendors offer special initial package deals for their DDS products, including maintenance, training, support, and licenses; can I get a similar package with CoreDX DDS?

Answer 2.4:

Yes! We typically provide you our individual license and service options (many of our clients like to select just the products and services they need), but bundling is always an option.

The difference between Twin Oaks Computing and some of the other industry vendors is that we want to sell you only those options that you want to purchase - we do not assume any particular package is going to work for all our clients. If, for example, you would like to purchase development licenses, training, and an architecture study, we will be happy to bundle this together for you!

Feel free to talk with your Twin Oaks Computing representative about the licenses and options you want now, may want later, and are plain not interested in. You can be confident that we will listen to your requests and put together a proposal that meets your needs without any extra costs.

Return to Table of Contents...


Licensing Questions


Question 3.1: Evaluation License

I just received an evaluation license key for my Windows CoreDX DDS evaluation – will that same key work with a Linux evaluation too? How many machines can I use it for?

Answer 3.1:

We really do want to make your evaluation as easy as possible, so the short answers are: “yes” and “unlimited”.

Your CoreDX DDS evaluation key will work with any CoreDX DDS evaluation build. This includes CoreDX DDS evaluations you have downloaded from our Downloads web page – or any special evaluation builds you have received from us. You can use your evaluation license keys for as many machines as necessary to complete you evaluation – provided it is indeed being used for evaluation purposes.

Return to Table of Contents...


Question 3.2: Evaluation Length

With my schedule, and the fires that frequently come up on my program, I don’t have much consecutive time to spend on evaluating new technologies. Can I use a CoreDX DDS evaluation license for more than 30 days?

Answer 3.2:

Yes! We all understand that it is difficult to carve out time to research new products and/or technologies, especially when we are also required to meet (frequently fluid) program milestones. When we issue an evaluation license key, it will be for 30 days. However, you can continue to request new keys from us as necessary to complete your evaluation – just call or send us an email (licenses@twinoakscomputing.com)! Requests for extension license keys are handled quickly, generally within an hour or so.

Return to Table of Contents...


Question 3.3: IR&D Eligibility

I am working on a brand new project for my company, how can I tell if we are eligible for your IR&D program?

Answer 3.3:

This determination is made on a case-by-case basis, based primarily on your project goals and funding.

In general, projects that are strictly internally funded (or funded with US Government SBIR contracts) and that are purely for research, demonstration, and/or experimental purposes are eligible for our IR&D program. Projects that generally do not qualify for our IR&D program include projects that are funded by external sources or are working on a specific commercial product that will be sold to end users.

To receive a determination for your project, give us a call or send us an email with a short description of your project. We will be happy to discuss your CoreDX DDS licensing options with you!

Return to Table of Contents...


Question 3.4: University License

How can I get a CoreDX DDS license for my University Project?

Answer 3.4:

It is easy! We just need a few things from you to get started:

  1. A short description of your project, including how you expect to use CoreDX DDS and the expected duration of your project. This will be used to approve your University status, and (with your permission) for publication about the partnership between your University project and Twin Oaks Computing.
  2. A signed End User License Agreement – we will provide you a copy for your review and signature.
  3. A listing of the software developers and computers that will be using our CoreDX DDS product(s) so we can generate your University license keys – we will provide you with a simple form to complete with this information.

And that’s all! We can get you up and running with CoreDX DDS in your university project in as little as a few hours.

Keep in mind that University Licenses from Twin Oaks Computing can be used for more than just research projects. They can be used in the classroom for teaching assignments. You can use CoreDX DDS licenses on computers in your school lab for general education use. And, Twin Oaks Computing frequently visits Universities to give lectures and seminars on communication middleware topics. Just let us know if your are interested in any of these benefits for your school.

Return to Table of Contents...


Questions about Twin Oaks Computing


Question 4.1: Who we are

What is Twin Oaks Computing, and what do you do?

Answer 4.1:

Twin Oaks Computing, Inc. is a company dedicated to developing and delivering quality software solutions. We leverage this world-class technical experience to provide innovative and useful communication software systems. We build the software that collects, manages, and distributes information in a wide range of industries. Our software is in use around the world (and in space) supporting critical missions.

Return to Table of Contents...


Question 4.2: Problems we Solve

What problem does Twin Oaks Computing Solve?

Answer 4.2:

We save software developers time and money, while lowering development costs by streamlining their applications messaging needs. A wide variety of programming languages, operating systems, and hardware architectures are being used in today’s software development efforts. For example: C++, Java, Windows, Android, Linux, QNX, ARM, mips, and x86 just to name a few. These languages and operating systems communicate data differently, just as different hardware types (computers, cell phones, printers, etc.) store and retrieve information in a variety of ways. This translates into an expensive problem when your project needs to exchange information between two diverse systems, costing you and your business precious time, money, and resources. The solution to this problem is CoreDX DDS.

Return to Table of Contents...


Question 4.3: Competitive advantage

What is your competitive advantage?

Answer 4.3:

CoreDX DDS is the leading small footprint implementation of Data Distribution
Standard (DDS): With a small footprint and full Quality of Service coverage, CoreDX DDS is designed specifically to meet the performance and complexity requirements of real-time, embedded, time-critical, and mission-critical applications, while still being small in size and conservative in memory usage. With a small source code baseline, CoreDX DDS is well designed and compact with a low line of code count and small run time requirements; perfect for embedded systems.

Return to Table of Contents...


Question 4.4: Why software

Why do you specialize in software?

Answer 4.4:

At Twin Oaks Computing, we have a passion for software that works well. Our mission is to provide industry leading software tools, middleware, responsiveness and services to software engineers and architects around the world. We enable our clients to build cost effective, easy to use, robust solutions to the interconnected, multi-platform challenges of tomorrow - both here on Earth and beyond. In short, we are passionate about efficiency and finding effective solutions, and we love software!

Return to Table of Contents...


Question 4.5: Customer Service

You have excellent customer service, how are you able to respond so quickly to questions?

Answer 4.5:

At Twin Oaks Computing we often get compliments on our quick response time. We are committed to being open, available, and responsive to our clients, and make it a priority to address concerns within one business day. We respect that our customer's time is valuable and strive to provide the quickest responses in the industry. Whether you are evaluating our software, exploring an R&D project, or dealing with critical commercial deadlines, we will always provide prompt and responsive support.

Return to Table of Contents...


Question 4.6: Type of Company

What type of a company is Twin Oaks Computing?

Answer 4.6:

At Twin Oaks Computing we are committed to respecting others, and acting in an ethical, honest matter. We employ the highest ethical standards, demonstrating honesty and fairness in every action that we take. Twin Oaks Computing is committed to creating useful, dependable products that work in real world applications. We use our resources and skills to help our customers do more with less.

Return to Table of Contents...


Question 4.7: When founded

When was Twin Oaks Computing founded?

Answer 4.7:

Twin Oaks Computing was founded in 2005, and we delivered the first version of CoreDX DDS in 2008. Our current version of CoreDX DDS is v4.5.0

Return to Table of Contents...


Question 4.8: Location

Where are you located?

Answer 4.8:

Headquarters for Twin Oaks Computing are located just east of the Rocky Mountains in Castle Rock Colorado, USA. Our mailing address is:

230 Third Street, Suite 230, Castle Rock, CO. 80104

Return to Table of Contents...


Question 4.9: Products

Do you offer other products besides DDS?

Answer 4.9:

Embedded communications software is our primary focus. CoreDX DDS is our flagship product - Super-small and blazingly fast, CoreDX DDS is the leading Publish-Subscribe middleware available for small-footprint and embedded systems. We also offer tools to support development and analysis tasks, and to aid in DDS deployments, including:

CoreDX DDS Spy is a graphical DDS tool that discovers and monitors all DDS entities on a network, providing at-a-glance insight into common DDS configuration errors.

CoreDX DDS Multiplexor provides system developers with maximum control over DDS publications and subscriptions, including robust facilities to aggregate, transform, and bridge DDS data.

The CoreDX DDS Multiplexor can be used to solve complex integration challenges.

  • Bridge DDS data over multiple network segments or DDS Domains
  • Aggregate multiple data sources in to one
  • Transform published data types or QoS

CoreDX DDS Centralized Discovery performs the work of discovering all DDS Entities and appropriately communicating those entities to participants based on ‘need to know’. The Centralized Discovery mechanism can scale to very large DDS domains, without the explosion of memory allocation found in Standard Discovery, and still maintain interoperability with any standards-compliant DDS product.

Return to Table of Contents...


Question 4.10: OMG (Object Management Group)

Are you a member of the OMG?

Answer 4.10:

Yes we are. The OMG (Object Management Group) is an international consortium, originally aimed at setting standards for distributed object-oriented systems, and is now focused on modeling (programs, systems and business processes) and model-based standards. Twin Oaks Computing is committed to creating value for our customers by crafting standard compliant solutions that address and solve their unique needs.

Return to Table of Contents...


Question 4.11: International

Is Twin Oaks Computing an international company?

Answer 4.11:

Twin Oaks Computing has software deployments in countries all over the world. We have international support with strategically located representatives ready to assist you with your questions. For country specific information, e-mail contact@twinoakscomputing.com and we will put you in touch with a local distributor.

Return to Table of Contents...


Question 4.12: logo usage

May I use the Twin Oaks Computing logo?

Answer 4.12:

The Twin Oaks Computing logo is a registered trademark. With our express, written permission, you may use the logos on a website or on your work; however you may not alter the logos in any respect -- such as by changing the font, the proportions or the colors. For permission, e-mail us at contact@twinoakscomputing.com

Return to Table of Contents...


Question 4.13: Employment

I Love Twin Oaks Computing. How can I work for you?

Answer 4.13:

We are always excited to meet the next potential member of our Twin Oaks Computing team! Send your resume to: contact@twinoakscomputing.com.

Return to Table of Contents...