/* * Copyright (C) 2011 The Android Open Source Project * * 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 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __ADDRESS_SPACE_STREAM_H #define __ADDRESS_SPACE_STREAM_H #include "IOStream.h" #include "address_space_graphics_types.h" #include "goldfish_address_space.h" class AddressSpaceStream; AddressSpaceStream* createAddressSpaceStream(size_t bufSize); AddressSpaceStream* createVirtioGpuAddressSpaceStream(size_t bufSize); class AddressSpaceStream : public IOStream { public: explicit AddressSpaceStream( address_space_handle_t handle, uint32_t version, struct asg_context context, uint64_t ringOffset, uint64_t writeBufferOffset, bool virtioMode, struct address_space_ops ops); ~AddressSpaceStream(); virtual size_t idealAllocSize(size_t len); virtual void *allocBuffer(size_t minSize); virtual int commitBuffer(size_t size); virtual const unsigned char *readFully( void *buf, size_t len); virtual const unsigned char *read( void *buf, size_t *inout_len); virtual int writeFully(const void *buf, size_t len); virtual const unsigned char *commitBufferAndReadFully(size_t size, void *buf, size_t len); int getRendernodeFd() const { #if defined(__Fuchsia__) return -1; #else if (!m_virtioMode) return -1; return m_handle; #endif } private: bool isInError() const; ssize_t speculativeRead(unsigned char* readBuffer, size_t trySize); void notifyAvailable(); uint32_t getRelativeBufferPos(uint32_t pos); void advanceWrite(); void ensureConsumerFinishing(); void ensureType1Finished(); void ensureType3Finished(); int type1Write(uint32_t offset, size_t size); bool m_virtioMode; struct address_space_ops m_ops; unsigned char* m_tmpBuf; size_t m_tmpBufSize; size_t m_tmpBufXferSize; bool m_usingTmpBuf; unsigned char* m_readBuf; size_t m_read; size_t m_readLeft; address_space_handle_t m_handle; uint32_t m_version; struct asg_context m_context; uint64_t m_ringOffset; uint64_t m_writeBufferOffset; uint32_t m_writeBufferSize; uint32_t m_writeBufferMask; unsigned char* m_buf; unsigned char* m_writeStart; uint32_t m_writeStep; uint32_t m_notifs; uint32_t m_written; }; #endif