[*/+] Added/Moved code to AuProtocolStackSpecialWriter[.cpp]
[+] Further mutex guarantees under protocol stacks (hardening)
This commit is contained in:
parent
7da39d2022
commit
994fcb5010
@ -35,6 +35,8 @@ namespace Aurora::IO::Protocol
|
||||
return {};
|
||||
}
|
||||
|
||||
AU_LOCK_GUARD(this->pParent->mutex);
|
||||
|
||||
if (this->pParent->pTopPiece.get() == this)
|
||||
{
|
||||
if (this->pParent->pDrainBuffer)
|
||||
@ -65,6 +67,8 @@ namespace Aurora::IO::Protocol
|
||||
return false;
|
||||
}
|
||||
|
||||
AU_LOCK_GUARD(this->pParent->mutex);
|
||||
|
||||
if (!this->pNext)
|
||||
{
|
||||
if (this->pParent->pDrainBuffer)
|
||||
@ -84,6 +88,8 @@ namespace Aurora::IO::Protocol
|
||||
return;
|
||||
}
|
||||
|
||||
AU_LOCK_GUARD(this->pParent->mutex);
|
||||
|
||||
auto &pBottomPiece = this->pParent->pBottomPiece;
|
||||
|
||||
// fix chain
|
||||
|
@ -14,7 +14,8 @@
|
||||
namespace Aurora::IO::Protocol
|
||||
{
|
||||
ProtocolStack::ProtocolStack() :
|
||||
readView(this)
|
||||
readView(this),
|
||||
writeView(this)
|
||||
{
|
||||
|
||||
}
|
||||
@ -73,6 +74,8 @@ namespace Aurora::IO::Protocol
|
||||
const AuSPtr<IProtocolInterceptor> &pInterceptor,
|
||||
AuUInt uOutputBufferSize)
|
||||
{
|
||||
AU_LOCK_GUARD(this->mutex);
|
||||
|
||||
if (this->bWrittenEnd)
|
||||
{
|
||||
return {};
|
||||
@ -194,6 +197,8 @@ namespace Aurora::IO::Protocol
|
||||
AuUInt uOutputBufferSize,
|
||||
bool bMultipleTick)
|
||||
{
|
||||
AU_LOCK_GUARD(this->mutex);
|
||||
|
||||
if (this->bWrittenEnd)
|
||||
{
|
||||
return {};
|
||||
@ -318,6 +323,8 @@ namespace Aurora::IO::Protocol
|
||||
|
||||
AuSPtr<IProtocolPiece> ProtocolStack::AddEndInterceptor(const AuSPtr<IProtocolInterceptorEx> &pInterceptor)
|
||||
{
|
||||
AU_LOCK_GUARD(this->mutex);
|
||||
|
||||
if (this->bWrittenEnd)
|
||||
{
|
||||
return {};
|
||||
@ -415,6 +422,8 @@ namespace Aurora::IO::Protocol
|
||||
|
||||
void ProtocolStack::Destroy()
|
||||
{
|
||||
AU_LOCK_GUARD(this->mutex);
|
||||
|
||||
if (this->bOwnsSource)
|
||||
{
|
||||
if (this->pSourceBufer)
|
||||
@ -447,94 +456,7 @@ namespace Aurora::IO::Protocol
|
||||
return {};
|
||||
}
|
||||
|
||||
if (this->pStreamWriterCache)
|
||||
{
|
||||
return this->pStreamWriterCache;
|
||||
}
|
||||
|
||||
struct A : AuIO::IStreamWriter
|
||||
{
|
||||
AuWPtr<ProtocolStack> wpStack;
|
||||
|
||||
A(AuWPtr<ProtocolStack> wpStack) :
|
||||
wpStack(wpStack)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
inline virtual EStreamError IsOpen() override
|
||||
{
|
||||
if (auto pStack = AuTryLockMemoryType(this->wpStack))
|
||||
{
|
||||
auto pStackBuffer = pStack->pSourceBufer;//pStack->AsWritableByteBuffer();
|
||||
|
||||
if (pStack->bDead)
|
||||
{
|
||||
return EStreamError::eErrorHandleClosed;
|
||||
}
|
||||
|
||||
if (!pStackBuffer)
|
||||
{
|
||||
return EStreamError::eErrorStreamNotOpen;
|
||||
}
|
||||
else
|
||||
{
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return EStreamError::eErrorHandleClosed;
|
||||
}
|
||||
}
|
||||
|
||||
inline virtual EStreamError Write(const Memory::MemoryViewStreamRead ¶meters) override
|
||||
{
|
||||
|
||||
if (auto pStack = AuTryLockMemoryType(this->wpStack))
|
||||
{
|
||||
auto pStackBuffer = pStack->pSourceBufer; //pStack->AsWritableByteBuffer();
|
||||
|
||||
if (pStack->bDead)
|
||||
{
|
||||
return EStreamError::eErrorHandleClosed;
|
||||
}
|
||||
|
||||
if (!pStackBuffer)
|
||||
{
|
||||
return EStreamError::eErrorStreamNotOpen;
|
||||
}
|
||||
else
|
||||
{
|
||||
parameters.outVariable = pStackBuffer->Write(parameters.ptr, parameters.length);
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return EStreamError::eErrorHandleClosed;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
virtual void Close() override
|
||||
{
|
||||
if (auto pStack = AuTryLockMemoryType(wpStack))
|
||||
{
|
||||
pStack->Terminate();
|
||||
}
|
||||
}
|
||||
|
||||
virtual void Flush() override
|
||||
{
|
||||
if (auto pStack = AuTryLockMemoryType(wpStack))
|
||||
{
|
||||
pStack->DoTick();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return this->pStreamWriterCache = AuMakeShared<A>(this->SharedFromThis());
|
||||
return AuSPtr<IStreamWriter>(this->SharedFromThis(), &this->writeView);
|
||||
}
|
||||
|
||||
AuSPtr<Memory::ByteBuffer> ProtocolStack::AsWritableByteBuffer()
|
||||
@ -575,6 +497,8 @@ namespace Aurora::IO::Protocol
|
||||
|
||||
void ProtocolStack::Terminate()
|
||||
{
|
||||
AU_LOCK_GUARD(this->mutex);
|
||||
|
||||
if (auto pStack = AuTryLockMemoryType(this->pPipeWork))
|
||||
{
|
||||
(void)pStack->End();
|
||||
@ -585,6 +509,8 @@ namespace Aurora::IO::Protocol
|
||||
|
||||
bool ProtocolStack::DoTick()
|
||||
{
|
||||
AU_LOCK_GUARD(this->mutex);
|
||||
|
||||
return this->DoTickEx(true);
|
||||
}
|
||||
|
||||
@ -783,6 +709,7 @@ namespace Aurora::IO::Protocol
|
||||
|
||||
AuList<AuSPtr<IProtocolPiece>> ProtocolStack::GetArrayOfInterceptors()
|
||||
{
|
||||
AU_LOCK_GUARD(this->mutex);
|
||||
AuList<AuSPtr<IProtocolPiece>> list;
|
||||
|
||||
auto pItr = this->pBottomPiece;
|
||||
@ -798,6 +725,7 @@ namespace Aurora::IO::Protocol
|
||||
|
||||
AuSPtr<IProtocolPiece> ProtocolStack::GetInterceptorAtIndex(AuUInt32 uIndex)
|
||||
{
|
||||
AU_LOCK_GUARD(this->mutex);
|
||||
AuUInt32 uCounter {};
|
||||
|
||||
auto pItr = this->pBottomPiece;
|
||||
|
@ -9,6 +9,7 @@
|
||||
|
||||
#include "../AuIOPipeProcessor.hpp"
|
||||
#include "AuProtocolStackSpecialReader.hpp"
|
||||
#include "AuProtocolStackSpecialWriter.hpp"
|
||||
|
||||
namespace Aurora::IO::Protocol
|
||||
{
|
||||
@ -80,6 +81,9 @@ namespace Aurora::IO::Protocol
|
||||
AuUInt uPreferredFragmentSize {};
|
||||
|
||||
SpecialReader readView;
|
||||
SpecialWriter writeView;
|
||||
|
||||
AuRenterableMutex mutex;
|
||||
|
||||
void DiscardAllocCaches();
|
||||
};
|
||||
|
@ -9,11 +9,14 @@
|
||||
***/
|
||||
#include "Protocol.hpp"
|
||||
#include "AuProtocolStack.hpp"
|
||||
#include "AuProtocolPiece.hpp"
|
||||
#include "AuProtocolStackSpecialReader.hpp"
|
||||
|
||||
namespace Aurora::IO::Protocol
|
||||
{
|
||||
SpecialReader::SpecialReader(ProtocolStack *pParent) :
|
||||
pParent(pParent)
|
||||
{ }
|
||||
|
||||
EStreamError SpecialReader::IsOpen()
|
||||
{
|
||||
auto pStack = this->pParent;
|
||||
@ -45,6 +48,8 @@ namespace Aurora::IO::Protocol
|
||||
return EStreamError::eErrorHandleClosed;
|
||||
}
|
||||
|
||||
AU_LOCK_GUARD(pStack->mutex);
|
||||
|
||||
if (!pStackBuffer)
|
||||
{
|
||||
return EStreamError::eErrorStreamNotOpen;
|
||||
|
@ -15,12 +15,7 @@ namespace Aurora::IO::Protocol
|
||||
{
|
||||
ProtocolStack *pParent {};
|
||||
|
||||
inline SpecialReader()
|
||||
{ }
|
||||
inline SpecialReader(ProtocolStack *pParent) : pParent(pParent)
|
||||
{ }
|
||||
inline ~SpecialReader()
|
||||
{ }
|
||||
SpecialReader(ProtocolStack *pParent);
|
||||
|
||||
EStreamError IsOpen() override;
|
||||
|
||||
|
64
Source/IO/Protocol/AuProtocolStackSpecialWriter.cpp
Normal file
64
Source/IO/Protocol/AuProtocolStackSpecialWriter.cpp
Normal file
@ -0,0 +1,64 @@
|
||||
/***
|
||||
Copyright (C) 2022-2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: AuProtocolStackSpecialWriter.cpp
|
||||
File: AuProtocolStack.cpp
|
||||
Date: 2022-8-24
|
||||
Date: 2023-09-21
|
||||
Author: Reece
|
||||
***/
|
||||
#include "Protocol.hpp"
|
||||
#include "AuProtocolStack.hpp"
|
||||
#include "AuProtocolStackSpecialWriter.hpp"
|
||||
|
||||
namespace Aurora::IO::Protocol
|
||||
{
|
||||
SpecialWriter::SpecialWriter(ProtocolStack *pParent) :
|
||||
pParent(pParent)
|
||||
{ }
|
||||
|
||||
EStreamError SpecialWriter::IsOpen()
|
||||
{
|
||||
auto pStack = this->pParent;
|
||||
|
||||
if (pStack->bDead)
|
||||
{
|
||||
return EStreamError::eErrorHandleClosed;
|
||||
}
|
||||
|
||||
if (!pStack->pSourceBufer)
|
||||
{
|
||||
return EStreamError::eErrorStreamNotOpen;
|
||||
}
|
||||
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
EStreamError SpecialWriter::Write(const Memory::MemoryViewStreamRead ¶meters)
|
||||
{
|
||||
auto pStack = this->pParent;
|
||||
if (pStack->bDead)
|
||||
{
|
||||
return EStreamError::eErrorHandleClosed;
|
||||
}
|
||||
|
||||
auto pStackBuffer = pStack->pSourceBufer; //pStack->AsWritableByteBuffer();
|
||||
if (!pStackBuffer)
|
||||
{
|
||||
return EStreamError::eErrorStreamNotOpen;
|
||||
}
|
||||
|
||||
parameters.outVariable = pStackBuffer->Write(parameters.ptr, parameters.length);
|
||||
return EStreamError::eErrorNone;
|
||||
}
|
||||
|
||||
void SpecialWriter::Close()
|
||||
{
|
||||
this->pParent->Terminate();
|
||||
}
|
||||
|
||||
void SpecialWriter::Flush()
|
||||
{
|
||||
this->pParent->DoTick();
|
||||
}
|
||||
}
|
28
Source/IO/Protocol/AuProtocolStackSpecialWriter.hpp
Normal file
28
Source/IO/Protocol/AuProtocolStackSpecialWriter.hpp
Normal file
@ -0,0 +1,28 @@
|
||||
/***
|
||||
Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
|
||||
|
||||
File: AuProtocolStackSpecialWriter.hpp
|
||||
Date: 2023-09-21
|
||||
Author: Reece
|
||||
***/
|
||||
#pragma once
|
||||
|
||||
namespace Aurora::IO::Protocol
|
||||
{
|
||||
struct ProtocolStack;
|
||||
|
||||
struct SpecialWriter : IStreamWriter
|
||||
{
|
||||
ProtocolStack *pParent {};
|
||||
|
||||
SpecialWriter(ProtocolStack *pParent);
|
||||
|
||||
EStreamError IsOpen() override;
|
||||
|
||||
EStreamError Write(const Memory::MemoryViewStreamRead ¶meters) override;
|
||||
|
||||
void Flush() override;
|
||||
|
||||
void Close() override;
|
||||
};
|
||||
}
|
Loading…
Reference in New Issue
Block a user