Repository navigation
Releases
v3.17.0-rc1
- [MDAPI-526][GRAAL] NetTest passes its
-Xmx<size>,-Xms<size>,
-Xmn<size>and-XX:<option>arguments to the Graal isolate, asjavatakes 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-Xargument, exits with 2. At the end of the run the tool closes all endpoints and tears the isolate down,
so-XX:+PrintGCSummaryprints its summary. - [MDAPI-527][GRAAL] A new Java tool, NetTestApi, publishes generated Trade or TimeAndSale
events through theDXPublisherof the dxFeed Java API with the command line of
NetTest and prints the statistics line of the QD toolNetTest p, so that the event
layer can be benchmarked in Java next to the C API and QD. It is a tool of QD'sToolsand is deployed with every
release ascom.dxfeed:graal-native-sdk-nettest(the all-in-one jar has the classifierall); it is not part of the
SDK archives. The NetTest README now says that a TimeAndSale consumer needs-c stream.
v3.16.0
- [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 atFINER) failed withNullPointerException. The listener now gets
FINERas TRACE,CONFIGas 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
JavaDXEndpoint.getInstance(Role). It is removed in 4.0.0.dxfg_v4_message_connector.hnow 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:7400returns the address*:7400. - [MDAPI-520][GRAAL] A new tool, NetTest, publishes generated Trade or
TimeAndSale events throughdxfg_v4_DXPublisher_publishEvents()at a fixed rate and prints the statistics line of
the QD toolNetTest 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.Nativeno 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) andoracle-g1(the G1 GC, one isolate per
process; Linux x64 and arm64, macOS arm64). Their archives end with-oracleand-oracle-g1
(graal-native-sdk-<version>-amd64-linux-oracle.zip), and the NuGet packagesDxFeed.Graal.Native.Oracleand
DxFeed.Graal.Native.Oracle.G1replaceDxFeed.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; calldxfg_v4_DXEndpoint_createWithRole()instead.
v3.16.0-rc1
- [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 atFINER) failed withNullPointerException. The listener now gets
FINERas TRACE,CONFIGas 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
JavaDXEndpoint.getInstance(Role). It is removed in 4.0.0.dxfg_v4_message_connector.hnow 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:7400returns the address*:7400. - [MDAPI-520][GRAAL] A new tool, NetTest, publishes generated Trade or
TimeAndSale events throughdxfg_v4_DXPublisher_publishEvents()at a fixed rate and prints the statistics line of
the QD toolNetTest 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.Nativeno 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) andoracle-g1(the G1 GC, one isolate per
process; Linux x64 and arm64, macOS arm64). Their archives end with-oracleand-oracle-g1
(graal-native-sdk-<version>-amd64-linux-oracle.zip), and the NuGet packagesDxFeed.Graal.Native.Oracleand
DxFeed.Graal.Native.Oracle.G1replaceDxFeed.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; calldxfg_v4_DXEndpoint_createWithRole()instead.
v3.15.0
- [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 setsjavax.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 GraalVMjdk-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 setsjavax.net.ssl.trustStorekeeps its own trust store.
v3.15.0-rc1
- [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 setsjavax.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 GraalVMjdk-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 setsjavax.net.ssl.trustStorekeeps its own trust store.
v3.14.0
- [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, ascom.devexperts.qd.qtp.MessageConnectorreports it.
dxfg_v4_DXEndpoint_getConnectors()returns the current connectors, one per address of the address string, released
bydxfg_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_CONNECTORSreports the family. - [MDAPI-477][GRAAL] The last connection error of a message connector and of an endpoint, and
log.levelthat
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()anddxfg_v4_DXEndpoint_getLastConnectionError()return a copy
(dxfg_v4_connection_error_t, released bydxfg_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 anylog.level; with anotherlog.classNamenothing is captured, and a level the user sets on QD's connector
loggers wins.DXFG_V4_FEATURE_CONNECTION_ERRORSreports the family. log.level,err.level,dxfg_logging_set_log_level()anddxfg_logging_set_err_level()(and their v4
functions) also set the level of the root logger ofjava.util.loggingwhenlog.classNameis
com.devexperts.logging.InterceptableLogging:DEBUGandALLnow produce the messages belowINFO, and the
messages below the level are no longer created. The defaultlog.levelisINFO, which was already the effective
default.
- The last connection error (experimental,
- [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 andgraal_tear_down_isolate()did not return. QDS 3.357 also fixes
the exception inDXEndpoint.close()of an endpoint built with an executor (QD-1801) and an
ArrayIndexOutOfBoundsExceptionin 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 ofSIGPIPEand
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:-EnableSignalHandlingstill turns them off, and a handler orSIG_IGNof 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 andCMakeLists.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 aDXFG_ENDPOINT_ROLE_LOCAL_HUBendpoint 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.
- The wrapper guide (
For integrators
- Check
DXFG_V4_FEATURE_MESSAGE_CONNECTORSwithdxfg_v4_system_is_feature_supported()before binding the connector
functions. Bind the experimental listener functions only whendxfg_v4_system_get_advanced_revision()equals
DXFG_V4_ADVANCED_REVISIONof 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_recordsgrows between two reads of the statistics;read_bytesgrows 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 mcprints the connectors of an endpoint. - Check
DXFG_V4_FEATURE_CONNECTION_ERRORSand the advanced revision before binding the connection error functions.
Treat an unknown category asDXFG_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.leveltoDEBUGorALLwithInterceptableLoggingnow gets the debug messages it
asked for; setINFOto keep the output as before. - On macOS x64 an application that relied on
SIGPIPEkeeping its default action (ending the process) now gets
EPIPEfrom the write instead, as on the other platforms; a workaround that setsSIG_IGNitself 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 adxfg_v4_twin,dxfg_free_strings()anddxfg_free_string_to_double_map_entries()). To
find the calls, build with the deprecation warnings on (do not defineDXFG_DEPRECATEDempty 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 ofIndexedTxModel,TimeSeriesTxModeland 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.mdin the archive).
v3.14.0-rc2
- [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, ascom.devexperts.qd.qtp.MessageConnectorreports it.
dxfg_v4_DXEndpoint_getConnectors()returns the current connectors, one per address of the address string, released
bydxfg_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_CONNECTORSreports the family. - [MDAPI-477][GRAAL] The last connection error of a message connector and of an endpoint, and
log.levelthat
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()anddxfg_v4_DXEndpoint_getLastConnectionError()return a copy
(dxfg_v4_connection_error_t, released bydxfg_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 anylog.level; with anotherlog.classNamenothing is captured, and a level the user sets on QD's connector
loggers wins.DXFG_V4_FEATURE_CONNECTION_ERRORSreports the family. log.level,err.level,dxfg_logging_set_log_level()anddxfg_logging_set_err_level()(and their v4
functions) also set the level of the root logger ofjava.util.loggingwhenlog.classNameis
com.devexperts.logging.InterceptableLogging:DEBUGandALLnow produce the messages belowINFO, and the
messages below the level are no longer created. The defaultlog.levelisINFO, which was already the effective
default.
- The last connection error (experimental,
- [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 andgraal_tear_down_isolate()did not return. QDS 3.357 also fixes
the exception inDXEndpoint.close()of an endpoint built with an executor (QD-1801) and an
ArrayIndexOutOfBoundsExceptionin 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 ofSIGPIPEand
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:-EnableSignalHandlingstill turns them off, and a handler orSIG_IGNof 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 andCMakeLists.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 aDXFG_ENDPOINT_ROLE_LOCAL_HUBendpoint 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.
- The wrapper guide (
For integrators
- Check
DXFG_V4_FEATURE_MESSAGE_CONNECTORSwithdxfg_v4_system_is_feature_supported()before binding the connector
functions. Bind the experimental listener functions only whendxfg_v4_system_get_advanced_revision()equals
DXFG_V4_ADVANCED_REVISIONof 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_recordsgrows between two reads of the statistics;read_bytesgrows 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 mcprints the connectors of an endpoint. - Check
DXFG_V4_FEATURE_CONNECTION_ERRORSand the advanced revision before binding the connection error functions.
Treat an unknown category asDXFG_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.leveltoDEBUGorALLwithInterceptableLoggingnow gets the debug messages it
asked for; setINFOto keep the output as before. - On macOS x64 an application that relied on
SIGPIPEkeeping its default action (ending the process) now gets
EPIPEfrom the write instead, as on the other platforms; a workaround that setsSIG_IGNitself 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 adxfg_v4_twin,dxfg_free_strings()anddxfg_free_string_to_double_map_entries()). To
find the calls, build with the deprecation warnings on (do not defineDXFG_DEPRECATEDempty 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 ofIndexedTxModel,TimeSeriesTxModeland 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.mdin the archive).
v3.13.0
-
[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 adxfg_v4_event_type_list, or the positive codesDXFG_EVENT_QUEUE_NO_EVENTS
andDXFG_EVENT_QUEUE_CLOSED;
dxfg_v4_EventQueue_wakeUp(),dxfg_v4_EventQueue_close()anddxfg_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 withIllegalStateException.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 anint64_ttag, anddxfg_v4_EventQueue_pollTagged()returns adxfg_v4_tagged_event_list(the
events and a parallel array of their tags, released bydxfg_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_EVENTSat once. A closed queue calls no listener of the application, also from the work it
still runs for the SDK. A queue made bydxfg_v4_EventQueue_new()stays bound to its subscription and rejects
attachandgetExecutor. The executor of an attached subscription is refused by every function that accepts an
executor (IllegalStateException);dxfg_v4_ExecutorBaseOnConcurrentLinkedQueue_processAllPendingTasks()fails with
IllegalArgumentExceptionfor an executor it did not create, instead of aClassCastException. -
[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 markedDXFG_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(), theIndexedTxModel,TimeSeriesTxModelandTxModelListener
functions ofdxfg_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 andOrderImbalanceevent types are
experimental in their descriptions.dxfg_v4_system_get_version(),dxfg_v4_system_get_advanced_revision()
(DXFG_V4_ADVANCED_REVISION, now 1) anddxfg_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.jsonnext
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 withDXFG_OUT, the functions that
release its results and itsDXFG_DEPRECATEDreplacements. 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", fromcom.devexperts.util.AtomicArraysUnsafeof 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, aneventfdor the write end of a pipe; a blocking or read-only descriptor is refused
withIllegalArgumentException), 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_SIGNALreports the function;DXFG_V4_ADVANCED_REVISIONstays 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) anddxfg_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 aRuntimeExceptionwhose 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 thecompleteExceptionallyfunctions that take adxfg_exception_tkeep 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 newdxfg_v4_byte_list(dxfg_v4_javac.h, released bydxfg_v4_byte_list_release(), never NULL on success);
writeHandlesToFile()andwriteHandlesToBytes()do the same for a list of profile handles. As in Java, the name
selects plain text,.gzor.zip. The custom fields of the structures are written: the header lists their names.
A NULL argument or list element fails withIllegalArgumentExceptionbefore anything is written, data over
Integer.MAX_VALUE - 8bytes withIllegalStateException. The description ofdxfg_instrument_profile2_tno
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 ondxfg_v4_NativeListener_deactivateAll().dxfg_v4_ObservableSubscriptionChangeListener_newWithConfigurationChanged()(dxfg_v4_events.h) creates a
subscription change listener with theconfigurationChangedcallback (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_NULLfor null).- The
PriceLevelServicefunctions ...
v3.13.0-rc2
-
[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 adxfg_v4_event_type_list, or the positive codesDXFG_EVENT_QUEUE_NO_EVENTS
andDXFG_EVENT_QUEUE_CLOSED;
dxfg_v4_EventQueue_wakeUp(),dxfg_v4_EventQueue_close()anddxfg_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 withIllegalStateException.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 anint64_ttag, anddxfg_v4_EventQueue_pollTagged()returns adxfg_v4_tagged_event_list(the
events and a parallel array of their tags, released bydxfg_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_EVENTSat once. A closed queue calls no listener of the application, also from the work it
still runs for the SDK. A queue made bydxfg_v4_EventQueue_new()stays bound to its subscription and rejects
attachandgetExecutor. The executor of an attached subscription is refused by every function that accepts an
executor (IllegalStateException);dxfg_v4_ExecutorBaseOnConcurrentLinkedQueue_processAllPendingTasks()fails with
IllegalArgumentExceptionfor an executor it did not create, instead of aClassCastException. -
[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 markedDXFG_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(), theIndexedTxModel,TimeSeriesTxModelandTxModelListener
functions ofdxfg_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 andOrderImbalanceevent types are
experimental in their descriptions.dxfg_v4_system_get_version(),dxfg_v4_system_get_advanced_revision()
(DXFG_V4_ADVANCED_REVISION, now 1) anddxfg_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.jsonnext
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 withDXFG_OUT, the functions that
release its results and itsDXFG_DEPRECATEDreplacements. 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", fromcom.devexperts.util.AtomicArraysUnsafeof 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, aneventfdor the write end of a pipe; a blocking or read-only descriptor is refused
withIllegalArgumentException), 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_SIGNALreports the function;DXFG_V4_ADVANCED_REVISIONstays 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) anddxfg_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 aRuntimeExceptionwhose 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 thecompleteExceptionallyfunctions that take adxfg_exception_tkeep 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 newdxfg_v4_byte_list(dxfg_v4_javac.h, released bydxfg_v4_byte_list_release(), never NULL on success);
writeHandlesToFile()andwriteHandlesToBytes()do the same for a list of profile handles. As in Java, the name
selects plain text,.gzor.zip. The custom fields of the structures are written: the header lists their names.
A NULL argument or list element fails withIllegalArgumentExceptionbefore anything is written, data over
Integer.MAX_VALUE - 8bytes withIllegalStateException. The description ofdxfg_instrument_profile2_tno
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 ondxfg_v4_NativeListener_deactivateAll().dxfg_v4_ObservableSubscriptionChangeListener_newWithConfigurationChanged()(dxfg_v4_events.h) creates a
subscription change listener with theconfigurationChangedcallback (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_NULLfor null).- The
PriceLevelServicefunctions ...
v3.12.0
- [MDAPI-458][GRAAL] The
dxfg_v4_functions: the operations of the C API in one form. A v4 function returns the
int32_tstatus only (DXFG_EXECUTE_SUCCESSFULLYorDXFG_EXECUTE_FAIL), writes its result to the last parameter,
markedDXFG_OUT(a NULL result means "no value", never an error), returns collections asdxfg_v4_<element>_list
with a_releasefunction, 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 bydxfg_v4_api.handdxfg_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 ofdxfg_javac.h,dxfg_catch_exception.h,dxfg_endpoint.h,
dxfg_feed.h,dxfg_subscription.h,dxfg_publisher.handdxfg_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 *)-1marker) anddxfg_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 olderdxfg_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 anddxfg_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.handdxfg_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
thedxfg_v4_name and types.
- [MDAPI-458][GRAAL] Deprecated:
dxfg_free()and the functions ofdxfg_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.hand
dxfg_qds.h: each one is markedDXFG_DEPRECATEDand names its v4 twin. The instrument profile forms with an array
and a size,dxfg_free_strings()anddxfg_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 markedDXFG_DEPRECATEDin favour of declareddxfg_v4_
functions, thatdxfg_v4_api.hincludes everydxfg_v4_*.hand thatdxfg_api.hincludesdxfg_v4_api.h
(-Dapi.headers.check.skip=trueskips it). - [MDAPI-464][GRAAL]
dxfg_v4_NativeListener_deactivateAll()(dxfg_v4_javac.h) deactivates all the
listeners of the isolate created by thedxfg_*Listener_newfunctions 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-declarationswith GCC
and Clang), an error with-Werroror/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.