| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #pragma once |
| |
| #include <zircon/compiler.h> |
| #include <zircon/syscalls/port.h> |
| #include <zircon/types.h> |
| |
| __BEGIN_CDECLS |
| |
| // Dispatcher interface for performing asynchronous operations. |
| // There may be multiple implementations of this interface. |
| typedef struct async_dispatcher async_t; |
| |
| // Forward declarations for asynchronous operation structures. |
| typedef struct async_wait async_wait_t; |
| typedef struct async_task async_task_t; |
| typedef struct async_receiver async_receiver_t; |
| |
| // Private state owned by the asynchronous dispatcher. |
| // Clients should initialize the contents of this structure to zero using |
| // |ASYNC_STATE_INIT| or with calloc, memset, or a similar means. |
| typedef struct { |
| uintptr_t reserved[2]; |
| } async_state_t; |
| |
| #define ASYNC_STATE_INIT \ |
| { 0u, 0u } |
| |
| // Flags for asynchronous operations. |
| enum { |
| // Asks the dispatcher to notify the handler when the dispatcher itself |
| // is being shut down so that the handler can release its resources. |
| // |
| // The dispatcher will invoke the handler with a status of |
| // |ZX_ERR_CANCELED| to indicate that it is being shut down. |
| // |
| // This flag only applies to pending waits and tasks; receivers will |
| // not be notified of shutdown. |
| ASYNC_FLAG_HANDLE_SHUTDOWN = 1 << 0, |
| }; |
| |
| // Asynchronous dispatcher interface. |
| // |
| // Clients should prefer using the |async_*| inline functions declared in the |
| // other header files. See the documentation of those inline functions for |
| // details about each method's purpose and behavior. |
| // |
| // This interface consists of three groups of methods: |
| // |
| // - Waiting for signals: |begin_wait|, |cancel_wait| |
| // - Posting tasks: |post_task|, |cancel_task| |
| // - Queuing packets: |queue_packet| |
| // |
| // Implementations of this interface are not required to support all of these methods. |
| // Unsupported methods must have valid (non-null) function pointers, must have |
| // no side-effects, and must return |ZX_ERR_NOT_SUPPORTED| when called. |
| // Furthermore, if an implementation supports one method of a group, such as |begin_wait|, |
| // it must also support the other methods of the group, such as |cancel_wait|. |
| // |
| // Many clients assume that the dispatcher interface is fully implemented and may |
| // fail to work with dispatchers that do not support the methods they need. |
| // Therefore general-purpose dispatcher implementations are strongly encouraged to |
| // support the whole interface to ensure broad compatibility. |
| typedef struct async_ops { |
| zx_status_t (*begin_wait)(async_t* async, async_wait_t* wait); |
| zx_status_t (*cancel_wait)(async_t* async, async_wait_t* wait); |
| zx_status_t (*post_task)(async_t* async, async_task_t* task); |
| zx_status_t (*cancel_task)(async_t* async, async_task_t* task); |
| zx_status_t (*queue_packet)(async_t* async, async_receiver_t* receiver, |
| const zx_packet_user_t* data); |
| } async_ops_t; |
| struct async_dispatcher { |
| const async_ops_t* ops; |
| }; |
| |
| __END_CDECLS |