You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A C++-only downstream cannot use any of these without hand-patching the cxx bridge
(apis/c++/node/src/lib.rs) and rebuilding it. This request is to bring the C++
binding to parity so downstreams stop re-implementing framework primitives.
Current state of the C++ binding (verified against origin/main)
$ git show origin/main:apis/c++/node/src/lib.rs | grep -iE "send_service|service_response|memory_pool|register_pool"
# (no output)
Note: send_output_with_metadata + Metadata.set_string technically let a C++ node
attach a REQUEST_IDmanually, but there is no request-id generator, no send_service_response passthrough helper, and — critically — no recv_service_response / recv_action_result with the framework's timeout and
server-restart fault-tolerance. So the useful part (correlation + FT lifecycle) is
still C++-inaccessible.
3. CUDA/pinned memory-pool transport in the C++ binding
Expose the pool lifecycle (register_memory_pool / write_memory_pool / read_memory_pool / free_memory_pool) plus the DORADMA fast path, with a way to
select the host-mapped/pinned path explicitly.
Hard constraint for embedded targets (Tegra / Jetson iGPU): the cudaIpc*
handle path in dora/cuda.pydoes not work on the Xavier NX integrated GPU — cudaIpcGetMemHandle fails on Tegra. The C++/portable path MUST allow forcing the cudaHostRegister(...Mapped) + cudaHostGetDevicePointer (unified-memory, zero-copy
on Tegra LPDDR) route and MUST NOT hard-require CUDA IPC. Ideally the auto-select
in #2386 gains an override / capability flag for IPC-less platforms.
For the memory pool, the daemon protocol variants already exist
(RegisterPinnedMemory / ReadPinnedMemory / FreePinnedMemory from feat: add pinned memory-pool transport for CPU/CUDA tensor transfer #2168); the
work is a cxx wrapper + a small C++/CUDA helper (or documented pattern) for the
device-pointer step, guarded so non-CUDA builds still compile.
Keep IPC optional/feature-gated so the binding builds and runs on iGPU targets
where IPC is unavailable.
Acceptance criteria
A C++ node can issue a service request and await a REQUEST_ID-correlated
response with a timeout, with framework fault-tolerance on server restart.
A C++ node can run the action goal/feedback/result + cancel lifecycle.
A C++ node can register a memory pool and do zero-copy CPU↔CUDA transfer via
the host-pinned path on a NVIDIA Jetson (no CUDA IPC).
A C++ examples/service-example (or equivalent) mirrors the Rust one.
Surface is generated into dora-node-api.h; existing C++ examples still build.
Feature request: expose Service, Action, and the CUDA/pinned memory-pool transport to the C++ node binding
Summary
The Rust and Python node APIs have grown three first-class capabilities that the
C++ node binding does not expose:
send_service_request/send_service_response/
recv_service_response, withREQUEST_ID(UUID v7) correlation and built-intimeout + fault-tolerance.
new_request_id,GOAL_ID/GOAL_STATUSmetadata, feedback + terminal result, cancellation, andrecv_action_resultwith timeout + fault-tolerance.register_memory_pool/write_memory_pool/read_memory_pool/free_memory_poolwith the DORADMApinned-host fast path (added in feat: add pinned memory-pool transport for CPU/CUDA tensor transfer #2168, auto pinned/pageable selection in feat(memory-pool): auto-select pinned vs pageable DMA based on tensor size #2386).
A C++-only downstream cannot use any of these without hand-patching the cxx bridge
(
apis/c++/node/src/lib.rs) and rebuilding it. This request is to bring the C++binding to parity so downstreams stop re-implementing framework primitives.
Current state of the C++ binding (verified against
origin/main)What C++ already has and works well:
send_output,send_output_with_metadata,send_arrow_output(metadata-carrying).Metadataread/write surface (get_str/set_string/… +to_json/list_keys).next_event,next_event_timeout,try_next_event),close_outputs,NodeFailed/Reloadevents,node_config_json/dataflow_descriptor_json.What C++ is missing (present in
apis/rust/node):DoraNode::send_service_request(apis/rust/node/src/node/mod.rs)DoraNode::send_service_responseEventStream::recv_service_response(rid, node_id, timeout)(event_stream/mod.rs)DoraNode::new_request_id(UUID v7)GOAL_ID/GOAL_STATUS/send_action_*+recv_action_resultapis/rust/node/src/node/control_channel.rs+dora-memory-poolcrateapis/python/node/dora/cuda.py(cudaHostRegister+cudaHostGetDevicePointer)Grep confirmation (empty = not exposed):
Note:
send_output_with_metadata+Metadata.set_stringtechnically let a C++ nodeattach a
REQUEST_IDmanually, but there is no request-id generator, nosend_service_responsepassthrough helper, and — critically — norecv_service_response/recv_action_resultwith the framework's timeout andserver-restart fault-tolerance. So the useful part (correlation + FT lifecycle) is
still C++-inaccessible.
Requests
1. Service request/reply in the C++ binding
Expose cxx equivalents of:
send_service_request(output_id, metadata_params, data) -> request_idsend_service_response(output_id, metadata_params, data)recv_service_response(request_id, server_node_id, timeout) -> Event/resultnew_request_id() -> Stringso a C++ node gets the same
REQUEST_ID-correlated, timeout-and-FT request/reply asexamples/service-example/.2. Action (goal/feedback/result) in the C++ binding
Expose the goal-id/feedback/result/cancel surface +
recv_action_result(goal_id, server_node_id, timeout), mirroringdocs/patterns.md§3.3. CUDA/pinned memory-pool transport in the C++ binding
Expose the pool lifecycle (
register_memory_pool/write_memory_pool/read_memory_pool/free_memory_pool) plus the DORADMA fast path, with a way toselect the host-mapped/pinned path explicitly.
Hard constraint for embedded targets (Tegra / Jetson iGPU): the
cudaIpc*handle path in
dora/cuda.pydoes not work on the Xavier NX integrated GPU —cudaIpcGetMemHandlefails on Tegra. The C++/portable path MUST allow forcing thecudaHostRegister(...Mapped)+cudaHostGetDevicePointer(unified-memory, zero-copyon Tegra LPDDR) route and MUST NOT hard-require CUDA IPC. Ideally the auto-select
in #2386 gains an override / capability flag for IPC-less platforms.
Suggested approach
apis/c++/node/src/lib.rs(cxx bridge), keeping thegenerated
dora-node-api.has the single source of truth for the C++ surface —the same way feat(c++/node): add event receive variants (rescue of #1409) #1846–feat(c++/operator): forward InputClosed and Stop events to C++ callbacks (rescue of #1414) #1849 rescued the event-receive / close_outputs / NodeFailed
surface into C++.
(
RegisterPinnedMemory/ReadPinnedMemory/FreePinnedMemoryfrom feat: add pinned memory-pool transport for CPU/CUDA tensor transfer #2168); thework is a cxx wrapper + a small C++/CUDA helper (or documented pattern) for the
device-pointer step, guarded so non-CUDA builds still compile.
where IPC is unavailable.
Acceptance criteria
REQUEST_ID-correlatedresponse with a timeout, with framework fault-tolerance on server restart.
the host-pinned path on a NVIDIA Jetson (no CUDA IPC).
examples/service-example(or equivalent) mirrors the Rust one.dora-node-api.h; existing C++ examples still build.References
docs/patterns.md(§2 Service, §3 Action)examples/service-example/examples/memory-pool/close_outputs/NodeFailed/Reload, node_config_json, InputClosed/Stop forwarding)
non-UInt8 input)