|
The Pedigree Project 0.1
|
#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 |
| Pipe::Pipe | ( | const Pipe & | file | ) |
Copy constructors are hidden - unused!
| 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.
|
virtual |
Destructor - doesn't do anything.
Definition at line 80 of file Pipe.cc.
References Semaphore::acquire(), and Semaphore::release().
|
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.
Eases the pain of casting, and performs a sanity check.
Definition at line 42 of file Pipe.h.
References File::isFifo(), and File::isPipe().
| size_t Pipe::getReaderCount | ( | ) |
| size_t Pipe::getWriterCount | ( | ) |
|
virtual |
|
inlineprotectedvirtual |
|
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.
|
virtual |
Pipes are anonymous (no name).
Reimplemented from File.
Definition at line 170 of file Pipe.cc.
References File::getName(), and m_bIsAnonymous.
|
inlinevirtual |
|
overridevirtual |
| size_t Pipe::readableBytes | ( | ) |
|
virtual |
|
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.
|
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().
| PipeBuffer::Result Pipe::reserveRead | ( | size_t | maximum, |
| bool | block, | ||
| ReadReservation & | reservation | ||
| ) |
Definition at line 80 of file Pipe-transfer.cc.
| PipeBuffer::Result Pipe::reserveWrite | ( | size_t | maximum, |
| bool | block, | ||
| WriteReservation & | reservation | ||
| ) |
Definition at line 96 of file Pipe-transfer.cc.
|
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().
|
virtual |
|
inlineoverridevirtual |
Whether readiness transitions are reported through ReadinessSource.
Reimplemented from File.
| PipeBuffer::Result Pipe::transferTo | ( | Pipe & | output, |
| size_t | maximum, | ||
| bool | consume, | ||
| bool | block | ||
| ) |
Definition at line 118 of file Pipe-transfer.cc.
| 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().
| PipeBuffer::Result Pipe::waitTransfer | ( | bool | writing, |
| bool | block | ||
| ) |
Definition at line 112 of file Pipe-transfer.cc.
|
virtual |
|
friend |
|
friend |
|
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().
|
protected |
Ensures anonymous retirement is queued exactly once.
Definition at line 182 of file Pipe.h.
Referenced by retainVfsReference().
|
protected |
Internal pipe buffer.
Definition at line 169 of file Pipe.h.
Referenced by decreaseRefCount(), queryReady(), readableBytes(), readBytewise(), readinessGenerations(), select(), and writeBytewise().
|
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().
|
protected |
Writers waiting for the protected m_nReaders predicate.
Definition at line 172 of file Pipe.h.
Referenced by waitForReader().