task_local context over context objects
- interner impls logically separate from API in orchid-base (default host interner still in base for testing) - error reporting, logging, and a variety of other features passed down via context in extension, not yet in host to maintain library-ish profile, should consider options - no global spawn mechanic, the host has a spawn function but extensions only get a stash for enqueuing async work in sync callbacks which is then explicitly, manually, and with strict order popped and awaited - still deadlocks nondeterministically for some ungodly reason
This commit is contained in:
67
orchid-api/src/binary.rs
Normal file
67
orchid-api/src/binary.rs
Normal file
@@ -0,0 +1,67 @@
|
||||
//! # Binary extension definition
|
||||
//!
|
||||
//! A binary extension is a DLL / shared object / dylib with a symbol called
|
||||
//! `orchid_extension_main` which accepts a single argument of type [ExtCtx].
|
||||
//! Once that is received, communication continuees through the channel with the
|
||||
//! same protocol outlined in [crate::proto]
|
||||
|
||||
use unsync_pipe::{Reader, Writer};
|
||||
|
||||
/// !Send !Sync owned waker
|
||||
#[repr(C)]
|
||||
pub struct OwnedWakerVT {
|
||||
data: *const (),
|
||||
/// `self`
|
||||
drop: extern "C" fn(*const ()),
|
||||
/// `&self`
|
||||
wake: extern "C" fn(*const ()),
|
||||
}
|
||||
|
||||
/// !Send !Sync, equivalent to `&mut Context<'a>`, hence no `drop`.
|
||||
/// When received in [FutureVT::poll], it must not outlive the call.
|
||||
#[repr(C)]
|
||||
pub struct FutureContextVT {
|
||||
data: *const (),
|
||||
/// `&self`
|
||||
waker: extern "C" fn(*const ()) -> OwnedWakerVT,
|
||||
}
|
||||
|
||||
/// ABI-stable `Poll<()>`
|
||||
#[repr(C)]
|
||||
pub enum UnitPoll {
|
||||
Pending,
|
||||
Ready,
|
||||
}
|
||||
|
||||
/// ABI-stable `Pin<Box<dyn Future<Output = ()>>>`
|
||||
#[repr(C)]
|
||||
pub struct FutureVT {
|
||||
data: *const (),
|
||||
/// `self`
|
||||
drop: extern "C" fn(*const ()),
|
||||
/// `&mut self` Equivalent to [Future::poll]
|
||||
poll: extern "C" fn(*const (), FutureContextVT) -> UnitPoll,
|
||||
}
|
||||
|
||||
/// Owned extension context.
|
||||
///
|
||||
/// When an extension starts, this is passed to
|
||||
#[repr(C)]
|
||||
pub struct ExtensionContext {
|
||||
data: *const (),
|
||||
/// `self`
|
||||
drop: extern "C" fn(*const ()),
|
||||
/// `self` upgrade to a later version of this struct. May only be called if
|
||||
/// none of the other elements have been used yet. If a newer version isn't
|
||||
/// supported, the server must return null, otherwise the the return value is
|
||||
/// a pointer to the immediate next version of this struct
|
||||
next: extern "C" fn(*const ()) -> *const (),
|
||||
/// `&self` Add a future to this extension's task
|
||||
spawn: extern "C" fn(*const (), FutureVT),
|
||||
/// serialized [crate::HostExtChannel]
|
||||
input: Reader,
|
||||
/// serialized [crate::ExtHostChannel]
|
||||
output: Writer,
|
||||
/// UTF-8 log stream directly to log service.
|
||||
log: Writer,
|
||||
}
|
||||
Reference in New Issue
Block a user