westonpace commented on code in PR #43632:
URL: https://github.com/apache/arrow/pull/43632#discussion_r1767375952


##########
cpp/src/arrow/c/abi.h:
##########
@@ -228,6 +228,207 @@ struct ArrowDeviceArrayStream {
 
 #endif  // ARROW_C_DEVICE_STREAM_INTERFACE
 
+#ifndef ARROW_C_ASYNC_STREAM_INTERFACE
+#define ARROW_C_ASYNC_STREAM_INTERFACE
+
+// ArrowAsyncTask represents available data from a producer that was passed to
+// an invocation of `on_next_task` on the ArrowAsyncDeviceStreamHandler.
+//
+// The reason for this Task approach instead of the Async interface returning
+// the Array directly is to allow for more complex thread handling and reducing
+// context switching and data transfers between CPU cores (e.g. from one L1/L2
+// cache to another) if desired.
+//
+// For example, the `on_next_task` callback can be called when data is ready, 
while
+// the producer puts potential "decoding" logic in the `ArrowAsyncTask` 
object. This
+// allows for the producer to manage the I/O on one thread which calls 
`on_next_task`
+// and the consumer can determine when the decoding (producer logic in the 
`get_data`
+// callback of the task) occurs and on which thread, to avoid a CPU core 
transfer
+// (data staying in the L2 cache).
+struct ArrowAsyncTask {
+  // This callback should populate the ArrowDeviceArray associated with this 
task.
+  // The order of ArrowAsyncTasks provided by the producer enables a consumer 
to
+  // ensure the order of data to process.
+  //
+  // This function is expected to be synchronous, but should not perform any 
blocking
+  // I/O. Ideally it should be as cheap as possible so as to not tie up the 
consumer
+  // thread unnecessarily.
+  //
+  // Returns: 0 if successful, errno-compatible error otherwise.
+  //
+  // If a non-0 value is returned then it should be followed by a call to 
`on_error`
+  // on the appropriate ArrowAsyncDeviceStreamHandler. This is because the 
it's highly
+  // likely that whatever is calling this function may be entirely 
disconnected from
+  // the current control flow. Indicating an error here with a non-zero return 
allows
+  // the current flow to be aware of the error occurring, while still allowing 
any
+  // logging or error handling to still be centralized in the `on_error` 
callback of
+  // the original Async handler.
+  //
+  // Rather than a release callback, any required cleanup should be performed 
as part
+  // of the invocation of `get_data`. Ownership of the Array is passed to the 
consumer
+  // calling this, and so it must be released separately.
+  //
+  // It is only valid to call this method exactly once.
+  int (*get_data)(struct ArrowArrayTask* self, struct ArrowDeviceArray* out);
+
+  // opaque task-specific data
+  void* private_data;
+};
+
+// ArrowAsyncProducer represents a 1-to-1 relationship between an async 
producer
+// and consumer. This object allows the consumer to perform backpressure and 
flow
+// control on the asynchronous stream processing. This object must be owned by 
the
+// producer who creates it, and thus is responsible for cleaning it up.
+struct ArrowAsyncProducer {
+  // A consumer must call this function to start receiving on_next_task calls.
+  //
+  // It *must* be valid to call this synchronously from within `on_next_task` 
or
+  // `on_schema`, but this function *must not* immediately call `on_next_task` 
so as
+  // to avoid recursion and reentrant callbacks.
+  //
+  // After cancel has been called, additional calls to this function must be 
NOPs,
+  // but allowed. While not cancelled, calling this function must register the
+  // given number of additional arrays/batches to be produced with the 
producer.
+  // The producer should only call `on_next_task` at most the registered number
+  // of arrays before propagating backpressure.

Review Comment:
   Your mermaid diagram only shows `request` being called once (IIRC) and it 
might be more helpful if there was someway to demonstrate it was part of a loop 
too.  That being said, the diagram has a lot of info already so maybe it's ok.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to