8#include "pedigree/kernel/Log.h"
9#include "pedigree/kernel/utilities/assert.h"
11#include "FileDescriptor.h"
14void acquireTransferLock(
Mutex& lock) {
15#if THREADS && !defined(STANDALONE_MUTEXES)
18 const bool acquired = lock.
acquire();
21 FATAL(
"TransferPositionGuard could not acquire its mutex");
26FileDescriptor::TransferPositionGuard::TransferPositionGuard(
const OpenFileDescriptionLease& input,
27 const OpenFileDescriptionLease& output,
28 bool lockInput,
bool lockOutput)
35 assert(m_Input && m_Output);
37 m_First = m_Input.get();
39 if (lockOutput && m_Output.get() != m_First) {
41 m_Second = m_Output.get();
43 m_First = m_Output.get();
46 if (m_Second &&
reinterpret_cast<uintptr_t
>(m_First) >
reinterpret_cast<uintptr_t
>(m_Second)) {
47 OpenFileDescription* temporary = m_First;
52 const bool inputLocked = m_Input.get() == m_First || m_Input.get() == m_Second;
53 const bool outputLocked = m_Output.get() == m_First || m_Output.get() == m_Second;
57 m_InputFlags = m_Input->statusFlags;
60 if (sameDescription()) {
61 m_OutputFlags = m_InputFlags;
64 m_OutputFlags = m_Output->statusFlags;
69 acquireTransferLock(m_First->lock);
72 acquireTransferLock(m_Second->lock);
75 m_InputFlags = m_Input->statusFlags;
78 m_OutputFlags = m_Output->statusFlags;
82FileDescriptor::TransferPositionGuard::~TransferPositionGuard() {
92int FileDescriptor::TransferPositionGuard::statusFlags(Endpoint endpoint)
const {
93 assert(endpoint == Endpoint::Input || endpoint == Endpoint::Output);
94 return endpoint == Endpoint::Input ? m_InputFlags : m_OutputFlags;
98 Endpoint endpoint)
const {
99 assert(endpoint == Endpoint::Input || endpoint == Endpoint::Output);
100 OpenFileDescription* description = endpoint == Endpoint::Input ? m_Input.get() : m_Output.get();
101 assert(description == m_First || description == m_Second);
105uint64_t FileDescriptor::TransferPositionGuard::offset(Endpoint endpoint)
const {
106 return lockedDescription(endpoint).offset;
109void FileDescriptor::TransferPositionGuard::commitOffset(Endpoint endpoint, uint64_t finalOffset) {
110 lockedDescription(endpoint).offset = finalOffset;
113bool FileDescriptor::TransferPositionGuard::sameDescription()
const {
114 return m_Input.get() == m_Output.get();
MUST_USE_RESULT bool acquireForCompletion(size_t n=1, size_t timeoutSecs=0, size_t timeoutUsecs=0)
bool acquire(size_t n=1, size_t timeoutSecs=0, size_t timeoutUsecs=0)