Copyright | Will Thompson Iñaki García Etxebarria and Jonas Platte |
---|---|
License | LGPL-2.1 |
Maintainer | Iñaki García Etxebarria (inaki@blueleaf.cc) |
Safe Haskell | None |
Language | Haskell2010 |
As of GLib 2.46, SimpleAsyncResult
is deprecated in favor of
Task
, which provides a simpler API.
SimpleAsyncResult
implements AsyncResult
.
GSimpleAsyncResult handles GAsyncReadyCallbacks
, error
reporting, operation cancellation and the final state of an operation,
completely transparent to the application. Results can be returned
as a pointer e.g. for functions that return data that is collected
asynchronously, a boolean value for checking the success or failure
of an operation, or a gssize
for operations which return the number
of bytes modified by the operation; all of the simple return cases
are covered.
Most of the time, an application will not need to know of the details of this API; it is handled transparently, and any necessary operations are handled by 'GI.Gio.Interfaces.AsyncResult.AsyncResult'\'s interface. However, if implementing a new GIO module, for writing language bindings, or for complex applications that need better control of how asynchronous operations are completed, it is important to understand this functionality.
GSimpleAsyncResults are tagged with the calling function to ensure that asynchronous functions and their finishing functions are used together correctly.
To create a new SimpleAsyncResult
, call simpleAsyncResultNew
.
If the result needs to be created for a GError
, use
simpleAsyncResultNewFromError
or
g_simple_async_result_new_take_error()
. If a GError
is not available
(e.g. the asynchronous operation's doesn't take a GError
argument),
but the result still needs to be created for an error condition, use
g_simple_async_result_new_error()
(or g_simple_async_result_set_error_va()
if your application or binding requires passing a variable argument list
directly), and the error can then be propagated through the use of
simpleAsyncResultPropagateError
.
An asynchronous operation can be made to ignore a cancellation event by
calling simpleAsyncResultSetHandleCancellation
with a
SimpleAsyncResult
for the operation and False
. This is useful for
operations that are dangerous to cancel, such as close (which would
cause a leak if cancelled before being run).
GSimpleAsyncResult can integrate into GLib's event loop, MainLoop
,
or it can use GThreads
.
simpleAsyncResultComplete
will finish an I/O task directly
from the point where it is called. simpleAsyncResultCompleteInIdle
will finish it from an idle handler in the
[thread-default main context][g-main-context-push-thread-default]
where the SimpleAsyncResult
was created.
g_simple_async_result_run_in_thread()
will run the job in a
separate thread and then use
simpleAsyncResultCompleteInIdle
to deliver the result.
To set the results of an asynchronous function,
g_simple_async_result_set_op_res_gpointer()
,
simpleAsyncResultSetOpResGboolean
, and
simpleAsyncResultSetOpResGssize
are provided, setting the operation's result to a gpointer, gboolean, or
gssize, respectively.
Likewise, to get the result of an asynchronous function,
g_simple_async_result_get_op_res_gpointer()
,
simpleAsyncResultGetOpResGboolean
, and
simpleAsyncResultGetOpResGssize
are
provided, getting the operation's result as a gpointer, gboolean, and
gssize, respectively.
For the details of the requirements implementations must respect, see
AsyncResult
. A typical implementation of an asynchronous operation
using GSimpleAsyncResult looks something like this:
C code
static void baked_cb (Cake *cake, gpointer user_data) { // In this example, this callback is not given a reference to the cake, // so the GSimpleAsyncResult has to take a reference to it. GSimpleAsyncResult *result = user_data; if (cake == NULL) g_simple_async_result_set_error (result, BAKER_ERRORS, BAKER_ERROR_NO_FLOUR, "Go to the supermarket"); else g_simple_async_result_set_op_res_gpointer (result, g_object_ref (cake), g_object_unref); // In this example, we assume that baked_cb is called as a callback from // the mainloop, so it's safe to complete the operation synchronously here. // If, however, _baker_prepare_cake () might call its callback without // first returning to the mainloop — inadvisable, but some APIs do so — // we would need to use g_simple_async_result_complete_in_idle(). g_simple_async_result_complete (result); g_object_unref (result); } void baker_bake_cake_async (Baker *self, guint radius, GAsyncReadyCallback callback, gpointer user_data) { GSimpleAsyncResult *simple; Cake *cake; if (radius < 3) { g_simple_async_report_error_in_idle (G_OBJECT (self), callback, user_data, BAKER_ERRORS, BAKER_ERROR_TOO_SMALL, "%ucm radius cakes are silly", radius); return; } simple = g_simple_async_result_new (G_OBJECT (self), callback, user_data, baker_bake_cake_async); cake = _baker_get_cached_cake (self, radius); if (cake != NULL) { g_simple_async_result_set_op_res_gpointer (simple, g_object_ref (cake), g_object_unref); g_simple_async_result_complete_in_idle (simple); g_object_unref (simple); // Drop the reference returned by _baker_get_cached_cake(); // the GSimpleAsyncResult has taken its own reference. g_object_unref (cake); return; } _baker_prepare_cake (self, radius, baked_cb, simple); } Cake * baker_bake_cake_finish (Baker *self, GAsyncResult *result, GError **error) { GSimpleAsyncResult *simple; Cake *cake; g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self), baker_bake_cake_async), NULL); simple = (GSimpleAsyncResult *) result; if (g_simple_async_result_propagate_error (simple, error)) return NULL; cake = CAKE (g_simple_async_result_get_op_res_gpointer (simple)); return g_object_ref (cake); }
Synopsis
- newtype SimpleAsyncResult = SimpleAsyncResult (ManagedPtr SimpleAsyncResult)
- class (GObject o, IsDescendantOf SimpleAsyncResult o) => IsSimpleAsyncResult o
- toSimpleAsyncResult :: (MonadIO m, IsSimpleAsyncResult o) => o -> m SimpleAsyncResult
- noSimpleAsyncResult :: Maybe SimpleAsyncResult
- simpleAsyncResultComplete :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> m ()
- simpleAsyncResultCompleteInIdle :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> m ()
- simpleAsyncResultGetOpResGboolean :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> m Bool
- simpleAsyncResultGetOpResGssize :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> m Int64
- simpleAsyncResultIsValid :: (HasCallStack, MonadIO m, IsAsyncResult a, IsObject b) => a -> Maybe b -> Ptr () -> m Bool
- simpleAsyncResultNew :: (HasCallStack, MonadIO m, IsObject a) => Maybe a -> Maybe AsyncReadyCallback -> Ptr () -> m SimpleAsyncResult
- simpleAsyncResultNewFromError :: (HasCallStack, MonadIO m, IsObject a) => Maybe a -> Maybe AsyncReadyCallback -> GError -> m SimpleAsyncResult
- simpleAsyncResultPropagateError :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> m ()
- simpleAsyncResultSetCheckCancellable :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a, IsCancellable b) => a -> Maybe b -> m ()
- simpleAsyncResultSetFromError :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> GError -> m ()
- simpleAsyncResultSetHandleCancellation :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> Bool -> m ()
- simpleAsyncResultSetOpResGboolean :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> Bool -> m ()
- simpleAsyncResultSetOpResGssize :: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) => a -> Int64 -> m ()
Exported types
newtype SimpleAsyncResult Source #
Memory-managed wrapper type.
Instances
GObject SimpleAsyncResult Source # | |
Defined in GI.Gio.Objects.SimpleAsyncResult gobjectType :: IO GType # | |
HasParentTypes SimpleAsyncResult Source # | |
Defined in GI.Gio.Objects.SimpleAsyncResult | |
type ParentTypes SimpleAsyncResult Source # | |
Defined in GI.Gio.Objects.SimpleAsyncResult |
class (GObject o, IsDescendantOf SimpleAsyncResult o) => IsSimpleAsyncResult o Source #
Type class for types which can be safely cast to SimpleAsyncResult
, for instance with toSimpleAsyncResult
.
Instances
(GObject o, IsDescendantOf SimpleAsyncResult o) => IsSimpleAsyncResult o Source # | |
Defined in GI.Gio.Objects.SimpleAsyncResult |
toSimpleAsyncResult :: (MonadIO m, IsSimpleAsyncResult o) => o -> m SimpleAsyncResult Source #
Cast to SimpleAsyncResult
, for types for which this is known to be safe. For general casts, use castTo
.
noSimpleAsyncResult :: Maybe SimpleAsyncResult Source #
A convenience alias for Nothing
:: Maybe
SimpleAsyncResult
.
Methods
complete
simpleAsyncResultComplete Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> m () |
Deprecated: (Since version 2.46)Use Task
instead.
Completes an asynchronous I/O job immediately. Must be called in
the thread where the asynchronous result was to be delivered, as it
invokes the callback directly. If you are in a different thread use
simpleAsyncResultCompleteInIdle
.
Calling this function takes a reference to simple
for as long as
is needed to complete the call.
completeInIdle
simpleAsyncResultCompleteInIdle Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> m () |
Deprecated: (Since version 2.46)Use Task
instead.
Completes an asynchronous function in an idle handler in the
[thread-default main context][g-main-context-push-thread-default]
of the thread that simple
was initially created in
(and re-pushes that context around the invocation of the callback).
Calling this function takes a reference to simple
for as long as
is needed to complete the call.
getOpResGboolean
simpleAsyncResultGetOpResGboolean Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> m Bool | Returns: |
Deprecated: (Since version 2.46)Use Task
and taskPropagateBoolean
instead.
Gets the operation result boolean from within the asynchronous result.
getOpResGssize
simpleAsyncResultGetOpResGssize Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> m Int64 | Returns: a gssize returned from the asynchronous function. |
Deprecated: (Since version 2.46)Use Task
and taskPropagateInt
instead.
Gets a gssize from the asynchronous result.
isValid
simpleAsyncResultIsValid Source #
:: (HasCallStack, MonadIO m, IsAsyncResult a, IsObject b) | |
=> a |
|
-> Maybe b |
|
-> Ptr () |
|
-> m Bool | Returns: |
Deprecated: (Since version 2.46)Use Task
and taskIsValid
instead.
Ensures that the data passed to the _finish function of an async operation is consistent. Three checks are performed.
First, result
is checked to ensure that it is really a
SimpleAsyncResult
. Second, source
is checked to ensure that it
matches the source object of result
. Third, sourceTag
is
checked to ensure that it is equal to the sourceTag
argument given
to simpleAsyncResultNew
(which, by convention, is a pointer
to the _async function corresponding to the _finish function from
which this function is called). (Alternatively, if either
sourceTag
or result
's source tag is Nothing
, then the source tag
check is skipped.)
Since: 2.20
new
:: (HasCallStack, MonadIO m, IsObject a) | |
=> Maybe a | |
-> Maybe AsyncReadyCallback |
|
-> Ptr () |
|
-> m SimpleAsyncResult | Returns: a |
Deprecated: (Since version 2.46)Use taskNew
instead.
Creates a SimpleAsyncResult
.
The common convention is to create the SimpleAsyncResult
in the
function that starts the asynchronous operation and use that same
function as the sourceTag
.
If your operation supports cancellation with Cancellable
(which it
probably should) then you should provide the user's cancellable to
simpleAsyncResultSetCheckCancellable
immediately after
this function returns.
newFromError
simpleAsyncResultNewFromError Source #
:: (HasCallStack, MonadIO m, IsObject a) | |
=> Maybe a | |
-> Maybe AsyncReadyCallback |
|
-> GError |
|
-> m SimpleAsyncResult | Returns: a |
Deprecated: (Since version 2.46)Use taskNew
and taskReturnError
instead.
Creates a SimpleAsyncResult
from an error condition.
propagateError
simpleAsyncResultPropagateError Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> m () | (Can throw |
Deprecated: (Since version 2.46)Use Task
instead.
Propagates an error from within the simple asynchronous result to a given destination.
If the Cancellable
given to a prior call to
simpleAsyncResultSetCheckCancellable
is cancelled then this
function will return True
with dest
set appropriately.
setCheckCancellable
simpleAsyncResultSetCheckCancellable Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a, IsCancellable b) | |
=> a |
|
-> Maybe b |
|
-> m () |
Deprecated: (Since version 2.46)Use Task
instead.
Sets a Cancellable
to check before dispatching results.
This function has one very specific purpose: the provided cancellable
is checked at the time of simpleAsyncResultPropagateError
If
it is cancelled, these functions will return an "Operation was
cancelled" error (IOErrorEnumCancelled
).
Implementors of cancellable asynchronous functions should use this in order to provide a guarantee to their callers that cancelling an async operation will reliably result in an error being returned for that operation (even if a positive result for the operation has already been sent as an idle to the main context to be dispatched).
The checking described above is done regardless of any call to the
unrelated simpleAsyncResultSetHandleCancellation
function.
Since: 2.32
setFromError
simpleAsyncResultSetFromError Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> GError |
|
-> m () |
Deprecated: (Since version 2.46)Use Task
and taskReturnError
instead.
Sets the result from a GError
.
setHandleCancellation
simpleAsyncResultSetHandleCancellation Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> Bool |
|
-> m () |
Deprecated: (Since version 2.46)
Sets whether to handle cancellation within the asynchronous operation.
This function has nothing to do with
simpleAsyncResultSetCheckCancellable
. It only refers to the
Cancellable
passed to g_simple_async_result_run_in_thread()
.
setOpResGboolean
simpleAsyncResultSetOpResGboolean Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> Bool |
|
-> m () |
Deprecated: (Since version 2.46)Use Task
and taskReturnBoolean
instead.
Sets the operation result to a boolean within the asynchronous result.
setOpResGssize
simpleAsyncResultSetOpResGssize Source #
:: (HasCallStack, MonadIO m, IsSimpleAsyncResult a) | |
=> a |
|
-> Int64 |
|
-> m () |
Deprecated: (Since version 2.46)Use Task
and taskReturnInt
instead.
Sets the operation result within the asynchronous result to
the given opRes
.