Skip to content

Releases

v3.17.0-rc1

v3.17.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 13 Nov 20:24
  • [MDAPI-526][GRAAL] NetTest passes its -Xmx<size>, -Xms<size>,
    -Xmn<size> and -XX:<option> arguments to the Graal isolate, as java takes them (-Xmx512m -XX:+PrintGC), so
    that the heap and the GC log of the isolate can be set for a benchmark; an option that the isolate rejects, or
    another -X argument, exits with 2. At the end of the run the tool closes all endpoints and tears the isolate down,
    so -XX:+PrintGCSummary prints its summary.
  • [MDAPI-527][GRAAL] A new Java tool, NetTestApi, publishes generated Trade or TimeAndSale
    events through the DXPublisher of the dxFeed Java API with the command line of
    NetTest and prints the statistics line of the QD tool NetTest p, so that the event
    layer can be benchmarked in Java next to the C API and QD. It is a tool of QD's Tools and is deployed with every
    release as com.dxfeed:graal-native-sdk-nettest (the all-in-one jar has the classifier all); it is not part of the
    SDK archives. The NetTest README now says that a TimeAndSale consumer needs -c stream.

v3.16.0

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 12 Nov 19:13
  • [MDAPI-513][GRAAL] A logging listener (dxfg_v4_logging_set_listener()) at the level TRACE or ALL no
    longer breaks the calls that log at a Java level the SDK has no constant for: since 3.14.0 such a call (for example
    dxfg_v4_DXEndpoint_connect(), which logs at FINER) failed with NullPointerException. The listener now gets
    FINER as TRACE, CONFIG as DEBUG and any other level as the next lower SDK level, and a failed listener call drops
    its record instead of failing the code that logged (the first failure is reported to stderr).
  • [MDAPI-514][GRAAL] dxfg_v4_DXEndpoint_Builder_withProperties() and the deprecated
    dxfg_DXEndpoint_Builder_withProperties() close the properties file before they return, also on an error. Before,
    the file stayed open until the garbage collection: every call leaked a file handle, and on Windows the file could not
    be deleted, renamed or rewritten meanwhile.
  • [MDAPI-515][GRAAL] dxfg_v4_DXEndpoint_getInstanceWithRole() is deprecated in favour of
    dxfg_v4_DXEndpoint_createWithRole(), which does the same: despite its name it never returned the singleton of the
    Java DXEndpoint.getInstance(Role). It is removed in 4.0.0. dxfg_v4_message_connector.h now documents what a
    connector answers after a replace, a disconnect or the close of its endpoint, that a listener added to a closed
    endpoint is never called, and that a server socket connector of :7400 returns the address *:7400.
  • [MDAPI-520][GRAAL] A new tool, NetTest, publishes generated Trade or
    TimeAndSale events through dxfg_v4_DXPublisher_publishEvents() at a fixed rate and prints the statistics line of
    the QD tool NetTest p, so that publishing over the C API can be benchmarked like the QD API. It is built with the C
    samples and is not part of the SDK archive.
  • [MDAPI-522][GRAAL] Every archive has docs/graal-native-sdk-build-info.properties: the SDK version, the
    GraalVM that built the library, the optimization level, target machine and garbage collector that native-image
    resolved, and the options the build passed to it. The libraries and the headers do not change.
  • [MDAPI-522][GRAAL] The NuGet package DxFeed.Graal.Native no longer gives the warning MSB4011 (the targets
    imported twice) in .NET Framework projects.
  • [MDAPI-522][GRAAL] Two build variants, built with Oracle GraalVM at -O3, come with the regular archives:
    oracle (the Serial GC; Linux x64 and arm64, macOS arm64, Windows x64) and oracle-g1 (the G1 GC, one isolate per
    process; Linux x64 and arm64, macOS arm64). Their archives end with -oracle and -oracle-g1
    (graal-native-sdk-<version>-amd64-linux-oracle.zip), and the NuGet packages DxFeed.Graal.Native.Oracle and
    DxFeed.Graal.Native.Oracle.G1 replace DxFeed.Graal.Native. The C API and the library names are the same. The
    libraries contain the Oracle GraalVM runtime, distributed under the GraalVM Free Terms and Conditions. See
    Build variants.

For integrators

  • A call of dxfg_v4_DXEndpoint_getInstanceWithRole() now gives a deprecation warning, which fails a build that
    treats warnings as errors; call dxfg_v4_DXEndpoint_createWithRole() instead.

v3.16.0-rc1

v3.16.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 12 Nov 17:12
  • [MDAPI-513][GRAAL] A logging listener (dxfg_v4_logging_set_listener()) at the level TRACE or ALL no
    longer breaks the calls that log at a Java level the SDK has no constant for: since 3.14.0 such a call (for example
    dxfg_v4_DXEndpoint_connect(), which logs at FINER) failed with NullPointerException. The listener now gets
    FINER as TRACE, CONFIG as DEBUG and any other level as the next lower SDK level, and a failed listener call drops
    its record instead of failing the code that logged (the first failure is reported to stderr).
  • [MDAPI-514][GRAAL] dxfg_v4_DXEndpoint_Builder_withProperties() and the deprecated
    dxfg_DXEndpoint_Builder_withProperties() close the properties file before they return, also on an error. Before,
    the file stayed open until the garbage collection: every call leaked a file handle, and on Windows the file could not
    be deleted, renamed or rewritten meanwhile.
  • [MDAPI-515][GRAAL] dxfg_v4_DXEndpoint_getInstanceWithRole() is deprecated in favour of
    dxfg_v4_DXEndpoint_createWithRole(), which does the same: despite its name it never returned the singleton of the
    Java DXEndpoint.getInstance(Role). It is removed in 4.0.0. dxfg_v4_message_connector.h now documents what a
    connector answers after a replace, a disconnect or the close of its endpoint, that a listener added to a closed
    endpoint is never called, and that a server socket connector of :7400 returns the address *:7400.
  • [MDAPI-520][GRAAL] A new tool, NetTest, publishes generated Trade or
    TimeAndSale events through dxfg_v4_DXPublisher_publishEvents() at a fixed rate and prints the statistics line of
    the QD tool NetTest p, so that publishing over the C API can be benchmarked like the QD API. It is built with the C
    samples and is not part of the SDK archive.
  • [MDAPI-522][GRAAL] Every archive has docs/graal-native-sdk-build-info.properties: the SDK version, the
    GraalVM that built the library, the optimization level, target machine and garbage collector that native-image
    resolved, and the options the build passed to it. The libraries and the headers do not change.
  • [MDAPI-522][GRAAL] The NuGet package DxFeed.Graal.Native no longer gives the warning MSB4011 (the targets
    imported twice) in .NET Framework projects.
  • [MDAPI-522][GRAAL] Two build variants, built with Oracle GraalVM at -O3, come with the regular archives:
    oracle (the Serial GC; Linux x64 and arm64, macOS arm64, Windows x64) and oracle-g1 (the G1 GC, one isolate per
    process; Linux x64 and arm64, macOS arm64). Their archives end with -oracle and -oracle-g1
    (graal-native-sdk-<version>-amd64-linux-oracle.zip), and the NuGet packages DxFeed.Graal.Native.Oracle and
    DxFeed.Graal.Native.Oracle.G1 replace DxFeed.Graal.Native. The C API and the library names are the same. The
    libraries contain the Oracle GraalVM runtime, distributed under the GraalVM Free Terms and Conditions. See
    Build variants.

