54 enum class LookupStatus { Found, NotFound, IoError, Retry };
56 enum class ReadStatus { Complete, Stopped, IoError };
58 enum class AddStatus { Added, Exists, IoError, Detached };
60 enum class EntryType : uint8_t {
75 uint64_t currentCookie;
90 explicit operator bool()
const {
91 return m_pFile !=
nullptr;
97 File* releaseOwnership();
111 void adopt(
File* file);
114#if THREADS && !defined(STANDALONE_MUTEXES)
126 explicit operator bool()
const {
127 return m_pDirectory !=
nullptr;
130 void complete(LookupStatus result);
144 bool m_OwnsNamespaceLock;
145#if THREADS && !defined(STANDALONE_MUTEXES)
153 FATAL(
"Casting non-directory File to Directory!");
167 Directory(
const String& name, Time::Timestamp accessedTime, Time::Timestamp modifiedTime,
168 Time::Timestamp creationTime, uintptr_t inode,
class Filesystem* pFs,
size_t size,
179 File* getChild(
size_t n);
183 return __atomic_load_n(&m_Detached, __ATOMIC_ACQUIRE);
187 size_t getNumChildren();
194 ReadStatus enumerate(uint64_t& cookie, DirectoryEntryEmitter emitter,
void* context);
197 ReadStatus isEmpty(
bool& empty);
200 virtual void cacheDirectoryContents();
203 virtual bool isCachePopulated()
const;
222 ChildLease& child)
const;
238 void setReparsePoint(
Directory* pTarget);
247 AddStatus addEphemeralFile(
File* pFile);
250 void removeEphemeralFiles();
264#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
265 enum class RetainedLookupPhase { BeforeLookup, AfterRetain };
266 using RetainedLookupHook = void (*)(
Directory*,
File*, RetainedLookupPhase);
267 static void setRetainedLookupHookForHostedTest(RetainedLookupHook hook);
268 const void* cacheLockAddressForHostedTest()
const {
269 return static_cast<const void*
>(&m_CacheLock);
271 bool tryCacheLockForHostedTest()
const;
296 virtual LookupStatus resolveChild(
const StringView& name,
File*& child);
308 virtual LookupStatus resolveChildAt(uint64_t cookie,
const StringView& name,
File*& child);
311 virtual ReadStatus readDirectory(uint64_t& cookie, DirectoryEntryEmitter emitter,
void* context);
314 static File* evaluateEntry(
const DirectoryEntryMetadata& meta);
315 static void destroyEntry(
File* file);
358 uint64_t m_NextCacheGeneration;
384#if HOSTED && PEDIGREE_HOSTED_SMOKE_TESTS
385 static RetainedLookupHook m_RetainedLookupHook;
395 void markCachePopulated();
398 bool addDirectoryEntry(
const String& name,
File* pTarget);
401 bool addDirectoryEntry(
const String& name, DirectoryEntryMetadata&& meta);
404 bool reserveDirectoryEntry(
const HashedStringView& name, NameReservation& reservation);
407 bool addCachedDirectoryEntry(NameReservation& reservation,
File* pTarget);
417 return m_NamespaceMutationLock;
423 void preallocateDirectoryEntries(
size_t count);
426 virtual File* convertToFile(
const DirectoryEntryMetadata& meta);
430 bool reserveRenameEntry(
const String& name, NameReservation& reservation);
431 void moveReservedEntry(NameReservation& sourceReservation,
Directory* destination,
432 NameReservation& destinationReservation,
File* source);
434 static constexpr uint64_t ResidentCookie =
static_cast<uint64_t
>(1) << 62;
436 uint64_t nextCacheGeneration();
438 void finishNameReservation(NameReservation& reservation, LookupStatus result);
439 bool addResidentDirectoryEntry(NameReservation& reservation,
File* pTarget,
bool ephemeral);
440 bool addResidentDirectoryEntry(NameReservation& reservation, DirectoryEntry* entry,
441 bool ephemeral,
File* createdTarget =
nullptr);
444 static EntryType entryType(
File* file);
445 LookupStatus lookupChildInternal(
const HashedStringView& name, uint64_t cookie,
bool hasCookie,
446 ChildLease& child)
const;
447 struct EnumerationContext;
448 static bool emitBackingEntry(
void* context,
const DirectoryEntryView& entry);