# GstPromise The GstPromise 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 GstPromise is created with `gst_promise_new` by the consumer and passed to the producer to avoid thread safety issues with the change callback. A GstPromise can be replied to with a value (or an error) by the producer with `gst_promise_reply`. The exact value returned is defined by the API contract of the producer and NULL may be a valid reply. `gst_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 `GST_PROMISE_RESULT_EXPIRED` state set by a call to `gst_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 GstBus. A callback can also be installed at GstPromise creation for result changes with `gst_promise_new_with_change_func`. The change callback can be used to chain GstPromise'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 GstPromise starts out with a `GstPromiseResult` of `GST_PROMISE_RESULT_PENDING` and only ever transitions once into one of the other GstPromiseResult's. In order to support multi-threaded code, `gst_promise_reply`, `gst_promise_interrupt` and `gst_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 `gst_promise_reply` and `gst_promise_interrupt` cannot be called after `gst_promise_expire` That `gst_promise_reply` and `gst_promise_interrupt` cannot be called twice. The change function set with `gst_promise_new_with_change_func` is called directly from either the gst_promise_reply, gst_promise_interrupt or gst_promise_expire and can be called from an arbitrary thread. GstPromise using APIs can restrict this to a single thread or a subset of threads but that is entirely up to the API that uses GstPromise.