For integrators

  • A call of dxfg_v4_DXEndpoint_getInstanceWithRole() now gives a deprecation warning, which fails a build that
    treats warnings as errors; call dxfg_v4_DXEndpoint_createWithRole() instead.

v3.15.0

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 09 Nov 21:08
  • [MDAPI-509][GRAAL] The libraries are built with GraalVM 25.5 (graal-25.5.5.0.3, JDK 25.0.5.0.3). A library
    trusts the root CAs of the JDK that builds it unless the application sets javax.net.ssl.trustStore, so it no
    longer trusts the eMudhra and Comodo roots that JDK 25.0.5 removes (comodoaaaca, emsigneccrootcag3,
    emsignrootcag1, emsignrootcag2) and rejects the eMudhra TLS CAs G3B that it blocks (CVE-2026-91403,
    CVE-2026-114820). The macOS x64 and iOS Simulator x64 libraries are still built with GraalVM jdk-25.0.1, the last
    one for macOS x64, but with the trust store of GraalVM 25.5; the distrust rules that later JDKs implement in code
    (the Chunghwa ePKI Root CA) are not in them.

For integrators

  • A connection to a server whose certificate chains up to one of the removed roots now fails the TLS handshake. An
    application that sets javax.net.ssl.trustStore keeps its own trust store.

v3.15.0-rc1

v3.15.0-rc1 Pre-release
Pre-release

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 09 Nov 19:53
  • [MDAPI-509][GRAAL] The libraries are built with GraalVM 25.5 (graal-25.5.5.0.3, JDK 25.0.5.0.3). A library
    trusts the root CAs of the JDK that builds it unless the application sets javax.net.ssl.trustStore, so it no
    longer trusts the eMudhra and Comodo roots that JDK 25.0.5 removes (comodoaaaca, emsigneccrootcag3,
    emsignrootcag1, emsignrootcag2) and rejects the eMudhra TLS CAs G3B that it blocks (CVE-2026-91403,
    CVE-2026-114820). The macOS x64 and iOS Simulator x64 libraries are still built with GraalVM jdk-25.0.1, the last
    one for macOS x64, but with the trust store of GraalVM 25.5; the distrust rules that later JDKs implement in code
    (the Chunghwa ePKI Root CA) are not in them.

For integrators

  • A connection to a server whose certificate chains up to one of the removed roots now fails the TLS handshake. An
    application that sets javax.net.ssl.trustStore keeps its own trust store.

v3.14.0

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 08 Nov 18:28
  • [MDAPI-478][GRAAL] The message connectors of an endpoint (dxfg_v4_message_connector.h): what an endpoint
    is connected to and how much data flows, as com.devexperts.qd.qtp.MessageConnector reports it.
    dxfg_v4_DXEndpoint_getConnectors() returns the current connectors, one per address of the address string, released
    by dxfg_v4_message_connector_list_release(). A connector reports its name, kind (DXFG_V4_MESSAGE_CONNECTOR_KIND_*:
    a client or a server socket, or another), configured address with the credentials masked, the addresses it is
    connected to now, its state (DXFG_V4_MESSAGE_CONNECTOR_STATE_*: connecting, connected, disconnected), whether it is
    active, its open and closed connection counts, and its statistics (dxfg_v4_MessageConnector_getStatistics(): bytes
    and data records read and written, without resetting them; the data record counts stay 0 on iOS and the iOS Simulator,
    whose SDK has no QD monitoring). A connector listener (experimental: dxfg_v4_MessageConnectorListener_new(),
    dxfg_v4_DXEndpoint_addMessageConnectorListener(), dxfg_v4_DXEndpoint_removeMessageConnectorListener()) is called
    after the state changes, also of the connectors of a later connect, on one thread of the SDK;
    dxfg_v4_system_shutdown() stops that thread. DXFG_V4_FEATURE_MESSAGE_CONNECTORS reports the family.
  • [MDAPI-477][GRAAL] The last connection error of a message connector and of an endpoint, and log.level that
    really sets the level of logging.
    • The last connection error (experimental, dxfg_v4_message_connector.h): why a connect failed or a connection
      dropped. dxfg_v4_MessageConnector_getLastError() and dxfg_v4_DXEndpoint_getLastConnectionError() return a copy
      (dxfg_v4_connection_error_t, released by dxfg_v4_ConnectionError_release()) or NULL: the time, the configured
      address with the credentials masked, the category (DXFG_V4_CONNECTION_ERROR_*: DNS, connect failed (refused or
      timed out), read timeout, heartbeat timeout, closed by remote, TLS, I/O, other), whether an established connection
      dropped, the exception class name, a bounded message and the error count. The endpoint keeps its newest error
      after a connect to another address; a successful connection clears nothing. The error is recorded before the
      connector listener is called. The SDK captures the errors from QD's log records, without the logging listener and
      at any log.level; with another log.className nothing is captured, and a level the user sets on QD's connector
      loggers wins. DXFG_V4_FEATURE_CONNECTION_ERRORS reports the family.
    • log.level, err.level, dxfg_logging_set_log_level() and dxfg_logging_set_err_level() (and their v4
      functions) also set the level of the root logger of java.util.logging when log.className is
      com.devexperts.logging.InterceptableLogging: DEBUG and ALL now produce the messages below INFO, and the
      messages below the level are no longer created. The default log.level is INFO, which was already the effective
      default.
  • [MDAPI-479][GRAAL] Migrated to QDS 3.357
    (see the QD release notes). The close of a live
    instrument profile connection (dxfg_InstrumentProfileConnection_close(),
    dxfg_v4_InstrumentProfileConnection_close(), dxfg_v4_system_shutdown()) now ends its thread and its connection to
    the server at the next data from the server, a heartbeat at the latest (every 10 seconds), and nothing received after
    the close reaches the collector (QD-1802). Before, the thread stayed in the socket read while the server kept the
    stream open: the collector still got the updates and graal_tear_down_isolate() did not return. QDS 3.357 also fixes
    the exception in DXEndpoint.close() of an endpoint built with an executor (QD-1801) and an
    ArrayIndexOutOfBoundsException in the distribution of concurrent subscriptions that closed connections (QD-1804).
  • [MDAPI-501][GRAAL] On macOS x64 graal_create_isolate() now installs the no-op handlers of SIGPIPE and
    SIGXFSZ, as on Linux and macOS arm64 since 3.7.0: a write to a socket closed by the peer fails with an error
    instead of killing the process. The macOS x64 library is built with an older GraalVM, which installed them only in
    native executables. -XX:-EnableSignalHandling still turns them off, and a handler or SIG_IGN of the application is
    kept.
  • [MDAPI-503][GRAAL] The wrapper guide and the conformance kit, for the authors of wrappers in other languages.
    • The wrapper guide (docs/wrapper-guide/ in every archive, the "Wrapper guide" of the C API reference) states the
      contract between the SDK and a wrapper: threads and attachment (long-lived threads, releases from finalizers),
      ownership, return codes and outcomes, tiers and the start-up check, which delivery to use for what, and what the
      kit proves.
    • The conformance kit (kit/ in the archives with a dynamic library and CMakeLists.txt) checks a wrapper by
      running it: a runner (C++17 source) sends the requests of scenarios over a line protocol to an adapter written in
      the wrapper's language and checks the responses. The scenarios cover the fields of Quote, Profile, TimeAndSale,
      Order, Candle and Message, the ownership of polled lists, the outcomes of a poll, conflation, streams and drops,
      polls on other threads, the ready signal, shutdown and tear-down, and the skips of an advanced-revision mismatch.
      They publish to a DXFG_ENDPOINT_ROLE_LOCAL_HUB endpoint in the adapter's process, with no network. A reference
      adapter on the C API is included, and the SDK's CTest runs the kit with it on every platform.
    • The build checks that the guide and the kit name only functions, types, features and event fields that the API
      description has, none of them deprecated. No exported function is changed or added.

