#[repr(C)]pub struct ProviderStreamControl {
pub is_cancelled: extern "C" fn(user_data: *mut c_void, chunk_kind: u32) -> i32,
pub wait_cancelled_ms: extern "C" fn(user_data: *mut c_void, timeout_ms: u32) -> i32,
pub user_data: *mut c_void,
}Expand description
The plugin’s synchronous control surface over the host, passed to a v2 streaming request fn.
The fields are plain fn pointers plus an opaque pointer, so the struct is
Copy and needs no deallocation. The host owns it for the duration of the
request and it must not be retained.
is_cancelled is the cheap check a plugin’s request loop makes between
chunks (poll it, do not block on it). wait_cancelled_ms is the blocking
variant for a plugin whose loop is not able to poll — an SSE frame read, a
sleep between retries — and it must return promptly on cancellation rather
than waiting out the full timeout.
// Inside a v2 request fn, before handing a delta to `emit`:
if control.is_cancelled(control.user_data, ProviderChunkKind::Content as u32) != 0 {
return 1; // stop producing; the host is already gone
}Fields§
§is_cancelled: extern "C" fn(user_data: *mut c_void, chunk_kind: u32) -> i32is_cancelled(control_user_data, chunk_kind: u32) -> i32. Nonzero when
the caller has gone away. chunk_kind lets the host still admit the
structural chunks a partial message needs: pass
ProviderChunkKind::Content (0) for model output and
ProviderChunkKind::Structural (1) otherwise. Never blocking, never
frees anything.
wait_cancelled_ms: extern "C" fn(user_data: *mut c_void, timeout_ms: u32) -> i32wait_cancelled_ms(control_user_data, timeout_ms) -> i32. Blocks up to
timeout_ms waiting for cancellation, returning nonzero the moment it is
observed. timeout_ms == 0 is a non-blocking poll (same as
is_cancelled with ProviderChunkKind::Content). Safe to call from the
request thread: it only touches the host’s cancellation latch, which is
always present in the snapshot and never holds another lock.
user_data: *mut c_voidHost-owned opaque handle, passed back unchanged to both fields above.