Struct jlrs::ccall::CCall

source ·
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 ccalled function.

Exceptions must only be thrown indirectly by returning a RustResult.

Implementations§

source§

impl<'context> CCall<'context>

source

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.

source

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.

source

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.

source

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 ccalled functions. The returned data is unrooted and must be returned to Julia immediately.

source

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 ccalled functions. The returned data is unrooted and must be returned to Julia immediately.

source

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 ccalled functions. The returned data is unrooted and must be returned to Julia immediately.

source

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.

source

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 ccalled function that doesn’t need to root any data.

source

pub fn set_pool_size(&self, size: usize)

Set the size of the internal thread pool.

source

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.

source

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§

source§

impl Drop for CCall<'_>

source§

fn drop(&mut self)

Executes the destructor for this type. Read more

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> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> Twhere Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pipe for Twhere T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,

Borrows 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,

Mutably borrows 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,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

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,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> Rwhere Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> Rwhere Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,

Immutable access to the 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,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,

Immutable access to the 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,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .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,

Calls .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,

Calls .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,

Calls .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,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.