For integrators

  • Check DXFG_V4_FEATURE_MESSAGE_CONNECTORS with dxfg_v4_system_is_feature_supported() before binding the connector
    functions. Bind the experimental listener functions only when dxfg_v4_system_get_advanced_revision() equals
    DXFG_V4_ADVANCED_REVISION of the headers the wrapper is built with.
  • dxfg_v4_message_connector_list_release() releases the list with all its handles; clone a connector with
    dxfg_v4_JavaObjectHandler_clone() to keep it. The handles stay valid after the endpoint is closed. A connect to
    another address replaces the connectors, so read the list anew. The connector handle passed to a listener is valid
    during the call only.
  • For a status display, reading the connectors on a timer is enough. The listener is called on one thread of the SDK
    for the whole isolate, one call at a time; fast changes of a connector may come as one call, so the listener reads
    the current state. It should return quickly and may call any function of the SDK, dxfg_v4_DXEndpoint_connect()
    included. Remove a listener before releasing it.
  • Data arrives when read_data_records grows between two reads of the statistics; read_bytes grows on heartbeats
    too. The counters are never reset: compute the rates from the differences. dxfg_v4_message_connector_stats_t
    keeps its layout; new counters will come with a new function.
  • In the explicit shutdown of the application, call dxfg_v4_system_shutdown() first (it also stops the listener
    thread), then release the remaining handles.
  • The README section "Message connectors" has an example, and DxfgClient mc prints the connectors of an endpoint.
  • Check DXFG_V4_FEATURE_CONNECTION_ERRORS and the advanced revision before binding the connection error functions.
    Treat an unknown category as DXFG_V4_CONNECTION_ERROR_OTHER: new categories may come. Release every error with
    dxfg_v4_ConnectionError_release(). Read the error in the connector listener or after a state other than
    connected; its time tells how old it is.
  • An application that set log.level to DEBUG or ALL with InterceptableLogging now gets the debug messages it
    asked for; set INFO to keep the output as before.
  • On macOS x64 an application that relied on SIGPIPE keeping its default action (ending the process) now gets
    EPIPE from the write instead, as on the other platforms; a workaround that sets SIG_IGN itself can stay or go.
  • 4.0.0, the next major release, removes the deprecated functions of the C API (marked DXFG_DEPRECATED: the
    functions that have a dxfg_v4_ twin, dxfg_free_strings() and dxfg_free_string_to_double_map_entries()). To
    find the calls, build with the deprecation warnings on (do not define DXFG_DEPRECATED empty and do not disable
    the warning C4996 of MSVC), then move each call to the function that its warning names. A warning that ends in
    "(experimental)" names an experimental function (the twins of IndexedTxModel, TimeSeriesTxModel and the other
    experimental Java API): it may change in a minor release, so a wrapper checks
    dxfg_v4_system_get_advanced_revision() before binding it. The experimental functions themselves are not removed.
  • Wrapper authors: read the wrapper guide, then write an adapter for the conformance kit and run it in strict mode on
    every platform the wrapper supports (kit/README.md in the archive).

v3.14.0-rc2

