/* * Copyright 2022 Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _MEMORY_RING_IO_H #define _MEMORY_RING_IO_H #include #include #include class BMemoryRingIO : public BDataIO { public: BMemoryRingIO(size_t size); virtual ~BMemoryRingIO(); status_t InitCheck() const; virtual ssize_t Read(void* buffer, size_t size); virtual ssize_t Write(const void* buffer, size_t size); status_t SetSize(size_t size); void Clear(); size_t BytesAvailable(); size_t SpaceAvailable(); size_t BufferSize(); status_t WaitForRead( bigtime_t timeout = B_INFINITE_TIMEOUT); status_t WaitForWrite( bigtime_t timeout = B_INFINITE_TIMEOUT); void SetWriteDisabled(bool disabled); bool WriteDisabled(); private: template status_t _WaitForCondition(bigtime_t timeout); private: pthread_mutex_t fLock; pthread_cond_t fEvent; uint8* fBuffer; size_t fBufferSize; size_t fWriteAtNext; size_t fReadAtNext; bool fBufferFull; bool fWriteDisabled; uint32 _reserved[4]; }; #endif // _MEMORY_RING_IO_H