pub struct CCall<'context> { /* private fields */ }
Expand description
Interact with Julia from a Rust function called through ccall
.
When you call Rust from Julia through ccall
, Julia has already been initialized and trying to
initialize it again causes a crash. In order to still be able to call Julia from Rust
you must create a scope first. You can use this struct to do so. It must never be used outside
functions called through ccall
, and only once for each ccall
ed function.
Exceptions must only be thrown indirectly by returning a RustResult
.
Implementations§
source§impl<'context> CCall<'context>
impl<'context> CCall<'context>
sourcepub unsafe fn new(frame: &'context mut StackFrame<0>) -> Self
pub unsafe fn new(frame: &'context mut StackFrame<0>) -> Self
Create a new CCall
Safety: This function must never be called outside a function called through ccall
from
Julia and must only be called once during that call.
sourcepub unsafe fn uv_async_send(handle: *mut c_void) -> bool
pub unsafe fn uv_async_send(handle: *mut c_void) -> bool
Wake the task associated with handle
.
The handle must be the handle
field of a Base.AsyncCondition
in Julia. This can be
used to call a long-running Rust function from Julia with ccall
in another thread and
wait for it to complete in Julia without blocking, an example is available in the
repository: ccall_with_threads
.
This method is only available if the uv
feature is enabled.
Safety: the handle must be acquired from an AsyncCondition
.
sourcepub fn scope<T, F>(&mut self, func: F) -> JlrsResult<T>where
for<'scope> F: FnOnce(GcFrame<'scope>) -> JlrsResult<T>,
pub fn scope<T, F>(&mut self, func: F) -> JlrsResult<T>where for<'scope> F: FnOnce(GcFrame<'scope>) -> JlrsResult<T>,
Create a GcFrame
, call the given closure, and return its result.
sourcepub unsafe fn invoke<T, F>(func: F) -> Twhere
T: 'static + CCallReturn,
for<'scope> F: FnOnce(GcFrame<'scope>) -> T,
pub unsafe fn invoke<T, F>(func: F) -> Twhere T: 'static + CCallReturn, for<'scope> F: FnOnce(GcFrame<'scope>) -> T,
Create an instance of CCall
and use it to invoke the provided closure.
Safety: this method must only be called from ccall
ed functions. The returned data is
unrooted and must be returned to Julia immediately.
sourcepub unsafe fn invoke_fallible<T, F>(func: F) -> RustResultRet<T>where
T: ConstructType,
for<'scope> F: FnOnce(GcFrame<'scope>) -> JlrsResult<RustResultRet<T>>,
pub unsafe fn invoke_fallible<T, F>(func: F) -> RustResultRet<T>where T: ConstructType, for<'scope> F: FnOnce(GcFrame<'scope>) -> JlrsResult<RustResultRet<T>>,
Create an instance of CCall
and use it to invoke the provided closure.
Safety: this method must only be called from ccall
ed functions. The returned data is
unrooted and must be returned to Julia immediately.
sourcepub unsafe fn stackless_invoke<T, F>(func: F) -> Twhere
T: 'static + CCallReturn,
for<'scope> F: FnOnce(Unrooted<'scope>) -> T,
pub unsafe fn stackless_invoke<T, F>(func: F) -> Twhere T: 'static + CCallReturn, for<'scope> F: FnOnce(Unrooted<'scope>) -> T,
Invoke the provided closure.
Safety: this method must only be called from ccall
ed functions. The returned data is
unrooted and must be returned to Julia immediately.
sourcepub unsafe fn throw_exception<F>(self, func: F) -> !where
F: for<'scope> FnOnce(&mut GcFrame<'scope>) -> Value<'scope, 'static>,
pub unsafe fn throw_exception<F>(self, func: F) -> !where F: for<'scope> FnOnce(&mut GcFrame<'scope>) -> Value<'scope, 'static>,
Create and throw an exception.
This method calls func
and throws the result as a Julia exception.
Safety:
Julia exceptions are implemented with setjmp
/ longjmp
. This means that when an
exception is thrown, control flow is returned to a catch
block by jumping over
intermediate stack frames. It’s undefined behaviour to jump over frames that have pending
drops, so you must take care to structure your code such that none of the intermediate
frames have any pending drops.
sourcepub unsafe fn stackless_scope<T, F>(func: F) -> JlrsResult<T>where
for<'scope> F: FnOnce(Unrooted<'scope>) -> JlrsResult<T>,
pub unsafe fn stackless_scope<T, F>(func: F) -> JlrsResult<T>where for<'scope> F: FnOnce(Unrooted<'scope>) -> JlrsResult<T>,
Create an Unrooted
, call the given closure, and return its result.
Unlike CCall::scope
this method doesn’t allocate a stack.
Safety: must only be called from a ccall
ed function that doesn’t need to root any data.
sourcepub fn set_pool_size(&self, size: usize)
pub fn set_pool_size(&self, size: usize)
Set the size of the internal thread pool.
sourcepub fn dispatch_to_pool<F, T>(func: F) -> Arc<DispatchHandle<T>>where
F: FnOnce(Arc<DispatchHandle<T>>) + Send + 'static,
T: IntoJulia + Send + Sync + ConstructType,
pub fn dispatch_to_pool<F, T>(func: F) -> Arc<DispatchHandle<T>>where F: FnOnce(Arc<DispatchHandle<T>>) + Send + 'static, T: IntoJulia + Send + Sync + ConstructType,
Dispatch func
to a thread pool.
sourcepub fn init_jlrs(
&mut self,
install_jlrs_core: &InstallJlrsCore,
module: Option<Module<'_>>
)
pub fn init_jlrs( &mut self, install_jlrs_core: &InstallJlrsCore, module: Option<Module<'_>> )
This function must be called before jlrs can be used. When the julia_module
macro is
used this function is called automatically.
A module can be provided to allow setting the size of the internal thread pool from Julia
by calling JlrsCore.set_pool_size
.
Trait Implementations§
Auto Trait Implementations§
impl<'context> !RefUnwindSafe for CCall<'context>
impl<'context> !Send for CCall<'context>
impl<'context> !Sync for CCall<'context>
impl<'context> Unpin for CCall<'context>
impl<'context> !UnwindSafe for CCall<'context>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_mut()
into the pipe
function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.