v3.14.0-rc2 Pre-release
Pre-release

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 08 Nov 16:17
  • [MDAPI-478][GRAAL] The message connectors of an endpoint (dxfg_v4_message_connector.h): what an endpoint
    is connected to and how much data flows, as com.devexperts.qd.qtp.MessageConnector reports it.
    dxfg_v4_DXEndpoint_getConnectors() returns the current connectors, one per address of the address string, released
    by dxfg_v4_message_connector_list_release(). A connector reports its name, kind (DXFG_V4_MESSAGE_CONNECTOR_KIND_*:
    a client or a server socket, or another), configured address with the credentials masked, the addresses it is
    connected to now, its state (DXFG_V4_MESSAGE_CONNECTOR_STATE_*: connecting, connected, disconnected), whether it is
    active, its open and closed connection counts, and its statistics (dxfg_v4_MessageConnector_getStatistics(): bytes
    and data records read and written, without resetting them; the data record counts stay 0 on iOS and the iOS Simulator,
    whose SDK has no QD monitoring). A connector listener (experimental: dxfg_v4_MessageConnectorListener_new(),
    dxfg_v4_DXEndpoint_addMessageConnectorListener(), dxfg_v4_DXEndpoint_removeMessageConnectorListener()) is called
    after the state changes, also of the connectors of a later connect, on one thread of the SDK;
    dxfg_v4_system_shutdown() stops that thread. DXFG_V4_FEATURE_MESSAGE_CONNECTORS reports the family.
  • [MDAPI-477][GRAAL] The last connection error of a message connector and of an endpoint, and log.level that
    really sets the level of logging.
    • The last connection error (experimental, dxfg_v4_message_connector.h): why a connect failed or a connection
      dropped. dxfg_v4_MessageConnector_getLastError() and dxfg_v4_DXEndpoint_getLastConnectionError() return a copy
      (dxfg_v4_connection_error_t, released by dxfg_v4_ConnectionError_release()) or NULL: the time, the configured
      address with the credentials masked, the category (DXFG_V4_CONNECTION_ERROR_*: DNS, connect failed (refused or
      timed out), read timeout, heartbeat timeout, closed by remote, TLS, I/O, other), whether an established connection
      dropped, the exception class name, a bounded message and the error count. The endpoint keeps its newest error
      after a connect to another address; a successful connection clears nothing. The error is recorded before the
      connector listener is called. The SDK captures the errors from QD's log records, without the logging listener and
      at any log.level; with another log.className nothing is captured, and a level the user sets on QD's connector
      loggers wins. DXFG_V4_FEATURE_CONNECTION_ERRORS reports the family.
    • log.level, err.level, dxfg_logging_set_log_level() and dxfg_logging_set_err_level() (and their v4
      functions) also set the level of the root logger of java.util.logging when log.className is
      com.devexperts.logging.InterceptableLogging: DEBUG and ALL now produce the messages below INFO, and the
      messages below the level are no longer created. The default log.level is INFO, which was already the effective
      default.
  • [MDAPI-479][GRAAL] Migrated to QDS 3.357
    (see the QD release notes). The close of a live
    instrument profile connection (dxfg_InstrumentProfileConnection_close(),
    dxfg_v4_InstrumentProfileConnection_close(), dxfg_v4_system_shutdown()) now ends its thread and its connection to
    the server at the next data from the server, a heartbeat at the latest (every 10 seconds), and nothing received after
    the close reaches the collector (QD-1802). Before, the thread stayed in the socket read while the server kept the
    stream open: the collector still got the updates and graal_tear_down_isolate() did not return. QDS 3.357 also fixes
    the exception in DXEndpoint.close() of an endpoint built with an executor (QD-1801) and an
    ArrayIndexOutOfBoundsException in the distribution of concurrent subscriptions that closed connections (QD-1804).
  • [MDAPI-501][GRAAL] On macOS x64 graal_create_isolate() now installs the no-op handlers of SIGPIPE and
    SIGXFSZ, as on Linux and macOS arm64 since 3.7.0: a write to a socket closed by the peer fails with an error
    instead of killing the process. The macOS x64 library is built with an older GraalVM, which installed them only in
    native executables. -XX:-EnableSignalHandling still turns them off, and a handler or SIG_IGN of the application is
    kept.
  • [MDAPI-503][GRAAL] The wrapper guide and the conformance kit, for the authors of wrappers in other languages.
    • The wrapper guide (docs/wrapper-guide/ in every archive, the "Wrapper guide" of the C API reference) states the
      contract between the SDK and a wrapper: threads and attachment (long-lived threads, releases from finalizers),
      ownership, return codes and outcomes, tiers and the start-up check, which delivery to use for what, and what the
      kit proves.
    • The conformance kit (kit/ in the archives with a dynamic library and CMakeLists.txt) checks a wrapper by
      running it: a runner (C++17 source) sends the requests of scenarios over a line protocol to an adapter written in
      the wrapper's language and checks the responses. The scenarios cover the fields of Quote, Profile, TimeAndSale,
      Order, Candle and Message, the ownership of polled lists, the outcomes of a poll, conflation, streams and drops,
      polls on other threads, the ready signal, shutdown and tear-down, and the skips of an advanced-revision mismatch.
      They publish to a DXFG_ENDPOINT_ROLE_LOCAL_HUB endpoint in the adapter's process, with no network. A reference
      adapter on the C API is included, and the SDK's CTest runs the kit with it on every platform.
    • The build checks that the guide and the kit name only functions, types, features and event fields that the API
      description has, none of them deprecated. No exported function is changed or added.

For integrators

  • Check DXFG_V4_FEATURE_MESSAGE_CONNECTORS with dxfg_v4_system_is_feature_supported() before binding the connector
    functions. Bind the experimental listener functions only when dxfg_v4_system_get_advanced_revision() equals
    DXFG_V4_ADVANCED_REVISION of the headers the wrapper is built with.
  • dxfg_v4_message_connector_list_release() releases the list with all its handles; clone a connector with
    dxfg_v4_JavaObjectHandler_clone() to keep it. The handles stay valid after the endpoint is closed. A connect to
    another address replaces the connectors, so read the list anew. The connector handle passed to a listener is valid
    during the call only.
  • For a status display, reading the connectors on a timer is enough. The listener is called on one thread of the SDK
    for the whole isolate, one call at a time; fast changes of a connector may come as one call, so the listener reads
    the current state. It should return quickly and may call any function of the SDK, dxfg_v4_DXEndpoint_connect()
    included. Remove a listener before releasing it.
  • Data arrives when read_data_records grows between two reads of the statistics; read_bytes grows on heartbeats
    too. The counters are never reset: compute the rates from the differences. dxfg_v4_message_connector_stats_t
    keeps its layout; new counters will come with a new function.
  • In the explicit shutdown of the application, call dxfg_v4_system_shutdown() first (it also stops the listener
    thread), then release the remaining handles.
  • The README section "Message connectors" has an example, and DxfgClient mc prints the connectors of an endpoint.
  • Check DXFG_V4_FEATURE_CONNECTION_ERRORS and the advanced revision before binding the connection error functions.
    Treat an unknown category as DXFG_V4_CONNECTION_ERROR_OTHER: new categories may come. Release every error with
    dxfg_v4_ConnectionError_release(). Read the error in the connector listener or after a state other than
    connected; its time tells how old it is.
  • An application that set log.level to DEBUG or ALL with InterceptableLogging now gets the debug messages it
    asked for; set INFO to keep the output as before.
  • On macOS x64 an application that relied on SIGPIPE keeping its default action (ending the process) now gets
    EPIPE from the write instead, as on the other platforms; a workaround that sets SIG_IGN itself can stay or go.
  • 4.0.0, the next major release, removes the deprecated functions of the C API (marked DXFG_DEPRECATED: the
    functions that have a dxfg_v4_ twin, dxfg_free_strings() and dxfg_free_string_to_double_map_entries()). To
    find the calls, build with the deprecation warnings on (do not define DXFG_DEPRECATED empty and do not disable
    the warning C4996 of MSVC), then move each call to the function that its warning names. A warning that ends in
    "(experimental)" names an experimental function (the twins of IndexedTxModel, TimeSeriesTxModel and the other
    experimental Java API): it may change in a minor release, so a wrapper checks
    dxfg_v4_system_get_advanced_revision() before binding it. The experimental functions themselves are not removed.
  • Wrapper authors: read the wrapper guide, then write an adapter for the conformance kit and run it in strict mode on
    every platform the wrapper supports (kit/README.md in the archive).

