1 /* 2 * Copyright (C) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef OHOS_IPC_BUFFER_OBJECT_H 17 #define OHOS_IPC_BUFFER_OBJECT_H 18 19 #include <pthread.h> 20 #include <mutex> 21 #include <string> 22 #include <cstdint> 23 #include <sys/types.h> 24 25 #include "nocopyable.h" 26 27 namespace OHOS { 28 constexpr int SOCKET_DEFAULT_BUFF_SIZE = 4 * 1024; 29 constexpr int SOCKET_MAX_BUFF_SIZE = 1024 * 1024; 30 constexpr int SOCKET_BUFF_RESERVED_SIZE = 256; 31 constexpr size_t MAX_RAWDATA_SIZE = 128 * 1024 * 1024; // 128M 32 33 constexpr uint32_t SOCKET_BUFF_SIZE_USER_S = 4 * 1024; 34 constexpr uint32_t SOCKET_BUFF_SIZE_USER_M = 16 * 1024; 35 constexpr uint32_t SOCKET_BUFF_SIZE_USER_L = 64 * 1024; 36 constexpr uint32_t SOCKET_BUFF_SIZE_USER_HUGE = 1024 * 1024; 37 38 class BufferObject { 39 public: 40 explicit BufferObject(); 41 42 ~BufferObject(); 43 44 void UpdateReceiveBuffer(); 45 void UpdateSendBuffer(uint32_t userDataSize); 46 char *GetSendBufferAndLock(uint32_t size); 47 char *GetReceiveBufferAndLock(uint32_t size); 48 void ReleaseSendBufferLock(); 49 void ReleaseReceiveBufferLock(); 50 ssize_t GetReceiveBufferWriteCursor() const; 51 void SetReceiveBufferWriteCursor(ssize_t newWriteCursor); 52 ssize_t GetReceiveBufferReadCursor() const; 53 void SetReceiveBufferReadCursor(ssize_t newReadCursor); 54 ssize_t GetSendBufferWriteCursor() const; 55 void SetSendBufferWriteCursor(ssize_t newWriteCursor); 56 ssize_t GetSendBufferReadCursor() const; 57 void SetSendBufferReadCursor(ssize_t newReadCursor); 58 uint32_t GetNeedBufferSize(uint32_t size) const; 59 uint32_t GetSendBufferSize() const; 60 uint32_t GetRecvBufferSize() const; 61 62 private: 63 DISALLOW_COPY_AND_MOVE(BufferObject); 64 bool ExpandSendBuffer(uint32_t size); 65 ssize_t recvBufferCursorW_ = 0; 66 ssize_t recvBufferCursorR_ = 0; 67 ssize_t sendBufferCursorW_ = 0; 68 ssize_t sendBufferCursorR_ = 0; 69 char *receiveBuffer_ = nullptr; 70 char *sendBuffer_ = nullptr; 71 std::mutex sendMutex_; 72 std::mutex recvMutex_; 73 uint32_t sendBuffSize_ = 0; 74 uint32_t recvBuffSize_ = 0; 75 }; 76 } // namespace OHOS 77 #endif // OHOS_IPC_BUFFER_OBJECT_H 78