• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "buffer_object.h"
17 #include "securec.h"
18 #include "sys_binder.h"
19 
20 namespace OHOS {
BufferObject()21 BufferObject::BufferObject()
22 {
23 }
24 
~BufferObject()25 BufferObject::~BufferObject()
26 {
27     if (receiveBuffer_ != nullptr) {
28         delete[] receiveBuffer_;
29         receiveBuffer_ = nullptr;
30     }
31     if (sendBuffer_ != nullptr) {
32         delete[] sendBuffer_;
33         sendBuffer_ = nullptr;
34     }
35 }
36 
37 /* update buffer need get mutex first */
UpdateSendBuffer()38 void BufferObject::UpdateSendBuffer()
39 {
40     if (sendBufferCursorW_ <= sendBufferCursorR_) {
41         sendBufferCursorW_ = 0;
42         sendBufferCursorR_ = 0;
43         return;
44     }
45     /* check whether buffer size is enough, if not, move write/read cursor to head */
46     if (sendBuffSize_ - static_cast<uint32_t>(sendBufferCursorW_) < SOCKET_BUFF_RESERVED_SIZE) {
47         /* writeCursor always bigger than readCursor */
48         if (sendBufferCursorW_ - sendBufferCursorR_ < sendBufferCursorR_) {
49             auto memcpyResult = memmove_s(sendBuffer_, sendBufferCursorW_ - sendBufferCursorR_,
50                 sendBuffer_ + sendBufferCursorR_, sendBufferCursorW_ - sendBufferCursorR_);
51             if (memcpyResult != EOK) {
52                 sendBufferCursorW_ = 0; // drop data in buffer, if memmove failed
53             } else {
54                 sendBufferCursorW_ = sendBufferCursorW_ - sendBufferCursorR_;
55             }
56             sendBufferCursorR_ = 0;
57         }
58     }
59 }
60 
61 /* update buffer need get mutex first */
UpdateReceiveBuffer()62 void BufferObject::UpdateReceiveBuffer()
63 {
64     if (recvBufferCursorW_ <= recvBufferCursorR_) {
65         recvBufferCursorR_ = 0;
66         recvBufferCursorW_ = 0;
67         return;
68     }
69     /* check whether buffer size is enough, if not, move write/read cursor to head */
70     if (recvBuffSize_ - static_cast<uint32_t>(recvBufferCursorW_) < SOCKET_BUFF_RESERVED_SIZE) {
71         /* writeCursor always bigger than readCursor */
72         if (recvBufferCursorW_ - recvBufferCursorR_ < recvBufferCursorR_) {
73             auto memcpyResult = memmove_s(receiveBuffer_, recvBufferCursorW_ - recvBufferCursorR_,
74                 receiveBuffer_ + recvBufferCursorR_, recvBufferCursorW_ - recvBufferCursorR_);
75             if (memcpyResult != EOK) {
76                 recvBufferCursorW_ = 0; // drop data in buffer, if memmove failed
77             } else {
78                 recvBufferCursorW_ = recvBufferCursorW_ - recvBufferCursorR_;
79             }
80             recvBufferCursorR_ = 0;
81         }
82     }
83 }
84 
GetSendBufferAndLock(uint32_t size)85 char *BufferObject::GetSendBufferAndLock(uint32_t size)
86 {
87     uint32_t needSize = GetNeedBufferSize(size);
88     if (needSize == 0) {
89         return nullptr;
90     }
91     sendMutex_.lock();
92     if (needSize > sendBuffSize_) {
93         char *newBuffer_ = new (std::nothrow) char[needSize];
94         if (newBuffer_ == nullptr) {
95             sendMutex_.unlock();
96             return nullptr;
97         }
98 
99         if ((sendBuffer_ != nullptr) && (sendBuffSize_ != 0)) {
100             int memcpyResult = memcpy_s(newBuffer_, needSize, sendBuffer_, sendBuffSize_);
101             if (memcpyResult != 0) {
102                 delete[] newBuffer_;
103                 sendMutex_.unlock();
104                 return nullptr;
105             }
106         }
107 
108         delete[] sendBuffer_;
109         sendBuffer_ = newBuffer_;
110         sendBuffSize_ = needSize;
111     }
112 
113     /* attention: need unlock mutex by caller */
114     return sendBuffer_;
115 }
116 
GetReceiveBufferAndLock(uint32_t size)117 char *BufferObject::GetReceiveBufferAndLock(uint32_t size)
118 {
119     uint32_t needSize = GetNeedBufferSize(size);
120     if (needSize == 0) {
121         return nullptr;
122     }
123     recvMutex_.lock();
124     if (needSize > recvBuffSize_) {
125         char *newBuffer_ = new (std::nothrow) char[needSize];
126         if (newBuffer_ == nullptr) {
127             recvMutex_.unlock();
128             return nullptr;
129         }
130 
131         if ((receiveBuffer_ != nullptr) && (recvBuffSize_ != 0)) {
132             int memcpyResult = memcpy_s(newBuffer_, needSize, receiveBuffer_, recvBuffSize_);
133             if (memcpyResult != 0) {
134                 delete[] newBuffer_;
135                 recvMutex_.unlock();
136                 return nullptr;
137             }
138         }
139 
140         delete[] receiveBuffer_;
141         receiveBuffer_ = newBuffer_;
142         recvBuffSize_ = needSize;
143     }
144 
145     /* attention: need unlock mutex by caller */
146     return receiveBuffer_;
147 }
148 
ReleaseSendBufferLock()149 void BufferObject::ReleaseSendBufferLock()
150 {
151     sendMutex_.unlock();
152 }
153 
ReleaseReceiveBufferLock()154 void BufferObject::ReleaseReceiveBufferLock()
155 {
156     recvMutex_.unlock();
157 }
158 
GetReceiveBufferWriteCursor() const159 ssize_t BufferObject::GetReceiveBufferWriteCursor() const
160 {
161     return recvBufferCursorW_;
162 }
163 
SetReceiveBufferWriteCursor(ssize_t newWriteCursor)164 void BufferObject::SetReceiveBufferWriteCursor(ssize_t newWriteCursor)
165 {
166     recvBufferCursorW_ = newWriteCursor;
167 }
168 
GetReceiveBufferReadCursor() const169 ssize_t BufferObject::GetReceiveBufferReadCursor() const
170 {
171     return recvBufferCursorR_;
172 }
173 
SetReceiveBufferReadCursor(ssize_t newReadCursor)174 void BufferObject::SetReceiveBufferReadCursor(ssize_t newReadCursor)
175 {
176     recvBufferCursorR_ = newReadCursor;
177 }
178 
GetSendBufferWriteCursor() const179 ssize_t BufferObject::GetSendBufferWriteCursor() const
180 {
181     return sendBufferCursorW_;
182 }
183 
SetSendBufferWriteCursor(ssize_t newWriteCursor)184 void BufferObject::SetSendBufferWriteCursor(ssize_t newWriteCursor)
185 {
186     sendBufferCursorW_ = newWriteCursor;
187 }
188 
GetSendBufferReadCursor() const189 ssize_t BufferObject::GetSendBufferReadCursor() const
190 {
191     return sendBufferCursorR_;
192 }
193 
SetSendBufferReadCursor(ssize_t newReadCursor)194 void BufferObject::SetSendBufferReadCursor(ssize_t newReadCursor)
195 {
196     sendBufferCursorR_ = newReadCursor;
197 }
198 
GetNeedBufferSize(uint32_t size) const199 uint32_t BufferObject::GetNeedBufferSize(uint32_t size) const
200 {
201     if (size <= SOCKET_BUFF_SIZE_USER_S) {
202         return SOCKET_BUFF_SIZE_USER_S;
203     } else if (size <= SOCKET_BUFF_SIZE_USER_M) {
204         return SOCKET_BUFF_SIZE_USER_M;
205     } else if (size <= SOCKET_BUFF_SIZE_USER_L) {
206         return SOCKET_BUFF_SIZE_USER_L;
207     } else if (size <= SOCKET_BUFF_SIZE_USER_HUGE) {
208         return SOCKET_BUFF_SIZE_USER_HUGE;
209     } else {
210         return 0;
211     }
212 }
213 
GetSendBufferSize() const214 uint32_t BufferObject::GetSendBufferSize() const
215 {
216     return sendBuffSize_;
217 }
218 
GetRecvBufferSize() const219 uint32_t BufferObject::GetRecvBufferSize() const
220 {
221     return recvBuffSize_;
222 }
223 } // namespace OHOS
224