/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: Async.Linux.hpp Date: 2022-4-12 Author: Reece ***/ #pragma once namespace Aurora::IO::FS { struct LinuxAsyncFileTransaction; struct LinuxAsyncFileTransactionLoopSource : Loop::LSEvent { LinuxAsyncFileTransactionLoopSource(AuSPtr that); virtual bool IsSignaled() override; virtual bool OnTrigger(AuUInt handle) override; virtual Loop::ELoopSource GetType() override; private: AuWPtr caller_; }; struct FileHandle { ~FileHandle(); bool Init(const AuString &path, EFileOpenMode openMode, bool directIO, EFileAdvisoryLockLevel lock); void Init(int read, int write); int readHandle {-1}; int writeHandle {-1}; AuString path; bool readOnly; bool directIO; }; struct LinuxAsyncFileStream : public IAsyncFileStream { AuSPtr NewTransaction() override; bool BlockingTruncate(AuUInt64 length) override; bool BlockingRead(AuUInt64 offset, const Memory::MemoryViewStreamWrite ¶meters) override; bool BlockingWrite(AuUInt64 offset, const Memory::MemoryViewStreamRead ¶meters) override; void Init(const AuSPtr &handle); AuSPtr GetHandle(); private: AuSPtr handle_; }; struct LinuxAsyncFileTransaction : IAsyncTransaction, AuEnableSharedFromThis, Aurora::IO::UNIX::ASubmittable { ~LinuxAsyncFileTransaction(); bool Init(const AuSPtr &handle); bool StartRead(AuUInt64 offset, const AuSPtr &memoryView) override; bool StartWrite(AuUInt64 offset, const AuSPtr &memoryView) override; bool Complete() override; AuUInt32 GetLastPacketLength() override; void SetCallback(const AuSPtr &sub) override; bool Wait(AuUInt32 timeout) override; AuSPtr NewLoopSource() override; void Reset() override; void DispatchCb(); AuSPtr GetFileHandle(); virtual void LIOS_Process(AuUInt32 read, bool failure, int err, bool mark) override; private: AuSPtr handle_; AuUInt32 lastAbstractOffset_ {}, lastFinishedStat_{}; bool latch_ {}; bool bTxFinished_ {}; AuSPtr sub_; AuSPtr loopSource_; }; }