Dryad/DryadVertex/VertexHost/system/channel/include/channelmemorybuffers.h

142 lines
4.3 KiB
C++

/*
Copyright (c) Microsoft Corporation
All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License
at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF
TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions and
limitations under the License.
*/
#pragma once
#include <portmemorybuffers.h>
class RChannelBufferData;
class RChannelBufferWriter;
class ChannelDataBufferList;
class RChannelReaderBuffer : public DrMemoryBuffer
{
public:
RChannelReaderBuffer(DryadLockedBufferList* bufferList,
Size_t startOffset, Size_t endOffset);
RChannelReaderBuffer(ChannelDataBufferList* bufferList,
Size_t startOffset, Size_t endOffset);
~RChannelReaderBuffer();
//
// Retrieve pointer to the data stored in memory block at uOffset
// and max size available in this block
//
// Returns NULL if no data at this offset, valid pointer otherwise
//
void *GetDataAddress(Size_t uOffset,
Size_t *puSize,
Size_t *puPriorSize);
//
// Preallocate enough memory buffers to fix uMaxSize bytes of data.
//
void IncreaseAllocatedSize(Size_t uSize);
private:
class Current
{
public:
Current(Size_t initialStartOffset,
Size_t finalEndOffset,
DryadLockedMemoryBuffer** bufferArray,
size_t nBuffers,
Size_t offset);
void* GetDataAddress(DryadLockedMemoryBuffer** bufferArray,
Size_t offset,
Size_t *puSize,
Size_t *puPriorSize);
private:
void SetTailBufferData(DryadLockedMemoryBuffer** bufferArray,
size_t nBuffers,
Size_t finalEndOffset);
size_t m_currentBuffer;
Size_t m_currentBufferBase;
Size_t m_currentHeadCutLength;
Size_t m_currentTailOffset;
};
void Initialise(Size_t startOffset, Size_t endOffset);
DryadLockedMemoryBuffer** m_bufferArray;
size_t m_nBuffers;
Size_t m_initialStartOffset;
Size_t m_finalEndOffset;
};
class RChannelWriterBuffer : public DrMemoryBuffer
{
public:
RChannelWriterBuffer(RChannelBufferWriter* bufferProvider,
DryadFixedBufferList* bufferList);
~RChannelWriterBuffer();
//
// Retrieve pointer to the data stored in memory block at uOffset
// and max size available in this block
//
// Returns NULL if no data at this offset, valid pointer otherwise
//
void *GetDataAddress(Size_t uOffset,
Size_t *puSize,
Size_t *puPriorSize);
//
// Preallocate enough memory buffers to fix uMaxSize bytes of data.
//
void IncreaseAllocatedSize(Size_t uSize);
protected:
void InternalSetAvailableSize(Size_t uSize);
private:
DryadFixedBufferList* m_bufferList;
Size_t m_currentBufferOffset;
Size_t m_currentBaseOffset;
Size_t m_baseBufferOffset;
Size_t m_availableHighWaterMark;
Size_t m_availableStartOffset;
Size_t m_availableBufferOffset;
DrBListEntry* m_lastAvailableBuffer;
RChannelBufferWriter* m_bufferProvider;
};
class ChannelMemoryBufferWriter : public DrMemoryBufferWriter
{
public:
ChannelMemoryBufferWriter(DrMemoryBuffer* writer,
DryadFixedBufferList* bufferList);
bool MarkRecordBoundary();
Size_t GetLastRecordBoundary();
private:
Size_t m_initialBoundary;
Size_t m_lastRecordBoundary;
DryadFixedBufferList* m_bufferList;
};