/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: OutputOf.hpp Date: 2023-12-23 Author: Reece ***/ #pragma once #include "StartupParameters.hpp" namespace Aurora::Processes { AUKN_INTERFACE(IAsyncCallbacks, AUI_METHOD(void, OnPipeData, ()), AUI_METHOD(void, OnExit, ()) ); struct OutputOfResult { // Lockable object for reading strStdout and strStderr between threads. /*AuFutexMutex*/ Aurora::Threading::Waitables::FutexWaitableNoVTblMovable lock; bool bFailed { }; bool bNoStart { }; bool bPipeOutOOM { }; bool bPipeErrOOM { }; AuString strStdout { }; AuString strStderr { }; AuUInt uExitCode { }; AuSInt sExitCode { }; }; struct IAsyncOutputOf { virtual OutputOfResult *GetResult() = 0; virtual bool BlockUntilFinished() = 0; virtual bool BlockUntilFinishedMS(AuUInt32 uRelMS) = 0; virtual bool HasFinished() = 0; virtual IProcess *GetProcess() = 0; virtual bool TryAttachProcessExitToCompletionGroup(const AuSPtr &pCompletionGroup) = 0; virtual IO::CompletionGroup::ICompletionGroupWorkHandle *ToCompletionGroupHandle() = 0; AURT_ADD_USR_DATA_EXP(this->ToCompletionGroupHandle()); }; // Thread-local blocking AUKN_SYM OutputOfResult OutputOf(StartupParameters &¶meters, AuOptional toSend /* TODO: not yet implemented */); // Thread-local async // See: IOSleep.hpp, other ILoopSource yields to enter an alertable state, ILoopQueue to enter an alertable state, et al. // Will attach to a async worker thread, if under an AuAsync thread. AUKN_SYM AuSPtr OutputOfAsync(StartupParameters &¶meters, const AuSPtr &pCallbacks); }