#ifndef AWS_IO_CHANNEL_H
#define AWS_IO_CHANNEL_H
#include <aws/io/io.h>
#include <aws/common/statistics.h>
#include <aws/common/task_scheduler.h>
enum aws_channel_direction {
AWS_CHANNEL_DIR_READ,
AWS_CHANNEL_DIR_WRITE,
};
struct aws_channel;
struct aws_channel_slot;
struct aws_channel_handler;
struct aws_event_loop;
struct aws_event_loop_local_object;
typedef void(aws_channel_on_setup_completed_fn)(struct aws_channel *channel, int error_code, void *user_data);
typedef void(aws_channel_on_shutdown_completed_fn)(struct aws_channel *channel, int error_code, void *user_data);
struct aws_channel_slot {
struct aws_allocator *alloc;
struct aws_channel *channel;
struct aws_channel_slot *adj_left;
struct aws_channel_slot *adj_right;
struct aws_channel_handler *handler;
size_t window_size;
size_t upstream_message_overhead;
size_t current_window_update_batch_size;
};
struct aws_channel_task;
typedef void(aws_channel_task_fn)(struct aws_channel_task *channel_task, void *arg, enum aws_task_status status);
struct aws_channel_task {
struct aws_task wrapper_task;
aws_channel_task_fn *task_fn;
void *arg;
const char *type_tag;
struct aws_linked_list_node node;
};
struct aws_channel_handler_vtable {
int (*process_read_message)(
struct aws_channel_handler *handler,
struct aws_channel_slot *slot,
struct aws_io_message *message);
int (*process_write_message)(
struct aws_channel_handler *handler,
struct aws_channel_slot *slot,
struct aws_io_message *message);
int (*increment_read_window)(struct aws_channel_handler *handler, struct aws_channel_slot *slot, size_t size);
int (*shutdown)(
struct aws_channel_handler *handler,
struct aws_channel_slot *slot,
enum aws_channel_direction dir,
int error_code,
bool free_scarce_resources_immediately);
size_t (*initial_window_size)(struct aws_channel_handler *handler);
size_t (*message_overhead)(struct aws_channel_handler *handler);
void (*destroy)(struct aws_channel_handler *handler);
void (*reset_statistics)(struct aws_channel_handler *handler);
void (*gather_statistics)(struct aws_channel_handler *handler, struct aws_array_list *stats_list);
void (*trigger_read)(struct aws_channel_handler *handler);
};
struct aws_channel_handler {
struct aws_channel_handler_vtable *vtable;
struct aws_allocator *alloc;
struct aws_channel_slot *slot;
void *impl;
};
struct aws_channel_options {
struct aws_event_loop *event_loop;
aws_channel_on_setup_completed_fn *on_setup_completed;
aws_channel_on_shutdown_completed_fn *on_shutdown_completed;
void *setup_user_data;
void *shutdown_user_data;
bool enable_read_back_pressure;
};
AWS_EXTERN_C_BEGIN
extern AWS_IO_API size_t g_aws_channel_max_fragment_size;
AWS_IO_API
void aws_channel_task_init(
struct aws_channel_task *channel_task,
aws_channel_task_fn *task_fn,
void *arg,
const char *type_tag);
AWS_IO_API
struct aws_channel *aws_channel_new(struct aws_allocator *allocator, const struct aws_channel_options *creation_args);
AWS_IO_API
void aws_channel_destroy(struct aws_channel *channel);
AWS_IO_API
int aws_channel_shutdown(struct aws_channel *channel, int error_code);
AWS_IO_API
void aws_channel_acquire_hold(struct aws_channel *channel);
AWS_IO_API
void aws_channel_release_hold(struct aws_channel *channel);
AWS_IO_API
struct aws_channel_slot *aws_channel_slot_new(struct aws_channel *channel);
AWS_IO_API
struct aws_event_loop *aws_channel_get_event_loop(struct aws_channel *channel);
AWS_IO_API
int aws_channel_current_clock_time(struct aws_channel *channel, uint64_t *time_nanos);
AWS_IO_API
int aws_channel_fetch_local_object(
struct aws_channel *channel,
const void *key,
struct aws_event_loop_local_object *obj);
AWS_IO_API
int aws_channel_put_local_object(
struct aws_channel *channel,
const void *key,
const struct aws_event_loop_local_object *obj);
AWS_IO_API
int aws_channel_remove_local_object(
struct aws_channel *channel,
const void *key,
struct aws_event_loop_local_object *removed_obj);
AWS_IO_API
struct aws_io_message *aws_channel_acquire_message_from_pool(
struct aws_channel *channel,
enum aws_io_message_type message_type,
size_t size_hint);
AWS_IO_API
void aws_channel_schedule_task_now(struct aws_channel *channel, struct aws_channel_task *task);
AWS_IO_API
void aws_channel_schedule_task_now_serialized(struct aws_channel *channel, struct aws_channel_task *task);
AWS_IO_API
void aws_channel_schedule_task_future(
struct aws_channel *channel,
struct aws_channel_task *task,
uint64_t run_at_nanos);
AWS_IO_API
int aws_channel_set_statistics_handler(struct aws_channel *channel, struct aws_crt_statistics_handler *handler);
AWS_IO_API
bool aws_channel_thread_is_callers_thread(struct aws_channel *channel);
AWS_IO_API
int aws_channel_slot_set_handler(struct aws_channel_slot *slot, struct aws_channel_handler *handler);
AWS_IO_API
int aws_channel_slot_remove(struct aws_channel_slot *slot);
AWS_IO_API
int aws_channel_slot_replace(struct aws_channel_slot *remove, struct aws_channel_slot *new_slot);
AWS_IO_API
int aws_channel_slot_insert_right(struct aws_channel_slot *slot, struct aws_channel_slot *to_add);
AWS_IO_API
int aws_channel_slot_insert_end(struct aws_channel *channel, struct aws_channel_slot *to_add);
AWS_IO_API
int aws_channel_slot_insert_left(struct aws_channel_slot *slot, struct aws_channel_slot *to_add);
AWS_IO_API
int aws_channel_slot_send_message(
struct aws_channel_slot *slot,
struct aws_io_message *message,
enum aws_channel_direction dir);
AWS_IO_API
struct aws_io_message *aws_channel_slot_acquire_max_message_for_write(struct aws_channel_slot *slot);
AWS_IO_API
int aws_channel_slot_increment_read_window(struct aws_channel_slot *slot, size_t window);
AWS_IO_API
int aws_channel_slot_on_handler_shutdown_complete(
struct aws_channel_slot *slot,
enum aws_channel_direction dir,
int err_code,
bool free_scarce_resources_immediately);
AWS_IO_API
int aws_channel_slot_shutdown(
struct aws_channel_slot *slot,
enum aws_channel_direction dir,
int err_code,
bool free_scarce_resources_immediately);
AWS_IO_API
size_t aws_channel_slot_downstream_read_window(struct aws_channel_slot *slot);
AWS_IO_API
size_t aws_channel_slot_upstream_message_overhead(struct aws_channel_slot *slot);
AWS_IO_API
void aws_channel_handler_destroy(struct aws_channel_handler *handler);
AWS_IO_API
int aws_channel_handler_process_read_message(
struct aws_channel_handler *handler,
struct aws_channel_slot *slot,
struct aws_io_message *message);
AWS_IO_API
int aws_channel_handler_process_write_message(
struct aws_channel_handler *handler,
struct aws_channel_slot *slot,
struct aws_io_message *message);
AWS_IO_API
int aws_channel_handler_increment_read_window(
struct aws_channel_handler *handler,
struct aws_channel_slot *slot,
size_t size);
AWS_IO_API
int aws_channel_handler_shutdown(
struct aws_channel_handler *handler,
struct aws_channel_slot *slot,
enum aws_channel_direction dir,
int error_code,
bool free_scarce_resources_immediately);
AWS_IO_API
size_t aws_channel_handler_initial_window_size(struct aws_channel_handler *handler);
AWS_IO_API
struct aws_channel_slot *aws_channel_get_first_slot(struct aws_channel *channel);
AWS_IO_API
int aws_channel_trigger_read(struct aws_channel *channel);
AWS_EXTERN_C_END
#endif