diff options
Diffstat (limited to 'src/backend/storage/file/fd.c')
-rw-r--r-- | src/backend/storage/file/fd.c | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index b884df71bf6..f691ba09321 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -99,7 +99,7 @@ #include "storage/ipc.h" #include "utils/guc.h" #include "utils/guc_hooks.h" -#include "utils/resowner_private.h" +#include "utils/resowner.h" #include "utils/varlena.h" /* Define PG_FLUSH_DATA_WORKS if we have an implementation for pg_flush_data */ @@ -354,6 +354,31 @@ static void unlink_if_exists_fname(const char *fname, bool isdir, int elevel); static int fsync_parent_path(const char *fname, int elevel); +/* ResourceOwner callbacks to hold virtual file descriptors */ +static void ResOwnerReleaseFile(Datum res); +static char *ResOwnerPrintFile(Datum res); + +static const ResourceOwnerDesc file_resowner_desc = +{ + .name = "File", + .release_phase = RESOURCE_RELEASE_AFTER_LOCKS, + .release_priority = RELEASE_PRIO_FILES, + .ReleaseResource = ResOwnerReleaseFile, + .DebugPrint = ResOwnerPrintFile +}; + +/* Convenience wrappers over ResourceOwnerRemember/Forget */ +static inline void +ResourceOwnerRememberFile(ResourceOwner owner, File file) +{ + ResourceOwnerRemember(owner, Int32GetDatum(file), &file_resowner_desc); +} +static inline void +ResourceOwnerForgetFile(ResourceOwner owner, File file) +{ + ResourceOwnerForget(owner, Int32GetDatum(file), &file_resowner_desc); +} + /* * pg_fsync --- do fsync with or without writethrough */ @@ -1492,7 +1517,7 @@ ReportTemporaryFileUsage(const char *path, off_t size) /* * Called to register a temporary file for automatic close. - * ResourceOwnerEnlargeFiles(CurrentResourceOwner) must have been called + * ResourceOwnerEnlarge(CurrentResourceOwner) must have been called * before the file was opened. */ static void @@ -1684,7 +1709,7 @@ OpenTemporaryFile(bool interXact) * open it, if we'll be registering it below. */ if (!interXact) - ResourceOwnerEnlargeFiles(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); /* * If some temp tablespace(s) have been given to us, try to use the next @@ -1816,7 +1841,7 @@ PathNameCreateTemporaryFile(const char *path, bool error_on_failure) Assert(temporary_files_allowed); /* check temp file access is up */ - ResourceOwnerEnlargeFiles(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); /* * Open the file. Note: we don't use O_EXCL, in case there is an orphaned @@ -1856,7 +1881,7 @@ PathNameOpenTemporaryFile(const char *path, int mode) Assert(temporary_files_allowed); /* check temp file access is up */ - ResourceOwnerEnlargeFiles(CurrentResourceOwner); + ResourceOwnerEnlarge(CurrentResourceOwner); file = PathNameOpenFile(path, mode | PG_BINARY); @@ -3972,3 +3997,25 @@ assign_debug_io_direct(const char *newval, void *extra) io_direct_flags = *flags; } + +/* ResourceOwner callbacks */ + +static void +ResOwnerReleaseFile(Datum res) +{ + File file = (File) DatumGetInt32(res); + Vfd *vfdP; + + Assert(FileIsValid(file)); + + vfdP = &VfdCache[file]; + vfdP->resowner = NULL; + + FileClose(file); +} + +static char * +ResOwnerPrintFile(Datum res) +{ + return psprintf("File %d", DatumGetInt32(res)); +} |