/*-------------------------------------------------------------------------
*
* logtape . h
* Management of " logical tapes " within temporary files .
*
* See logtape . c for explanations .
*
* Portions Copyright ( c ) 1996 - 2025 , PostgreSQL Global Development Group
* Portions Copyright ( c ) 1994 , Regents of the University of California
*
* src / include / utils / logtape . h
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
#ifndef LOGTAPE_H
#define LOGTAPE_H
#include "storage/sharedfileset.h"
/*
* LogicalTapeSet and LogicalTape are opaque types whose details are not
* known outside logtape . c .
*/
typedef struct LogicalTapeSet LogicalTapeSet;
typedef struct LogicalTape LogicalTape;
/*
* The approach tuplesort . c takes to parallel external sorts is that workers ,
* whose state is almost the same as independent serial sorts , are made to
* produce a final materialized tape of sorted output in all cases . This is
* frozen , just like any case requiring a final materialized tape . However ,
* there is one difference , which is that freezing will also export an
* underlying shared fileset BufFile for sharing . Freezing produces TapeShare
* metadata for the worker when this happens , which is passed along through
* shared memory to leader .
*
* The leader process can then pass an array of TapeShare metadata ( one per
* worker participant ) to LogicalTapeSetCreate ( ) , alongside a handle to a
* shared fileset , which is sufficient to construct a new logical tapeset that
* consists of each of the tapes materialized by workers .
*
* Note that while logtape . c does create an empty leader tape at the end of the
* tapeset in the leader case , it can never be written to due to a restriction
* in the shared buffile infrastructure .
*/
typedef struct TapeShare
{
/*
* Currently , all the leader process needs is the location of the
* materialized tape ' s first block .
*/
int64 firstblocknumber;
} TapeShare;
/*
* prototypes for functions in logtape . c
*/
extern LogicalTapeSet *LogicalTapeSetCreate(bool preallocate,
SharedFileSet *fileset, int worker);
extern void LogicalTapeClose(LogicalTape *lt);
extern void LogicalTapeSetClose(LogicalTapeSet *lts);
extern LogicalTape *LogicalTapeCreate(LogicalTapeSet *lts);
extern LogicalTape *LogicalTapeImport(LogicalTapeSet *lts, int worker, TapeShare *shared);
extern void LogicalTapeSetForgetFreeSpace(LogicalTapeSet *lts);
extern size_t LogicalTapeRead(LogicalTape *lt, void *ptr, size_t size);
extern void LogicalTapeWrite(LogicalTape *lt, const void *ptr, size_t size);
extern void LogicalTapeRewindForRead(LogicalTape *lt, size_t buffer_size);
extern void LogicalTapeFreeze(LogicalTape *lt, TapeShare *share);
extern size_t LogicalTapeBackspace(LogicalTape *lt, size_t size);
extern void LogicalTapeSeek(LogicalTape *lt, int64 blocknum, int offset);
extern void LogicalTapeTell(LogicalTape *lt, int64 *blocknum, int *offset);
extern int64 LogicalTapeSetBlocks(LogicalTapeSet *lts);
#endif /* LOGTAPE_H */
Messung V0.5 in Prozent C=94 H=93 G=93
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-08-08)
¤
*© Formatika GbR, Deutschland