OnixS C++ Cboe CFE Multicast PITCH Market Data Handler  1.10.3
API documentation
Setting Up Feed Engine

Feed Engine concept encapsulates network-related aspects to let the Handler focus on market data processing. It also provides advanced facilities on utilizing system resources used by the Handler to achieve the best performance and latency characteristics.

Previously, all Handler instances were isolated between each other, and thus system resources were allocated precisely for particular instance needs. That caused certain inefficiency in terms of resources utilization. For example, each Handler used from one to two threads to manage incoming market data processing. As a result, the number of threads used by multiple Handler instances were multiplied by the number of those instances and significantly exceeded an effective amount of resources needed to solve market data processing task.

To make things more efficient, a concept of Feed Engine was involved. Feed Engine machinery used by Handler to receive and process market data. A single instance of Feed Engine can be shared across multiple Handler instances.

Using Feed Engine

The Feed Engine concept is represented by OnixS::CboeCFE::MarketData::Pitch::FeedEngine class. Feed Engine events are reported through an instance of OnixS::CboeCFE::MarketData::Pitch::FeedEngineListener class, associated with the Feed Engine instance at a constructing stage.

The following code sample depicts primary aspects of using Feed Engine with two Handler instances:

// STEP 1: is to set configuration parameters.
FeedEngineSettings feedEngineSettings;
// STEP 2: is to construct a shared feed engine.
FeedEngine feedEngine(feedEngineSettings);
// STEP 3: is to bind feed engine to Handler instances.
Market data processing is done inside of the working threads managed by Feed Engine. Size of internal thread pool is defined by OnixS::CboeCFE::MarketData::Pitch::FeedEngineSettings::threadCount parameter.

Feed Engine Events

All Feed engine events are encapsulated into OnixS::CboeCFE::MarketData::Pitch::FeedEngineListener class interface. OnixS::CboeCFE::MarketData::Pitch::FeedEngine class accepts instance of listener upon construction.

The following table uncovers Feed Engine events:

Event> Description

It is invoked by Feed Engine's working thread before entering master processing loop.

Event callback is invoked in context of working thread allowing a subscriber to perform thread-specific turning like setting affinity or priority for the thread.


It is invoked by Feed Engine when a working thread is about to end.

Event callback is invoked in context of working thread allowing subscriber to perform thread-specific cleanup like deleting data stored in thread local storage.


It is invoked by Feed Engine when a working thread is idle.

At an active phase, Feed Engine working thread is running market data processing loop. A working thread may wait for incoming market data using appropriate I/O operation.

If there were no incoming data detected for a certain time interval (defined by OnixS::CboeCFE::MarketData::Pitch::FeedEngineSettings::dataWaitTime parameter), working thread raises given event with OnixS::CboeCFE::MarketData::Pitch::FeedEngineThreadIdleReasons::DataWaitTimeout as a reason of idle state.

It may happen that a thread misses entering waiting for incoming data because other threads are already doing that for all the active feeds and there are no other tasks like processing already received market data are available. In such case working threads spins for a certain time (defined by OnixS::CboeCFE::MarketData::Pitch::FeedEngineSettings::redundancySpinTime parameter value) while waiting for any pending tasks to be executed. If no pending tasks were found, a working thread enters idle state with OnixS::CboeCFE::MarketData::Pitch::FeedEngineThreadIdleReasons::Redundant reason.

Event callback also exposes parameter-variable whose value represents time interval working thread is suggested to spend sleeping to reduce races between working threads for executing pending tasks (data reception, data processing, etc.) and thus reduce load onto CPU. Value of parameter can be modified inside the callback body.

It's not recommended to change sleep time interval when working thread entered idle state after waiting for incoming data to avoid overflow of a buffer used for incoming data.
There's no predictability in firing given event by Feed Engine. Each working thread may wait for incoming data or receive incoming data or process data previously received by that or any other threads. Availability of active tasks to be executed by working threads depends on many factors including a number of Handler instances bound, system capacity, a number of allocated working threads, clock resolution and other factors.