v3.13.0

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 02 Nov 22:56
  • [MDAPI-466][GRAAL] The event queue (dxfg_v4_event_queue.h): the events of a subscription received on the
    application's own thread, without callbacks. dxfg_v4_EventQueue_new() creates a queue on a subscription (on one
    attached to a feed, before its symbols are added, as for a listener); dxfg_v4_EventQueue_poll() waits up to a
    timeout and returns the events as a dxfg_v4_event_type_list, or the positive codes DXFG_EVENT_QUEUE_NO_EVENTS
    and DXFG_EVENT_QUEUE_CLOSED;
    dxfg_v4_EventQueue_wakeUp(), dxfg_v4_EventQueue_close() and dxfg_v4_EventQueue_getDroppedEvents() complete it.
    The SDK retrieves the events only when the queue is polled, on the polling thread, so the lasting events are
    conflated and the buffers of the SDK bound the memory; the lost events are counted. dxfg_v4_system_shutdown() and
    dxfg_v4_NativeListener_deactivateAll() close the queues, so the polling threads can leave the SDK before
    graal_tear_down_isolate(). The executor of a subscription with an event queue cannot be changed:
    dxfg_v4_DXFeedSubscription_setExecutor(), dxfg_v4_SubscriptionController_setExecutor() and their older functions
    fail with IllegalStateException. dxfg_v4_DXFeed_detachSubscriptionAndClear() does not wait for a poll of the
    queue of the subscription.

  • [MDAPI-468][GRAAL] The shared event queue: one thread polls many subscriptions and runs the models.
    dxfg_v4_EventQueue_create() creates a queue without a subscription, dxfg_v4_EventQueue_attach() attaches a
    subscription with an int64_t tag, and dxfg_v4_EventQueue_pollTagged() returns a dxfg_v4_tagged_event_list (the
    events and a parallel array of their tags, released by dxfg_v4_tagged_event_list_release()); a subscription close
    detaches only that subscription. dxfg_v4_EventQueue_getExecutor() returns the queue's executor for the models, the
    instrument profile collector, the subscription and controller setters, the endpoint builder and the promise handlers:
    their listeners run inside the polls on the polling thread, and a poll that ran only their work returns
    DXFG_EVENT_QUEUE_NO_EVENTS at once. A closed queue calls no listener of the application, also from the work it
    still runs for the SDK. A queue made by dxfg_v4_EventQueue_new() stays bound to its subscription and rejects
    attach and getExecutor. The executor of an attached subscription is refused by every function that accepts an
    executor (IllegalStateException); dxfg_v4_ExecutorBaseOnConcurrentLinkedQueue_processAllPendingTasks() fails with
    IllegalArgumentException for an executor it did not create, instead of a ClassCastException.

  • [MDAPI-482][GRAAL] Stable and experimental functions. A stable function changes only by deprecation and is
    removed only in a major release; an experimental one may change or be removed in a minor release, and an incompatible
    change gives it a new name. The experimental functions are marked DXFG_EXPERIMENTAL (dxfg_common.h, empty unless
    the application defines it first, e.g. as a deprecation attribute) and listed on the "Experimental declarations" page
    of the C API reference: the twins of the experimental Java API (dxfg_v4_indexed_event_tx_model.h,
    dxfg_v4_subscription_controller.h, dxfg_v4_DXFeedSubscription_getSubscriptionController(),
    dxfg_v4_DXFeedSubscription_getTotalDroppedEvents(), the IndexedTxModel, TimeSeriesTxModel and TxModelListener
    functions of dxfg_v4_event_model.h). These 73 functions came out in 3.12.0 with no tier and are experimental from
    now on; their older twins stay until 4.0.0 as the other deprecated functions do, and their deprecation messages say
    that the replacement is experimental. Later advanced headers with experimental functions only are not included by
    dxfg_v4_api.h; the header check of the build enforces the boundary. The Nuam and OrderImbalance event types are
    experimental in their descriptions. dxfg_v4_system_get_version(), dxfg_v4_system_get_advanced_revision()
    (DXFG_V4_ADVANCED_REVISION, now 1) and dxfg_v4_system_is_feature_supported() (DXFG_V4_FEATURE_EVENT_QUEUE,
    DXFG_V4_FEATURE_SHARED_EVENT_QUEUE) let a wrapper check the library before it binds the other functions.

  • [MDAPI-483][GRAAL] The description of the C API for wrapper generators: every archive has dxfg-api.json next
    to the library, generated from the headers and the same on every platform. It lists the version, the advanced
    revision, the features, the headers with their tiers and the functions, types and macros with their tiers and the
    versions that added them; a function has its return type, its parameters with DXFG_OUT, the functions that
    release its results and its DXFG_DEPRECATED replacements. The build checks the headers against the committed
    description of 3.12.0: a stable declaration is not changed or removed, an experimental one changes only with a higher
    DXFG_V4_ADVANCED_REVISION, and a new declaration needs @since. See "API description" in the README.

  • [MDAPI-484][GRAAL] The library no longer prints the JDK warning about sun.misc.Unsafe ("A terminally
    deprecated method in sun.misc.Unsafe has been called", from com.devexperts.util.AtomicArraysUnsafe of QD) to
    stderr of the application: the image is built with --sun-misc-unsafe-memory-access=allow.

  • [MDAPI-485][GRAAL] The ready signal of an event queue: an event loop polls without a reader thread.
    dxfg_v4_EventQueue_setReadySignal() (experimental, dxfg_v4_event_queue.h) gives a queue an OS object of the host,
    which the SDK makes ready whenever the queue has work (the events of a subscription, the work of a model or the
    collector, a wake-up, the close): a non-blocking file descriptor on Linux, macOS and iOS
    (DXFG_V4_READY_SIGNAL_FD, an eventfd or the write end of a pipe; a blocking or read-only descriptor is refused
    with IllegalArgumentException), an event on Windows (DXFG_V4_READY_SIGNAL_WINDOWS_EVENT). The loop waits for the
    object, resets it and polls with the timeout 0; no work is left without a signal, and a signal without work gives
    DXFG_EVENT_QUEUE_NO_EVENTS. The host creates, owns and closes the object, after the queue is closed; the SDK never
    closes it and does not write to it after the signal is removed or the queue is closed.
    DXFG_V4_FEATURE_EVENT_QUEUE_READY_SIGNAL reports the function; DXFG_V4_ADVANCED_REVISION stays 1. A loop that
    cannot wait for a foreign object (the asyncio proactor loop and libuv on Windows) keeps a reader thread.

  • [MDAPI-488][GRAAL] A promise created, completed and failed from C (dxfg_v4_feed.h):
    dxfg_v4_Promise_new() creates a promise, dxfg_v4_Promise_complete() completes it with a Java object handle (or
    NULL) and dxfg_v4_Promise_getResult() reads the result of a promise of any kind as a handle.
    dxfg_v4_Promise_completeExceptionallyWithClassNameAndMessage() fails a promise and
    dxfg_v4_Promise_failedWithClassNameAndMessage() creates a failed one, with an exception of the named class and the
    message. The class comes from a fixed set (RuntimeException, IllegalArgumentException, IllegalStateException,
    UnsupportedOperationException, java.io.IOException, CancellationException, TimeoutException, by their fully
    qualified names); any other name gives a RuntimeException whose message starts with the name. As in Java, the first
    result wins: a later completion does nothing and returns success. dxfg_Promise_failed(),
    dxfg_v4_Promise_failed() and the completeExceptionally functions that take a dxfg_exception_t keep their
    behaviour; their descriptions point to the new functions.

  • [MDAPI-491][GRAAL] The instrument profile writer (dxfg_v4_ipf.h):
    dxfg_v4_InstrumentProfileWriter_writeToFile() writes a list of profile structures to a file and
    dxfg_v4_InstrumentProfileWriter_writeToBytes() to memory, as a new dxfg_v4_byte_list (dxfg_v4_javac.h, released by dxfg_v4_byte_list_release(), never NULL on success);
    writeHandlesToFile() and writeHandlesToBytes() do the same for a list of profile handles. As in Java, the name
    selects plain text, .gz or .zip. The custom fields of the structures are written: the header lists their names.
    A NULL argument or list element fails with IllegalArgumentException before anything is written, data over
    Integer.MAX_VALUE - 8 bytes with IllegalStateException. The description of dxfg_instrument_profile2_t no
    longer says that the handle of its custom fields always shares them with the profile: a field added through the
    handle may move them to a new storage.

  • [MDAPI-489][GRAAL] Four members of the Java API that the SDK did not export, and the exceptions of the ORCS
    server with their classes. The new listeners stop on release and on dxfg_v4_NativeListener_deactivateAll().

    • dxfg_v4_ObservableSubscriptionChangeListener_newWithConfigurationChanged() (dxfg_v4_events.h) creates a
      subscription change listener with the configurationChanged callback (called, for example, when the aggregation
      period changes); each of its four callbacks may be NULL.
    • dxfg_v4_DXFeedTimeSeriesSubscription_getFromTime() returns the time that
      dxfg_v4_DXFeedTimeSeriesSubscription_setFromTime() set.
    • dxfg_v4_AuthOrderSource_create() creates an AuthOrderSource from the entries of identifiers and symbols; a NULL
      entry, symbol list or symbol and a duplicate identifier fail the call.
    • dxfg_v4_OnDemandPropertyChangeListener_new(), dxfg_v4_OnDemandService_addPropertyChangeListener() and
      dxfg_v4_OnDemandService_removePropertyChangeListener() report the property changes of an on-demand service
      (replaySupported, replay, clear, speed, time) with the old and the new values, each with its kind
      (DXFG_V4_ON_DEMAND_PROPERTY_VALUE_NULL for null).
    • The PriceLevelService functions ...
Read more

v3.13.0-rc2

v3.13.0-rc2 Pre-release
Pre-release

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 02 Nov 22:08
  • [MDAPI-466][GRAAL] The event queue (dxfg_v4_event_queue.h): the events of a subscription received on the
    application's own thread, without callbacks. dxfg_v4_EventQueue_new() creates a queue on a subscription (on one
    attached to a feed, before its symbols are added, as for a listener); dxfg_v4_EventQueue_poll() waits up to a
    timeout and returns the events as a dxfg_v4_event_type_list, or the positive codes DXFG_EVENT_QUEUE_NO_EVENTS
    and DXFG_EVENT_QUEUE_CLOSED;
    dxfg_v4_EventQueue_wakeUp(), dxfg_v4_EventQueue_close() and dxfg_v4_EventQueue_getDroppedEvents() complete it.
    The SDK retrieves the events only when the queue is polled, on the polling thread, so the lasting events are
    conflated and the buffers of the SDK bound the memory; the lost events are counted. dxfg_v4_system_shutdown() and
    dxfg_v4_NativeListener_deactivateAll() close the queues, so the polling threads can leave the SDK before
    graal_tear_down_isolate(). The executor of a subscription with an event queue cannot be changed:
    dxfg_v4_DXFeedSubscription_setExecutor(), dxfg_v4_SubscriptionController_setExecutor() and their older functions
    fail with IllegalStateException. dxfg_v4_DXFeed_detachSubscriptionAndClear() does not wait for a poll of the
    queue of the subscription.

  • [MDAPI-468][GRAAL] The shared event queue: one thread polls many subscriptions and runs the models.
    dxfg_v4_EventQueue_create() creates a queue without a subscription, dxfg_v4_EventQueue_attach() attaches a
    subscription with an int64_t tag, and dxfg_v4_EventQueue_pollTagged() returns a dxfg_v4_tagged_event_list (the
    events and a parallel array of their tags, released by dxfg_v4_tagged_event_list_release()); a subscription close
    detaches only that subscription. dxfg_v4_EventQueue_getExecutor() returns the queue's executor for the models, the
    instrument profile collector, the subscription and controller setters, the endpoint builder and the promise handlers:
    their listeners run inside the polls on the polling thread, and a poll that ran only their work returns
    DXFG_EVENT_QUEUE_NO_EVENTS at once. A closed queue calls no listener of the application, also from the work it
    still runs for the SDK. A queue made by dxfg_v4_EventQueue_new() stays bound to its subscription and rejects
    attach and getExecutor. The executor of an attached subscription is refused by every function that accepts an
    executor (IllegalStateException); dxfg_v4_ExecutorBaseOnConcurrentLinkedQueue_processAllPendingTasks() fails with
    IllegalArgumentException for an executor it did not create, instead of a ClassCastException.

  • [MDAPI-482][GRAAL] Stable and experimental functions. A stable function changes only by deprecation and is
    removed only in a major release; an experimental one may change or be removed in a minor release, and an incompatible
    change gives it a new name. The experimental functions are marked DXFG_EXPERIMENTAL (dxfg_common.h, empty unless
    the application defines it first, e.g. as a deprecation attribute) and listed on the "Experimental declarations" page
    of the C API reference: the twins of the experimental Java API (dxfg_v4_indexed_event_tx_model.h,
    dxfg_v4_subscription_controller.h, dxfg_v4_DXFeedSubscription_getSubscriptionController(),
    dxfg_v4_DXFeedSubscription_getTotalDroppedEvents(), the IndexedTxModel, TimeSeriesTxModel and TxModelListener
    functions of dxfg_v4_event_model.h). These 73 functions came out in 3.12.0 with no tier and are experimental from
    now on; their older twins stay until 4.0.0 as the other deprecated functions do, and their deprecation messages say
    that the replacement is experimental. Later advanced headers with experimental functions only are not included by
    dxfg_v4_api.h; the header check of the build enforces the boundary. The Nuam and OrderImbalance event types are
    experimental in their descriptions. dxfg_v4_system_get_version(), dxfg_v4_system_get_advanced_revision()
    (DXFG_V4_ADVANCED_REVISION, now 1) and dxfg_v4_system_is_feature_supported() (DXFG_V4_FEATURE_EVENT_QUEUE,
    DXFG_V4_FEATURE_SHARED_EVENT_QUEUE) let a wrapper check the library before it binds the other functions.

  • [MDAPI-483][GRAAL] The description of the C API for wrapper generators: every archive has dxfg-api.json next
    to the library, generated from the headers and the same on every platform. It lists the version, the advanced
    revision, the features, the headers with their tiers and the functions, types and macros with their tiers and the
    versions that added them; a function has its return type, its parameters with DXFG_OUT, the functions that
    release its results and its DXFG_DEPRECATED replacements. The build checks the headers against the committed
    description of 3.12.0: a stable declaration is not changed or removed, an experimental one changes only with a higher
    DXFG_V4_ADVANCED_REVISION, and a new declaration needs @since. See "API description" in the README.

  • [MDAPI-484][GRAAL] The library no longer prints the JDK warning about sun.misc.Unsafe ("A terminally
    deprecated method in sun.misc.Unsafe has been called", from com.devexperts.util.AtomicArraysUnsafe of QD) to
    stderr of the application: the image is built with --sun-misc-unsafe-memory-access=allow.

  • [MDAPI-485][GRAAL] The ready signal of an event queue: an event loop polls without a reader thread.
    dxfg_v4_EventQueue_setReadySignal() (experimental, dxfg_v4_event_queue.h) gives a queue an OS object of the host,
    which the SDK makes ready whenever the queue has work (the events of a subscription, the work of a model or the
    collector, a wake-up, the close): a non-blocking file descriptor on Linux, macOS and iOS
    (DXFG_V4_READY_SIGNAL_FD, an eventfd or the write end of a pipe; a blocking or read-only descriptor is refused
    with IllegalArgumentException), an event on Windows (DXFG_V4_READY_SIGNAL_WINDOWS_EVENT). The loop waits for the
    object, resets it and polls with the timeout 0; no work is left without a signal, and a signal without work gives
    DXFG_EVENT_QUEUE_NO_EVENTS. The host creates, owns and closes the object, after the queue is closed; the SDK never
    closes it and does not write to it after the signal is removed or the queue is closed.
    DXFG_V4_FEATURE_EVENT_QUEUE_READY_SIGNAL reports the function; DXFG_V4_ADVANCED_REVISION stays 1. A loop that
    cannot wait for a foreign object (the asyncio proactor loop and libuv on Windows) keeps a reader thread.

  • [MDAPI-488][GRAAL] A promise created, completed and failed from C (dxfg_v4_feed.h):
    dxfg_v4_Promise_new() creates a promise, dxfg_v4_Promise_complete() completes it with a Java object handle (or
    NULL) and dxfg_v4_Promise_getResult() reads the result of a promise of any kind as a handle.
    dxfg_v4_Promise_completeExceptionallyWithClassNameAndMessage() fails a promise and
    dxfg_v4_Promise_failedWithClassNameAndMessage() creates a failed one, with an exception of the named class and the
    message. The class comes from a fixed set (RuntimeException, IllegalArgumentException, IllegalStateException,
    UnsupportedOperationException, java.io.IOException, CancellationException, TimeoutException, by their fully
    qualified names); any other name gives a RuntimeException whose message starts with the name. As in Java, the first
    result wins: a later completion does nothing and returns success. dxfg_Promise_failed(),
    dxfg_v4_Promise_failed() and the completeExceptionally functions that take a dxfg_exception_t keep their
    behaviour; their descriptions point to the new functions.

  • [MDAPI-491][GRAAL] The instrument profile writer (dxfg_v4_ipf.h):
    dxfg_v4_InstrumentProfileWriter_writeToFile() writes a list of profile structures to a file and
    dxfg_v4_InstrumentProfileWriter_writeToBytes() to memory, as a new dxfg_v4_byte_list (dxfg_v4_javac.h, released by dxfg_v4_byte_list_release(), never NULL on success);
    writeHandlesToFile() and writeHandlesToBytes() do the same for a list of profile handles. As in Java, the name
    selects plain text, .gz or .zip. The custom fields of the structures are written: the header lists their names.
    A NULL argument or list element fails with IllegalArgumentException before anything is written, data over
    Integer.MAX_VALUE - 8 bytes with IllegalStateException. The description of dxfg_instrument_profile2_t no
    longer says that the handle of its custom fields always shares them with the profile: a field added through the
    handle may move them to a new storage.

  • [MDAPI-489][GRAAL] Four members of the Java API that the SDK did not export, and the exceptions of the ORCS
    server with their classes. The new listeners stop on release and on dxfg_v4_NativeListener_deactivateAll().

    • dxfg_v4_ObservableSubscriptionChangeListener_newWithConfigurationChanged() (dxfg_v4_events.h) creates a
      subscription change listener with the configurationChanged callback (called, for example, when the aggregation
      period changes); each of its four callbacks may be NULL.
    • dxfg_v4_DXFeedTimeSeriesSubscription_getFromTime() returns the time that
      dxfg_v4_DXFeedTimeSeriesSubscription_setFromTime() set.
    • dxfg_v4_AuthOrderSource_create() creates an AuthOrderSource from the entries of identifiers and symbols; a NULL
      entry, symbol list or symbol and a duplicate identifier fail the call.
    • dxfg_v4_OnDemandPropertyChangeListener_new(), dxfg_v4_OnDemandService_addPropertyChangeListener() and
      dxfg_v4_OnDemandService_removePropertyChangeListener() report the property changes of an on-demand service
      (replaySupported, replay, clear, speed, time) with the old and the new values, each with its kind
      (DXFG_V4_ON_DEMAND_PROPERTY_VALUE_NULL for null).
    • The PriceLevelService functions ...
Read more

v3.12.0

Choose a tag to compare

@AnatolyKalin AnatolyKalin released this 26 Oct 11:02
  • [MDAPI-458][GRAAL] The dxfg_v4_ functions: the operations of the C API in one form. A v4 function returns the
    int32_t status only (DXFG_EXECUTE_SUCCESSFULLY or DXFG_EXECUTE_FAIL), writes its result to the last parameter,
    marked DXFG_OUT (a NULL result means "no value", never an error), returns collections as dxfg_v4_<element>_list
    with a _release function, and its name has no digit suffix: an overload is named by its parameters. Its types are
    dxfg_v4_ typedefs of the older ones, so the older and the v4 functions can be mixed. The headers are
    dxfg_v4_<area>.h, all included by dxfg_v4_api.h and dxfg_api.h; the rules are in the "The v4 functions" group of
    the C API reference. The prefix names a generation of the C API, not a release of the SDK: later releases, major
    ones included, keep it until these rules change. This release adds the twins of:
    • dxfg_free() (dxfg_common.h) and the functions of dxfg_javac.h, dxfg_catch_exception.h, dxfg_endpoint.h,
      dxfg_feed.h, dxfg_subscription.h, dxfg_publisher.h and dxfg_events.h, e.g.
      dxfg_v4_get_and_clear_thread_exception(), dxfg_v4_JavaObjectHandler_release(),
      dxfg_v4_DXEndpoint_createWithRole(), dxfg_v4_DXEndpoint_getState() (writes the enum value),
      dxfg_v4_Promise_getException() (no (dxfg_exception_t *)-1 marker) and dxfg_v4_promise_list_release().
    • The functions of dxfg_ipf.h: the instrument profiles are read, iterated and given to a collector as structures
      (dxfg_v4_instrument_profile_data_t, the older dxfg_instrument_profile2_t) in
      dxfg_v4_instrument_profile_data_list, e.g. dxfg_v4_InstrumentProfileReader_readFromFile(),
      dxfg_v4_Iterable_InstrumentProfile_next(), dxfg_v4_InstrumentProfileCollector_updateInstrumentProfiles(). The
      forms with profile handles keep a suffix (dxfg_v4_InstrumentProfileReader_readFromFileAsHandles(),
      dxfg_v4_Iterable_InstrumentProfile_nextHandle(),
      dxfg_v4_InstrumentProfileCollector_updateInstrumentProfileHandles()).
    • The functions of dxfg_schedule.h: dxfg_v4_Schedule_getInstance() takes an instrument profile structure,
      dxfg_v4_Schedule_getInstanceByProfileHandle() a handle and dxfg_v4_Schedule_getInstanceByDefinition() a
      definition string; a day or a session that is not found is written as NULL. dxfg_v4_session_list_release()
      releases the sessions of a list together with the list, dxfg_v4_session_list_wrapper_release() the list only.
    • The functions of dxfg_glossary.h: the arrays with a size become lists, dxfg_v4_double_list (the price
      increments), dxfg_v4_string_to_double_map_entry_list (the map of additional underlyings) and
      dxfg_v4_cfi_value_list (the values of a CFI code).
    • The functions of dxfg_event_model.h, dxfg_indexed_event_tx_model.h, dxfg_ondemand.h, dxfg_orcs.h,
      dxfg_candlewebservice.h, dxfg_subscription_controller.h, dxfg_logging.h, dxfg_system.h and dxfg_qds.h,
      e.g. dxfg_v4_OrderBookModel_getFilter() (writes the enum value), dxfg_v4_system_get_property() (a missing
      property is written as NULL), dxfg_v4_OnDemandService_getInstanceByEndpoint(),
      dxfg_v4_OnDemandService_replayWithSpeed(), dxfg_v4_PriceLevelService_getOrdersWithCaller() and
      dxfg_v4_symbols_by_order_source_map_entry_list_release(). A function that already has the v4 form gets a twin with
      the dxfg_v4_ name and types.
  • [MDAPI-458][GRAAL] Deprecated: dxfg_free() and the functions of dxfg_javac.h, dxfg_catch_exception.h,
    dxfg_endpoint.h, dxfg_feed.h, dxfg_subscription.h, dxfg_publisher.h, dxfg_events.h, dxfg_ipf.h,
    dxfg_schedule.h, dxfg_glossary.h, dxfg_event_model.h, dxfg_indexed_event_tx_model.h, dxfg_ondemand.h,
    dxfg_orcs.h, dxfg_candlewebservice.h, dxfg_subscription_controller.h, dxfg_logging.h, dxfg_system.h and
    dxfg_qds.h: each one is marked DXFG_DEPRECATED and names its v4 twin. The instrument profile forms with an array
    and a size, dxfg_free_strings() and dxfg_free_string_to_double_map_entries() have no twin: their deprecation names
    the list function or the release function of the list. They work as before and are removed in 4.0.0.
  • [MDAPI-458][GRAAL] The build checks that the C API headers declare the functions that the library exports, with
    the same numbers of parameters, that every older function is marked DXFG_DEPRECATED in favour of declared dxfg_v4_
    functions, that dxfg_v4_api.h includes every dxfg_v4_*.h and that dxfg_api.h includes dxfg_v4_api.h
    (-Dapi.headers.check.skip=true skips it).
  • [MDAPI-464][GRAAL] dxfg_v4_NativeListener_deactivateAll() (dxfg_v4_javac.h) deactivates all the
    listeners of the isolate created by the dxfg_*Listener_new functions and waits for their callbacks in progress on
    other threads; the listeners created afterwards are inactive from the start. dxfg_v4_system_shutdown()
    (dxfg_v4_system.h) deactivates them and then closes the endpoints and instrument profile connections, as
    dxfg_v4_system_close_all_and_await_termination() does, so that no callback runs while they are closed.

For integrators

  • Code that calls a deprecated function gets a compiler warning (C4996 with MSVC, -Wdeprecated-declarations with GCC
    and Clang), an error with -Werror or /WX. Move the call to the v4 twin, or silence the warning: define the macro
    empty before the headers are included (#define DXFG_DEPRECATED(message), or -DDXFG_DEPRECATED(message)= with GCC
    and Clang), or disable C4996 with /wd4996.
  • To stop the callbacks before the objects of the application are destroyed, call dxfg_v4_system_shutdown() first
    in the explicit shutdown of the application instead of releasing or deactivating the listeners one by one; then
    release the remaining handles. Do not call it from an exit handler of a DLL: a callback that waits for the loader
    lock never finishes.