OnixS C++ B3 Binary UMDF Market Data Handler  1.7.0
API documentation
Solarflare ef_vi API

The ef_vi API is a layer 2 API that grants an application direct access to the Solarflare network adapter datapath to deliver lower latency and reduced per message processing overheads. ef_vi is the internal API used by Onload for sending and receiving packets. It can be used directly by applications that want the very lowest latency send and receive API and that do not require a POSIX socket interface.

Multithreading

By default, the handler uses a single dedicated thread for its operation. However, if multiple handlers are needed, the number of threads will equal the number of handlers, which may degrade performance. To address this, OnixS::B3::MarketData::UMDF::FeedEngineThreadPool is provided.

EfViFeedEngine feedEngine;
FeedEngineThreadPoolSettings feedEngineThreadPoolSettings;
feedEngineThreadPoolSettings.threadCount(THREAD_COUNT);
FeedEngineThreadPool pool(feedEngineThreadPoolSettings, &feedEngine);
handlerSettings1.feedEngine = &feedEngine;
handlerSettings2.feedEngine = &feedEngine;
auto handler1 = make_shared<Handler>(handlerSettings1);
auto handler2 = make_shared<Handler>(handlerSettings1);
handler1->start();
handler2->start();
// processing listener's events
handler1->stop(true);
handler2->stop(true);
See also

Single Thread

To minimize the number of threads, the same thread can be used for both creating the handler instance and processing market data.

SingleThreadedEfViFeedEngine feedEngine(feLoggerSettings, NETWORK_INTEFACE);
handlerSettings1.feedEngine = &feedEngine;
handlerSettings2.feedEngine = &feedEngine;
auto handler1 = make_shared<Handler>(handlerSettings1);
auto handler2 = make_shared<Handler>(handlerSettings1);
handler1->start();
handler2->start();
while (true)
{
// processing listener's events
process(feedEngine);
}
handler1->stop(true);
handler1->stop(true);
See also

Feed Engine for a Feed

If a different network interface is used for incremental packets, a separate instance of OnixS::B3::MarketData::UMDF::SingleThreadedEfViFeedEngine can be used for the corresponding feed.

SingleThreadedEfViFeedEngine feedEngine(feLoggerSettings, NETWORK_INTEFACE);
SingleThreadedEfViFeedEngine feedEngineForIncrementalA(feLoggerSettings, NETWORK_INTEFACE_FOR_INCREMENTAL_A);
handlerSettings.feedEngine = &feedEngine;
handlerSettings.incrementalFeeds.a.feedEngine = &feedEngineForIncrementalA;
auto handler = make_shared<Handler>(handlerSettings);
handler->start();
while (true)
{
// processing listener's events
process(feedEngine, feedEngineForIncrementalA);
}
handler->stop(true);