[−][src]Struct gstreamer::promise::Promise
The Promise object implements the container for values that may
be available later. i.e. a Future or a Promise in
https://en.wikipedia.org/wiki/Futures_and_promises.
As with all Future/Promise-like functionality, there is the concept of the
producer of the value and the consumer of the value.
A Promise is created with Promise::new by the consumer and passed
to the producer to avoid thread safety issues with the change callback.
A Promise can be replied to with a value (or an error) by the producer
with Promise::reply. The exact value returned is defined by the API
contract of the producer and None may be a valid reply.
Promise::interrupt is for the consumer to
indicate to the producer that the value is not needed anymore and producing
that value can stop. The PromiseResult::Expired state set by a call
to Promise::expire indicates to the consumer that a value will never
be produced and is intended to be called by a third party that implements
some notion of message handling such as Bus.
A callback can also be installed at Promise creation for
result changes with Promise::new_with_change_func.
The change callback can be used to chain GstPromises's together as in the
following example.
const GstStructure *reply;
GstPromise *p;
if (gst_promise_wait (promise) != GST_PROMISE_RESULT_REPLIED)
return; // interrupted or expired value
reply = gst_promise_get_reply (promise);
if (error in reply)
return; // propagate error
p = gst_promise_new_with_change_func (another_promise_change_func, user_data, notify);
pass p to promise-using API
Each Promise starts out with a PromiseResult of
PromiseResult::Pending and only ever transitions once
into one of the other PromiseResult's.
In order to support multi-threaded code, Promise::reply,
Promise::interrupt and Promise::expire may all be from
different threads with some restrictions and the final result of the promise
is whichever call is made first. There are two restrictions on ordering:
- That
Promise::replyandPromise::interruptcannot be called afterPromise::expire - That
Promise::replyandPromise::interruptcannot be called twice.
The change function set with Promise::new_with_change_func is
called directly from either the Promise::reply,
Promise::interrupt or Promise::expire and can be called
from an arbitrary thread. Promise using APIs can restrict this to
a single thread or a subset of threads but that is entirely up to the API
that uses Promise.
Feature: v1_14
Implementations
impl Promise[src]
pub fn new() -> Promise[src]
pub fn with_change_func<F>(func: F) -> Promise where
F: FnOnce(Result<Option<&StructureRef>, PromiseError>) + Send + 'static, [src]
F: FnOnce(Result<Option<&StructureRef>, PromiseError>) + Send + 'static,
pub fn new_future<'a>() -> (Self, PromiseFuture<'a>)[src]
pub fn expire(&self)[src]
Expire a self. This will wake up any waiters with
PromiseResult::Expired. Called by a message loop when the parent
message is handled and/or destroyed (possibly unanswered).
Feature: v1_14
pub fn get_reply(&self) -> Option<&StructureRef>[src]
Retrieve the reply set on self. self must be in
PromiseResult::Replied and the returned structure is owned by self
Feature: v1_14
Returns
The reply set on self
pub fn interrupt(&self)[src]
Interrupt waiting for a self. This will wake up any waiters with
PromiseResult::Interrupted. Called when the consumer does not want
the value produced anymore.
Feature: v1_14
pub fn reply(&self, s: Option<Structure>)[src]
Set a reply on self. This will wake up any waiters with
PromiseResult::Replied. Called by the producer of the value to
indicate success (or failure).
If self has already been interrupted by the consumer, then this reply
is not visible to the consumer.
Feature: v1_14
s
a Structure with the the reply contents
pub fn wait(&self) -> PromiseResult[src]
Wait for self to move out of the PromiseResult::Pending state.
If self is not in PromiseResult::Pending then it will return
immediately with the current result.
Feature: v1_14
Returns
the result of the promise
Trait Implementations
impl Clone for Promise[src]
impl Debug for Promise[src]
impl Default for Promise[src]
impl Eq for Promise[src]
impl Hash for Promise[src]
fn hash<__H: Hasher>(&self, state: &mut __H)[src]
fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher, 1.3.0[src]
H: Hasher,
impl Ord for Promise[src]
fn cmp(&self, other: &Promise) -> Ordering[src]
#[must_use]fn max(self, other: Self) -> Self1.21.0[src]
#[must_use]fn min(self, other: Self) -> Self1.21.0[src]
#[must_use]fn clamp(self, min: Self, max: Self) -> Self[src]
impl PartialEq<Promise> for Promise[src]
impl PartialOrd<Promise> for Promise[src]
fn partial_cmp(&self, other: &Promise) -> Option<Ordering>[src]
fn lt(&self, other: &Promise) -> bool[src]
fn le(&self, other: &Promise) -> bool[src]
fn gt(&self, other: &Promise) -> bool[src]
fn ge(&self, other: &Promise) -> bool[src]
impl Send for Promise[src]
impl StaticType for Promise[src]
fn static_type() -> Type[src]
impl StructuralEq for Promise[src]
impl StructuralPartialEq for Promise[src]
impl Sync for Promise[src]
Auto Trait Implementations
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<'a, T> ToGlibContainerFromSlice<'a, *const GList> for T where
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>, [src]
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>,
type Storage = (Option<List>, Vec<Stash<'a, <T as GlibPtrDefault>::GlibType, T>>)
fn to_glib_none_from_slice(
t: &'a [T]
) -> (*const GList, <T as ToGlibContainerFromSlice<'a, *const GList>>::Storage)[src]
t: &'a [T]
) -> (*const GList, <T as ToGlibContainerFromSlice<'a, *const GList>>::Storage)
fn to_glib_container_from_slice(
_t: &'a [T]
) -> (*const GList, <T as ToGlibContainerFromSlice<'a, *const GList>>::Storage)[src]
_t: &'a [T]
) -> (*const GList, <T as ToGlibContainerFromSlice<'a, *const GList>>::Storage)
fn to_glib_full_from_slice(_t: &[T]) -> *const GList[src]
impl<'a, T> ToGlibContainerFromSlice<'a, *const GPtrArray> for T where
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>, [src]
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>,
type Storage = (Option<PtrArray>, Vec<Stash<'a, <T as GlibPtrDefault>::GlibType, T>>)
fn to_glib_none_from_slice(
t: &'a [T]
) -> (*const GPtrArray, <T as ToGlibContainerFromSlice<'a, *const GPtrArray>>::Storage)[src]
t: &'a [T]
) -> (*const GPtrArray, <T as ToGlibContainerFromSlice<'a, *const GPtrArray>>::Storage)
fn to_glib_container_from_slice(
_t: &'a [T]
) -> (*const GPtrArray, <T as ToGlibContainerFromSlice<'a, *const GPtrArray>>::Storage)[src]
_t: &'a [T]
) -> (*const GPtrArray, <T as ToGlibContainerFromSlice<'a, *const GPtrArray>>::Storage)
fn to_glib_full_from_slice(_t: &[T]) -> *const GPtrArray[src]
impl<'a, T> ToGlibContainerFromSlice<'a, *mut GArray> for T where
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>, [src]
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>,
type Storage = (Option<Array>, Vec<Stash<'a, <T as GlibPtrDefault>::GlibType, T>>)
fn to_glib_none_from_slice(
t: &'a [T]
) -> (*mut GArray, <T as ToGlibContainerFromSlice<'a, *mut GArray>>::Storage)[src]
t: &'a [T]
) -> (*mut GArray, <T as ToGlibContainerFromSlice<'a, *mut GArray>>::Storage)
fn to_glib_container_from_slice(
t: &'a [T]
) -> (*mut GArray, <T as ToGlibContainerFromSlice<'a, *mut GArray>>::Storage)[src]
t: &'a [T]
) -> (*mut GArray, <T as ToGlibContainerFromSlice<'a, *mut GArray>>::Storage)
fn to_glib_full_from_slice(t: &[T]) -> *mut GArray[src]
impl<'a, T> ToGlibContainerFromSlice<'a, *mut GList> for T where
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>, [src]
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>,
type Storage = (Option<List>, Vec<Stash<'a, <T as GlibPtrDefault>::GlibType, T>>)
fn to_glib_none_from_slice(
t: &'a [T]
) -> (*mut GList, <T as ToGlibContainerFromSlice<'a, *mut GList>>::Storage)[src]
t: &'a [T]
) -> (*mut GList, <T as ToGlibContainerFromSlice<'a, *mut GList>>::Storage)
fn to_glib_container_from_slice(
t: &'a [T]
) -> (*mut GList, <T as ToGlibContainerFromSlice<'a, *mut GList>>::Storage)[src]
t: &'a [T]
) -> (*mut GList, <T as ToGlibContainerFromSlice<'a, *mut GList>>::Storage)
fn to_glib_full_from_slice(t: &[T]) -> *mut GList[src]
impl<'a, T> ToGlibContainerFromSlice<'a, *mut GPtrArray> for T where
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>, [src]
T: GlibPtrDefault + ToGlibPtr<'a, <T as GlibPtrDefault>::GlibType>,
type Storage = (Option<PtrArray>, Vec<Stash<'a, <T as GlibPtrDefault>::GlibType, T>>)
fn to_glib_none_from_slice(
t: &'a [T]
) -> (*mut GPtrArray, <T as ToGlibContainerFromSlice<'a, *mut GPtrArray>>::Storage)[src]
t: &'a [T]
) -> (*mut GPtrArray, <T as ToGlibContainerFromSlice<'a, *mut GPtrArray>>::Storage)
fn to_glib_container_from_slice(
t: &'a [T]
) -> (*mut GPtrArray, <T as ToGlibContainerFromSlice<'a, *mut GPtrArray>>::Storage)[src]
t: &'a [T]
) -> (*mut GPtrArray, <T as ToGlibContainerFromSlice<'a, *mut GPtrArray>>::Storage)
fn to_glib_full_from_slice(t: &[T]) -> *mut GPtrArray[src]
impl<T> ToOwned for T where
T: Clone, [src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T[src]
fn clone_into(&self, target: &mut T)[src]
impl<T> ToSendValue for T where
T: ToValue + SetValue + Send + ?Sized, [src]
T: ToValue + SetValue + Send + ?Sized,
fn to_send_value(&self) -> SendValue[src]
impl<T> ToValue for T where
T: SetValue + ?Sized, [src]
T: SetValue + ?Sized,
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,