diff options
Diffstat (limited to 'src/backend/storage/aio/aio_target.c')
-rw-r--r-- | src/backend/storage/aio/aio_target.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/backend/storage/aio/aio_target.c b/src/backend/storage/aio/aio_target.c new file mode 100644 index 00000000000..b01406a6a52 --- /dev/null +++ b/src/backend/storage/aio/aio_target.c @@ -0,0 +1,114 @@ +/*------------------------------------------------------------------------- + * + * aio_target.c + * AIO - Functionality related to executing IO for different targets + * + * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * IDENTIFICATION + * src/backend/storage/aio/aio_target.c + * + *------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "storage/aio.h" +#include "storage/aio_internal.h" + + +/* + * Registry for entities that can be the target of AIO. + */ +static const PgAioTargetInfo *pgaio_target_info[] = { + [PGAIO_TID_INVALID] = &(PgAioTargetInfo) { + .name = "invalid", + }, +}; + + + +/* -------------------------------------------------------------------------------- + * Public target related functions operating on IO Handles + * -------------------------------------------------------------------------------- + */ + +bool +pgaio_io_has_target(PgAioHandle *ioh) +{ + return ioh->target != PGAIO_TID_INVALID; +} + +/* + * Return the name for the target associated with the IO. Mostly useful for + * debugging/logging. + */ +const char * +pgaio_io_get_target_name(PgAioHandle *ioh) +{ + Assert(ioh->target >= 0 && ioh->target < PGAIO_TID_COUNT); + + return pgaio_target_info[ioh->target]->name; +} + +/* + * Assign a target to the IO. + * + * This has to be called exactly once before pgaio_io_prep_*() is called. + */ +void +pgaio_io_set_target(PgAioHandle *ioh, PgAioTargetID targetid) +{ + Assert(ioh->state == PGAIO_HS_HANDED_OUT); + Assert(ioh->target == PGAIO_TID_INVALID); + + ioh->target = targetid; +} + +PgAioTargetData * +pgaio_io_get_target_data(PgAioHandle *ioh) +{ + return &ioh->target_data; +} + +/* + * Return a stringified description of the IO's target. + * + * The string is localized and allocated in the current memory context. + */ +char * +pgaio_io_get_target_description(PgAioHandle *ioh) +{ + return pgaio_target_info[ioh->target]->describe_identity(&ioh->target_data); +} + + + +/* -------------------------------------------------------------------------------- + * Internal target related functions operating on IO Handles + * -------------------------------------------------------------------------------- + */ + +/* + * Internal: Check if pgaio_io_reopen() is available for the IO. + */ +bool +pgaio_io_can_reopen(PgAioHandle *ioh) +{ + return pgaio_target_info[ioh->target]->reopen != NULL; +} + +/* + * Internal: Before executing an IO outside of the context of the process the + * IO has been prepared in, the file descriptor has to be reopened - any FD + * referenced in the IO itself, won't be valid in the separate process. + */ +void +pgaio_io_reopen(PgAioHandle *ioh) +{ + Assert(ioh->target >= 0 && ioh->target < PGAIO_TID_COUNT); + Assert(ioh->op >= 0 && ioh->op < PGAIO_OP_COUNT); + + pgaio_target_info[ioh->target]->reopen(ioh); +} |