The Pedigree Project 0.1
Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Member Functions | Friends | List of all members
Pipe Class Reference

#include <Pipe.h>

+ Inheritance diagram for Pipe:
+ Collaboration diagram for Pipe:

Classes

class  ReadReservation
 
class  WriteReservation
 

Public Member Functions

 Pipe ()
 
 Pipe (const Pipe &file)
 
 Pipe (const String &name, Time::Timestamp accessedTime, Time::Timestamp modifiedTime, Time::Timestamp creationTime, uintptr_t inode, class Filesystem *pFs, size_t size, File *pParent, bool bIsAnonymous=false)
 
virtual ~Pipe ()
 
virtual int select (bool bWriting=false, int timeout=0)
 
ReadyMask queryReady (bool reading, bool writing) override
 
ReadinessGenerations readinessGenerations () override
 
bool supportsReadinessNotifications () const override
 
virtual uint64_t readBytewise (uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
 
virtual uint64_t writeBytewise (uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true)
 
virtual bool isPipe () const
 
virtual bool isFifo () const
 
virtual bool isSeekable () const
 
virtual void increaseRefCount (bool bIsWriter)
 
virtual void decreaseRefCount (bool bIsWriter)
 
bool retainVfsReference () override
 
void releaseVfsReference () override
 
size_t readableBytes ()
 
size_t getReaderCount ()
 
size_t getWriterCount ()
 
bool waitForReader (bool bCanBlock)
 
PipeBuffer::Result reserveRead (size_t maximum, bool block, ReadReservation &reservation)
 
PipeBuffer::Result reserveWrite (size_t maximum, bool block, WriteReservation &reservation)
 
PipeBuffer::Result waitTransfer (bool writing, bool block)
 
PipeBuffer::Result transferTo (Pipe &output, size_t maximum, bool consume, bool block)
 
- Public Member Functions inherited from File
 File ()
 
 File (const String &name, Time::Timestamp accessedTime, Time::Timestamp modifiedTime, Time::Timestamp creationTime, uintptr_t inode, class Filesystem *pFs, size_t size, File *pParent)
 
virtual ~File ()
 
virtual uint64_t read (uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true) final
 
size_t readCached (uint64_t location, size_t size, uintptr_t buffer, bool(*prepare)(uintptr_t, size_t)=nullptr)
 
virtual uint64_t write (uint64_t location, uint64_t size, uintptr_t buffer, bool bCanBlock=true) final
 
uint64_t append (uint64_t size, uintptr_t buffer, uint64_t &location, bool bCanBlock=true)
 
WriteGuard lockWrites ()
 
virtual physical_uintptr_t getPhysicalPage (size_t offset)
 
virtual bool isDirectPhysicalMapping () const
 
size_t physicalMappingFlags () const
 
virtual void returnPhysicalPage (size_t offset)
 
virtual bool tryBeginMappingRelease ()
 
void endMappingRelease ()
 
bool syncAndReturnPhysicalPage (size_t offset, bool async)
 
virtual bool sync ()
 
bool syncRange (size_t offset, size_t length)
 
virtual bool sync (size_t offset, bool async)
 
virtual bool syncPages (const uint64_t *offsets, size_t count)
 
Time::Timestamp getCreationTime ()
 
void setCreationTime (Time::Timestamp t)
 
Time::Timestamp getAccessedTime ()
 
void setAccessedTime (Time::Timestamp t)
 
Time::Timestamp getModifiedTime ()
 
void setModifiedTime (Time::Timestamp t)
 
void setTimes (Time::Timestamp accessed, Time::Timestamp modified, bool changeAccessed, bool changeModified)
 
virtual Attributes getAttributes () const
 
virtual XattrStatus getExtendedAttribute (const StringView &name, void *buffer, size_t capacity, size_t &required)
 
virtual XattrStatus listExtendedAttributes (void *buffer, size_t capacity, size_t &required)
 
virtual XattrStatus setExtendedAttribute (const StringView &name, const void *value, size_t length, unsigned flags)
 
virtual XattrStatus removeExtendedAttribute (const StringView &name)
 
virtual bool prepareSharedMapping (size_t offset, size_t length)
 
String getName () const
 
void getName (String &s) const
 
virtual void getFullPath (String &result, bool bWithMount=true)
 
virtual String getFullPath (bool bWithMount=true)
 
virtual void truncate ()
 
bool resize (size_t size)
 
virtual size_t getSize ()
 
void setSize (size_t sz)
 
virtual bool isSymlink ()
 
virtual bool isDirectory ()
 
virtual bool isBlockDevice () const
 
virtual uint64_t deviceNumber () const
 
virtual bool isSocket () const
 
bool supportsRegularFileOperations ()
 
virtual bool isCharacterDevice () const
 
virtual bool isConsole () const
 
virtual uint64_t maximumFileSize () const
 
virtual bool allowMapping (bool shared, bool writeRequested, bool &mayWrite)
 
bool acquireMappingUse (bool executable, bool sharedWrite)
 
void releaseMappingUse (bool executable, bool sharedWrite)
 
uintptr_t getInode () const
 
virtual void setInode (uintptr_t inode)
 
virtual uintptr_t futexIdentity ()
 
Filesystem * getFilesystem () const
 
void setFilesystem (Filesystem *pFs)
 
virtual void fileAttributeChanged ()
 
void publishEvent (FileEventMask mask, const StringView &name=StringView(), bool targetIsDirectory=false)
 
virtual FileHandleStatus subscribeInodeEvents (FileEventMask mask, const SharedPointer< FileEventObserver > &observer, FileEventSubscription &subscription)
 
virtual void finishInodeRetirement ()
 
virtual bool isStableVfsRoot () const
 
void setPermissions (uint32_t perms)
 
uint32_t getPermissions () const
 
bool setOwnership (size_t uid, size_t gid, bool changeUid, bool changeGid)
 
void setUid (size_t uid)
 
size_t getUid () const
 
void setGid (size_t gid)
 
size_t getGid () const
 
File * getParent () const
 
void getNamespace (ParentLease &parent, String &name) const
 
void monitor (Thread *pThread, Event *pEvent)
 
void cullMonitorTargets (Thread *pThread)
 
void cullMonitorTargets (Event *pEvent)
 
virtual bool supports (const size_t command) const
 
virtual int command (const size_t command, void *buffer)
 
virtual size_t getBlockSize () const
 
void markPageExternallyWritable (size_t offset)
 
size_t populateRange (size_t offset, size_t length)
 
void enableDirect ()
 
void disableDirect ()
 
virtual void preallocate (size_t expectedSize, bool zero=true)
 
bool allocateRange (size_t offset, size_t length, bool keepSize=false)
 
virtual File * open ()
 
virtual File * openForDescriptor (RetainedFile &owner)
 
- Public Member Functions inherited from ReadinessSource
MUST_USE_RESULT bool subscribeReadiness (ReadyMask interest, const SharedPointer< ReadinessObserver > &observer, ReadinessSubscription &subscription)
 
- Public Member Functions inherited from FileEventSource
MUST_USE_RESULT bool subscribeFileEvents (FileEventMask interest, const SharedPointer< FileEventObserver > &observer, FileEventSubscription &subscription)
 

Static Public Member Functions

static Pipe * fromFile (File *pF)
 

Protected Member Functions

bool shouldQueueRetirementLocked ()
 
virtual bool isBytewise () const
 
- Protected Member Functions inherited from File
bool tryAcquireFilesystemOperation (OperationBarrier::Lease &operation) const
 
virtual void updateAttributes (const Attributes &attributes, uint32_t mask)
 
virtual bool changeOwnership (size_t uid, size_t gid, bool changeUid, bool changeGid)
 
virtual bool allowPhysicalPage () const
 
virtual bool prepareWrite (uint64_t location, uint64_t size)
 
virtual bool allowResize (size_t oldSize, size_t newSize)
 
virtual bool prepareShrink (const ShrinkContext &context, UniquePointer< PreparedShrink > &prepared)
 
virtual bool resizeFile (size_t size)
 
virtual bool allocateFileRange (size_t offset, size_t length)
 
virtual Mutex & writeSerializationLock ()
 
virtual Mutex & dataMutationLock ()
 
virtual size_t & physicalPageLoans ()
 
bool clearDataCache ()
 
virtual uintptr_t readBlock (uint64_t location)
 
virtual bool readPage (uint64_t location, uintptr_t destination)
 
virtual bool readPages (ReadPage *pages, size_t count)
 
virtual void writeBlock (uint64_t location, uintptr_t addr)
 
virtual void writeBlocks (uint64_t location, uintptr_t addr, size_t length)
 
virtual void extend (size_t newSize)
 
virtual void extend (size_t newSize, uint64_t location, uint64_t size)
 
virtual void publishInodeEvent (const FileEvent &event)
 
void dataChanged ()
 
void getFilesystemLabel (HugeStaticString &s)
 
void enableFillCacheWriteback ()
 
void shutdownFillCacheWriteback ()
 
bool syncFillCache (size_t offset, bool async, bool &present)
 
virtual bool useFillCache () const
 
virtual MUST_USE_RESULT bool pinBlock (uint64_t location)
 
virtual MUST_USE_RESULT uintptr_t acquireCachedBlock (uint64_t location, bool retryChanged)
 
virtual void unpinBlock (uint64_t location)
 
void evict (uint64_t location)
 
void setPermissionsOnly (uint32_t perms)
 
void setUidOnly (size_t uid)
 
void setGidOnly (size_t gid)
 
void retainDetachedParent ()
 
void moveNamespace (const String &name, File *parent)
 
bool snapshotNamespace (ParentLease &parent, String &name, FileEventMask interest) const
 
virtual CacheState & cacheState ()
 
void setPhysicalMappingFlags (size_t flags)
 
- Protected Member Functions inherited from ReadinessSource
void notifyReadiness (ReadyMask mask)
 
void closeReadiness (ReadyMask mask=ReadyInvalid|ReadyHangup)
 
- Protected Member Functions inherited from FileEventSource
bool hasFileEventObservers (FileEventMask mask) const
 
void notifyFileEvent (const FileEvent &event)
 
void notifyFinalFileEvent (const FileEvent &event)
 
void beginFinalFileEvent (const FileEvent &event)
 
void drainFileEvents ()
 
void closeFileEvents ()
 

Static Protected Member Functions

static void bufferChanged (void *context)
 
- Static Protected Member Functions inherited from File
static bool writeCallback (CacheConstants::CallbackCause cause, uintptr_t loc, uintptr_t page, void *meta)
 
static bool fillCacheCallback (CacheConstants::CallbackCause cause, uintptr_t loc, uintptr_t page, void *meta)
 
- Static Protected Member Functions inherited from FileEventSource
static bool anyFileEventObservers ()
 

Protected Attributes

bool m_bIsAnonymous
 
volatile bool m_bIsEOF
 
PipeBuffer m_Buffer
 
ConditionVariable m_ReaderCondition
 
uint64_t m_WriteGeneration
 
uint64_t m_ErrorGeneration
 
uint64_t m_HangupGeneration
 
size_t m_nLifetimePins
 
bool m_bRetirementQueued
 
- Protected Attributes inherited from File
String m_Name
 
Time::Timestamp m_AccessedTime
 
Time::Timestamp m_ModifiedTime
 
Time::Timestamp m_CreationTime
 
uintptr_t m_Inode
 
uintptr_t m_FutexIdentity = 0
 
class Filesystem * m_pFilesystem
 
size_t m_Size
 
File * m_pParent
 
Mutex m_MetadataLock
 
File * m_pDetachedParent
 
bool m_bDetachedParentHandled
 
size_t m_nWriters
 
size_t m_nReaders
 
size_t m_Uid
 
size_t m_Gid
 
uint32_t m_Permissions
 
CacheState m_CacheState
 
bool m_bDirect
 
Mutex m_WriteLock
 
Mutex m_DataMutationLock
 
size_t m_PhysicalPageLoans = 0
 
size_t m_PhysicalMappingFlags = 0
 
Mutex m_Lock
 
List< MonitorTarget * > m_MonitorTargets
 

Private Member Functions

Pipe & operator= (const Pipe &)
 

Friends

class Filesystem
 
class ZombiePipe
 

Additional Inherited Members

- Public Types inherited from File
enum  AttributeMask : uint32_t {
  AccessTime = 1U << 0 , ModifyTime = 1U << 1 , ChangeTime = 1U << 2 , Owner = 1U << 3 ,
  Group = 1U << 4 , Permissions = 1U << 5
}
 
- Static Public Attributes inherited from File
static constexpr size_t MaxReadPages = 32
 

Detailed Description

A first-in-first-out buffer node.

Definition at line 36 of file Pipe.h.

Constructor & Destructor Documentation

◆ Pipe() [1/3]

Pipe::Pipe ( )

Constructor, creates an invalid file.

Definition at line 46 of file Pipe.cc.

◆ Pipe() [2/3]

Pipe::Pipe ( const Pipe &  file)

Copy constructors are hidden - unused!

◆ Pipe() [3/3]

Pipe::Pipe ( const String &  name,
Time::Timestamp  accessedTime,
Time::Timestamp  modifiedTime,
Time::Timestamp  creationTime,
uintptr_t  inode,
class Filesystem *  pFs,
size_t  size,
File *  pParent,
bool  bIsAnonymous = false 
)

Constructor, should be called only by a Filesystem.

Definition at line 62 of file Pipe.cc.

References Hex.

◆ ~Pipe()

Pipe::~Pipe ( )
virtual

Destructor - doesn't do anything.

Definition at line 80 of file Pipe.cc.

References Semaphore::acquire(), and Semaphore::release().

Member Function Documentation

◆ bufferChanged()

void Pipe::bufferChanged ( void *  context)
staticprotected

Definition at line 89 of file Pipe.cc.

◆ decreaseRefCount()

void Pipe::decreaseRefCount ( bool  bIsWriter)
virtual

Override decreaseRefCount so we can tell when all writers have hung up (and also when all readers have hung up so we can die).

Reimplemented from File.

Definition at line 200 of file Pipe.cc.

References File::dataChanged(), ProcessorBase::information(), and m_Buffer.

◆ fromFile()

static Pipe * Pipe::fromFile ( File *  pF)
inlinestatic

Eases the pain of casting, and performs a sanity check.

Definition at line 42 of file Pipe.h.

References File::isFifo(), and File::isPipe().

◆ getReaderCount()

size_t Pipe::getReaderCount ( )

Returns a locked diagnostic snapshot of the current reader count.

Definition at line 310 of file Pipe.cc.

◆ getWriterCount()

size_t Pipe::getWriterCount ( )

Returns a locked diagnostic snapshot of the current writer count.

Definition at line 315 of file Pipe.cc.

◆ increaseRefCount()

void Pipe::increaseRefCount ( bool  bIsWriter)
virtual

Reimplemented from File.

Definition at line 178 of file Pipe.cc.

◆ isBytewise()

virtual bool Pipe::isBytewise ( ) const
inlineprotectedvirtual

File subclasses can define this and return true if they require read() calls to perform actual data reads, and false if readBlock() is otherwise sufficient.

Reimplemented from File.

Definition at line 188 of file Pipe.h.

◆ isFifo()

bool Pipe::isFifo ( ) const
virtual

FIFOs are not anonymous (have a name).

Reimplemented from File.

Definition at line 174 of file Pipe.cc.

References File::getName(), and m_bIsAnonymous.

◆ isPipe()

bool Pipe::isPipe ( ) const
virtual

Pipes are anonymous (no name).

Reimplemented from File.

Definition at line 170 of file Pipe.cc.

References File::getName(), and m_bIsAnonymous.

◆ isSeekable()

virtual bool Pipe::isSeekable ( ) const
inlinevirtual

Whether ordinary reads and writes consume a persistent byte offset.

Reimplemented from File.

Definition at line 87 of file Pipe.h.

◆ queryReady()

ReadyMask Pipe::queryReady ( bool  reading,
bool  writing 
)
overridevirtual

Return the current readiness state for this open endpoint.

Reimplemented from File.

Definition at line 105 of file Pipe.cc.

References m_Buffer.

◆ readableBytes()

size_t Pipe::readableBytes ( )

Returns a locked snapshot of unread bytes without consuming them.

Definition at line 93 of file Pipe.cc.

References m_Buffer.

◆ readBytewise()

uint64_t Pipe::readBytewise ( uint64_t  location,
uint64_t  size,
uintptr_t  buffer,
bool  bCanBlock = true 
)
virtual

Reads from the file.

Reimplemented from File.

Definition at line 143 of file Pipe.cc.

References m_Buffer.

◆ readinessGenerations()

ReadinessGenerations Pipe::readinessGenerations ( )
overridevirtual

Return source-serialized rising-edge sequences where available.

A source increments the corresponding sequence while holding the same lock which changes its readiness predicate. Consumers can then recover a drain/refill transition even if the two callback deliveries are reordered.

Reimplemented from ReadinessSource.

Definition at line 133 of file Pipe.cc.

References m_Buffer.

◆ releaseVfsReference()

void Pipe::releaseVfsReference ( )
overridevirtual

Release a storage pin, retiring an unused anonymous pipe if needed.

Reimplemented from File.

Definition at line 278 of file Pipe.cc.

References ProcessorBase::information(), m_bIsAnonymous, m_nLifetimePins, and File::releaseVfsReference().

◆ reserveRead()

PipeBuffer::Result Pipe::reserveRead ( size_t  maximum,
bool  block,
ReadReservation &  reservation 
)

Definition at line 80 of file Pipe-transfer.cc.

◆ reserveWrite()

PipeBuffer::Result Pipe::reserveWrite ( size_t  maximum,
bool  block,
WriteReservation &  reservation 
)

Definition at line 96 of file Pipe-transfer.cc.

◆ retainVfsReference()

bool Pipe::retainVfsReference ( )
overridevirtual

Pin anonymous pipe storage independently of reader/writer presence.

Reimplemented from File.

Definition at line 265 of file Pipe.cc.

References m_bIsAnonymous, m_bRetirementQueued, m_nLifetimePins, and File::retainVfsReference().

◆ select()

int Pipe::select ( bool  bWriting = false,
int  timeout = 0 
)
virtual

select()

Reimplemented from File.

Definition at line 97 of file Pipe.cc.

References m_Buffer.

◆ shouldQueueRetirementLocked()

bool Pipe::shouldQueueRetirementLocked ( )
protected

Definition at line 301 of file Pipe.cc.

◆ supportsReadinessNotifications()

bool Pipe::supportsReadinessNotifications ( ) const
inlineoverridevirtual

Whether readiness transitions are reported through ReadinessSource.

Reimplemented from File.

Definition at line 71 of file Pipe.h.

◆ transferTo()

PipeBuffer::Result Pipe::transferTo ( Pipe &  output,
size_t  maximum,
bool  consume,
bool  block 
)

Definition at line 118 of file Pipe-transfer.cc.

◆ waitForReader()

bool Pipe::waitForReader ( bool  bCanBlock)

Atomically tests for a reader and, when permitted, waits for one.

All writers waiting on the predicate are released when a reader arrives. Returns false for a nonblocking miss or an interrupted blocking wait.

Definition at line 320 of file Pipe.cc.

References Semaphore::acquire(), m_ReaderCondition, ConditionVariable::mutexAcquired(), Semaphore::release(), and ConditionVariable::wait().

◆ waitTransfer()

PipeBuffer::Result Pipe::waitTransfer ( bool  writing,
bool  block 
)

Definition at line 112 of file Pipe-transfer.cc.

◆ writeBytewise()

uint64_t Pipe::writeBytewise ( uint64_t  location,
uint64_t  size,
uintptr_t  buffer,
bool  bCanBlock = true 
)
virtual

Writes to the file.

Reimplemented from File.

Definition at line 156 of file Pipe.cc.

References m_Buffer.

Friends And Related Symbol Documentation

◆ Filesystem

friend class Filesystem
friend

Definition at line 37 of file Pipe.h.

◆ ZombiePipe

friend class ZombiePipe
friend

Definition at line 38 of file Pipe.h.

Member Data Documentation

◆ m_bIsAnonymous

bool Pipe::m_bIsAnonymous
protected

If we're an anonymous pipe, we should delete ourselves when all readers/writers have hung up.

Definition at line 163 of file Pipe.h.

Referenced by isFifo(), isPipe(), releaseVfsReference(), and retainVfsReference().

◆ m_bIsEOF

volatile bool Pipe::m_bIsEOF
protected

Have we reached EOF?

Definition at line 166 of file Pipe.h.

◆ m_bRetirementQueued

bool Pipe::m_bRetirementQueued
protected

Ensures anonymous retirement is queued exactly once.

Definition at line 182 of file Pipe.h.

Referenced by retainVfsReference().

◆ m_Buffer

PipeBuffer Pipe::m_Buffer
protected

Internal pipe buffer.

Definition at line 169 of file Pipe.h.

Referenced by decreaseRefCount(), queryReady(), readableBytes(), readBytewise(), readinessGenerations(), select(), and writeBytewise().

◆ m_ErrorGeneration

uint64_t Pipe::m_ErrorGeneration
protected

Definition at line 175 of file Pipe.h.

◆ m_HangupGeneration

uint64_t Pipe::m_HangupGeneration
protected

Definition at line 176 of file Pipe.h.

◆ m_nLifetimePins

size_t Pipe::m_nLifetimePins
protected

OFD lifetime pins which do not count as live reader/writer endpoints.

Definition at line 179 of file Pipe.h.

Referenced by releaseVfsReference(), and retainVfsReference().

◆ m_ReaderCondition

ConditionVariable Pipe::m_ReaderCondition
protected

Writers waiting for the protected m_nReaders predicate.

Definition at line 172 of file Pipe.h.

Referenced by waitForReader().

◆ m_WriteGeneration

uint64_t Pipe::m_WriteGeneration
protected

Definition at line 174 of file Pipe.h.


The documentation for this class was generated from the following files: