xref: /aosp_15_r20/frameworks/base/cmds/incidentd/src/FdBuffer.cpp (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1*d57664e9SAndroid Build Coastguard Worker /*
2*d57664e9SAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*d57664e9SAndroid Build Coastguard Worker  *
4*d57664e9SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*d57664e9SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*d57664e9SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*d57664e9SAndroid Build Coastguard Worker  *
8*d57664e9SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*d57664e9SAndroid Build Coastguard Worker  *
10*d57664e9SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*d57664e9SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*d57664e9SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*d57664e9SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*d57664e9SAndroid Build Coastguard Worker  * limitations under the License.
15*d57664e9SAndroid Build Coastguard Worker  */
16*d57664e9SAndroid Build Coastguard Worker #define DEBUG false
17*d57664e9SAndroid Build Coastguard Worker #include "Log.h"
18*d57664e9SAndroid Build Coastguard Worker 
19*d57664e9SAndroid Build Coastguard Worker #include "FdBuffer.h"
20*d57664e9SAndroid Build Coastguard Worker #include "incidentd_util.h"
21*d57664e9SAndroid Build Coastguard Worker 
22*d57664e9SAndroid Build Coastguard Worker #include <log/log.h>
23*d57664e9SAndroid Build Coastguard Worker #include <utils/SystemClock.h>
24*d57664e9SAndroid Build Coastguard Worker 
25*d57664e9SAndroid Build Coastguard Worker #include <fcntl.h>
26*d57664e9SAndroid Build Coastguard Worker #include <poll.h>
27*d57664e9SAndroid Build Coastguard Worker #include <unistd.h>
28*d57664e9SAndroid Build Coastguard Worker #include <wait.h>
29*d57664e9SAndroid Build Coastguard Worker 
30*d57664e9SAndroid Build Coastguard Worker namespace android {
31*d57664e9SAndroid Build Coastguard Worker namespace os {
32*d57664e9SAndroid Build Coastguard Worker namespace incidentd {
33*d57664e9SAndroid Build Coastguard Worker 
34*d57664e9SAndroid Build Coastguard Worker const ssize_t BUFFER_SIZE = 16 * 1024;  // 16 KB
35*d57664e9SAndroid Build Coastguard Worker const ssize_t MAX_BUFFER_SIZE = 96 * 1024 * 1024;  // 96 MB
36*d57664e9SAndroid Build Coastguard Worker 
FdBuffer()37*d57664e9SAndroid Build Coastguard Worker FdBuffer::FdBuffer(): FdBuffer(get_buffer_from_pool(), /* isBufferPooled= */ true)  {
38*d57664e9SAndroid Build Coastguard Worker }
39*d57664e9SAndroid Build Coastguard Worker 
FdBuffer(sp<EncodedBuffer> buffer,bool isBufferPooled)40*d57664e9SAndroid Build Coastguard Worker FdBuffer::FdBuffer(sp<EncodedBuffer> buffer, bool isBufferPooled)
41*d57664e9SAndroid Build Coastguard Worker         :mBuffer(buffer),
42*d57664e9SAndroid Build Coastguard Worker          mStartTime(-1),
43*d57664e9SAndroid Build Coastguard Worker          mFinishTime(-1),
44*d57664e9SAndroid Build Coastguard Worker          mTimedOut(false),
45*d57664e9SAndroid Build Coastguard Worker          mTruncated(false),
46*d57664e9SAndroid Build Coastguard Worker          mIsBufferPooled(isBufferPooled) {
47*d57664e9SAndroid Build Coastguard Worker }
48*d57664e9SAndroid Build Coastguard Worker 
~FdBuffer()49*d57664e9SAndroid Build Coastguard Worker FdBuffer::~FdBuffer() {
50*d57664e9SAndroid Build Coastguard Worker     if (mIsBufferPooled) {
51*d57664e9SAndroid Build Coastguard Worker         return_buffer_to_pool(mBuffer);
52*d57664e9SAndroid Build Coastguard Worker     }
53*d57664e9SAndroid Build Coastguard Worker }
54*d57664e9SAndroid Build Coastguard Worker 
read(int fd,int64_t timeout)55*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::read(int fd, int64_t timeout) {
56*d57664e9SAndroid Build Coastguard Worker     struct pollfd pfds = {.fd = fd, .events = POLLIN};
57*d57664e9SAndroid Build Coastguard Worker     mStartTime = uptimeMillis();
58*d57664e9SAndroid Build Coastguard Worker 
59*d57664e9SAndroid Build Coastguard Worker     fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
60*d57664e9SAndroid Build Coastguard Worker 
61*d57664e9SAndroid Build Coastguard Worker     while (true) {
62*d57664e9SAndroid Build Coastguard Worker         if (mBuffer->size() >= MAX_BUFFER_SIZE) {
63*d57664e9SAndroid Build Coastguard Worker             mTruncated = true;
64*d57664e9SAndroid Build Coastguard Worker             VLOG("Truncating data");
65*d57664e9SAndroid Build Coastguard Worker             break;
66*d57664e9SAndroid Build Coastguard Worker         }
67*d57664e9SAndroid Build Coastguard Worker         if (mBuffer->writeBuffer() == NULL) {
68*d57664e9SAndroid Build Coastguard Worker             VLOG("No memory");
69*d57664e9SAndroid Build Coastguard Worker             return NO_MEMORY;
70*d57664e9SAndroid Build Coastguard Worker         }
71*d57664e9SAndroid Build Coastguard Worker 
72*d57664e9SAndroid Build Coastguard Worker         int64_t remainingTime = (mStartTime + timeout) - uptimeMillis();
73*d57664e9SAndroid Build Coastguard Worker         if (remainingTime <= 0) {
74*d57664e9SAndroid Build Coastguard Worker             VLOG("timed out due to long read");
75*d57664e9SAndroid Build Coastguard Worker             mTimedOut = true;
76*d57664e9SAndroid Build Coastguard Worker             break;
77*d57664e9SAndroid Build Coastguard Worker         }
78*d57664e9SAndroid Build Coastguard Worker 
79*d57664e9SAndroid Build Coastguard Worker         int count = TEMP_FAILURE_RETRY(poll(&pfds, 1, remainingTime));
80*d57664e9SAndroid Build Coastguard Worker         if (count == 0) {
81*d57664e9SAndroid Build Coastguard Worker             VLOG("timed out due to block calling poll");
82*d57664e9SAndroid Build Coastguard Worker             mTimedOut = true;
83*d57664e9SAndroid Build Coastguard Worker             break;
84*d57664e9SAndroid Build Coastguard Worker         } else if (count < 0) {
85*d57664e9SAndroid Build Coastguard Worker             VLOG("poll failed: %s", strerror(errno));
86*d57664e9SAndroid Build Coastguard Worker             return -errno;
87*d57664e9SAndroid Build Coastguard Worker         } else {
88*d57664e9SAndroid Build Coastguard Worker             if ((pfds.revents & POLLERR) != 0) {
89*d57664e9SAndroid Build Coastguard Worker                 VLOG("return event has error %s", strerror(errno));
90*d57664e9SAndroid Build Coastguard Worker                 return errno != 0 ? -errno : UNKNOWN_ERROR;
91*d57664e9SAndroid Build Coastguard Worker             } else {
92*d57664e9SAndroid Build Coastguard Worker                 ssize_t amt = TEMP_FAILURE_RETRY(
93*d57664e9SAndroid Build Coastguard Worker                         ::read(fd, mBuffer->writeBuffer(), mBuffer->currentToWrite()));
94*d57664e9SAndroid Build Coastguard Worker                 if (amt < 0) {
95*d57664e9SAndroid Build Coastguard Worker                     if (errno == EAGAIN || errno == EWOULDBLOCK) {
96*d57664e9SAndroid Build Coastguard Worker                         continue;
97*d57664e9SAndroid Build Coastguard Worker                     } else {
98*d57664e9SAndroid Build Coastguard Worker                         VLOG("Fail to read %d: %s", fd, strerror(errno));
99*d57664e9SAndroid Build Coastguard Worker                         return -errno;
100*d57664e9SAndroid Build Coastguard Worker                     }
101*d57664e9SAndroid Build Coastguard Worker                 } else if (amt == 0) {
102*d57664e9SAndroid Build Coastguard Worker                     VLOG("Reached EOF of fd=%d", fd);
103*d57664e9SAndroid Build Coastguard Worker                     break;
104*d57664e9SAndroid Build Coastguard Worker                 }
105*d57664e9SAndroid Build Coastguard Worker                 mBuffer->wp()->move(amt);
106*d57664e9SAndroid Build Coastguard Worker             }
107*d57664e9SAndroid Build Coastguard Worker         }
108*d57664e9SAndroid Build Coastguard Worker     }
109*d57664e9SAndroid Build Coastguard Worker     mFinishTime = uptimeMillis();
110*d57664e9SAndroid Build Coastguard Worker     return NO_ERROR;
111*d57664e9SAndroid Build Coastguard Worker }
112*d57664e9SAndroid Build Coastguard Worker 
readFully(int fd)113*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::readFully(int fd) {
114*d57664e9SAndroid Build Coastguard Worker     mStartTime = uptimeMillis();
115*d57664e9SAndroid Build Coastguard Worker 
116*d57664e9SAndroid Build Coastguard Worker     while (true) {
117*d57664e9SAndroid Build Coastguard Worker         if (mBuffer->size() >= MAX_BUFFER_SIZE) {
118*d57664e9SAndroid Build Coastguard Worker             // Don't let it get too big.
119*d57664e9SAndroid Build Coastguard Worker             mTruncated = true;
120*d57664e9SAndroid Build Coastguard Worker             VLOG("Truncating data");
121*d57664e9SAndroid Build Coastguard Worker             break;
122*d57664e9SAndroid Build Coastguard Worker         }
123*d57664e9SAndroid Build Coastguard Worker         if (mBuffer->writeBuffer() == NULL) {
124*d57664e9SAndroid Build Coastguard Worker             VLOG("No memory");
125*d57664e9SAndroid Build Coastguard Worker             return NO_MEMORY;
126*d57664e9SAndroid Build Coastguard Worker         }
127*d57664e9SAndroid Build Coastguard Worker 
128*d57664e9SAndroid Build Coastguard Worker         ssize_t amt =
129*d57664e9SAndroid Build Coastguard Worker                 TEMP_FAILURE_RETRY(::read(fd, mBuffer->writeBuffer(), mBuffer->currentToWrite()));
130*d57664e9SAndroid Build Coastguard Worker         if (amt < 0) {
131*d57664e9SAndroid Build Coastguard Worker             VLOG("Fail to read %d: %s", fd, strerror(errno));
132*d57664e9SAndroid Build Coastguard Worker             return -errno;
133*d57664e9SAndroid Build Coastguard Worker         } else if (amt == 0) {
134*d57664e9SAndroid Build Coastguard Worker             VLOG("Done reading %zu bytes", mBuffer->size());
135*d57664e9SAndroid Build Coastguard Worker             // We're done.
136*d57664e9SAndroid Build Coastguard Worker             break;
137*d57664e9SAndroid Build Coastguard Worker         }
138*d57664e9SAndroid Build Coastguard Worker         mBuffer->wp()->move(amt);
139*d57664e9SAndroid Build Coastguard Worker     }
140*d57664e9SAndroid Build Coastguard Worker 
141*d57664e9SAndroid Build Coastguard Worker     mFinishTime = uptimeMillis();
142*d57664e9SAndroid Build Coastguard Worker     return NO_ERROR;
143*d57664e9SAndroid Build Coastguard Worker }
144*d57664e9SAndroid Build Coastguard Worker 
readProcessedDataInStream(int fd,unique_fd toFd,unique_fd fromFd,int64_t timeoutMs,const bool isSysfs)145*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::readProcessedDataInStream(int fd, unique_fd toFd, unique_fd fromFd,
146*d57664e9SAndroid Build Coastguard Worker                                              int64_t timeoutMs, const bool isSysfs) {
147*d57664e9SAndroid Build Coastguard Worker     struct pollfd pfds[] = {
148*d57664e9SAndroid Build Coastguard Worker             {.fd = fd, .events = POLLIN},
149*d57664e9SAndroid Build Coastguard Worker             {.fd = toFd.get(), .events = POLLOUT},
150*d57664e9SAndroid Build Coastguard Worker             {.fd = fromFd.get(), .events = POLLIN},
151*d57664e9SAndroid Build Coastguard Worker     };
152*d57664e9SAndroid Build Coastguard Worker 
153*d57664e9SAndroid Build Coastguard Worker     mStartTime = uptimeMillis();
154*d57664e9SAndroid Build Coastguard Worker 
155*d57664e9SAndroid Build Coastguard Worker     // mark all fds non blocking
156*d57664e9SAndroid Build Coastguard Worker     fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
157*d57664e9SAndroid Build Coastguard Worker     fcntl(toFd.get(), F_SETFL, fcntl(toFd.get(), F_GETFL, 0) | O_NONBLOCK);
158*d57664e9SAndroid Build Coastguard Worker     fcntl(fromFd.get(), F_SETFL, fcntl(fromFd.get(), F_GETFL, 0) | O_NONBLOCK);
159*d57664e9SAndroid Build Coastguard Worker 
160*d57664e9SAndroid Build Coastguard Worker     // A circular buffer holds data read from fd and writes to parsing process
161*d57664e9SAndroid Build Coastguard Worker     uint8_t cirBuf[BUFFER_SIZE];
162*d57664e9SAndroid Build Coastguard Worker     size_t cirSize = 0;
163*d57664e9SAndroid Build Coastguard Worker     int rpos = 0, wpos = 0;
164*d57664e9SAndroid Build Coastguard Worker 
165*d57664e9SAndroid Build Coastguard Worker     // This is the buffer used to store processed data
166*d57664e9SAndroid Build Coastguard Worker     while (true) {
167*d57664e9SAndroid Build Coastguard Worker         if (mBuffer->size() >= MAX_BUFFER_SIZE) {
168*d57664e9SAndroid Build Coastguard Worker             VLOG("Truncating data");
169*d57664e9SAndroid Build Coastguard Worker             mTruncated = true;
170*d57664e9SAndroid Build Coastguard Worker             break;
171*d57664e9SAndroid Build Coastguard Worker         }
172*d57664e9SAndroid Build Coastguard Worker         if (mBuffer->writeBuffer() == NULL) {
173*d57664e9SAndroid Build Coastguard Worker             VLOG("No memory");
174*d57664e9SAndroid Build Coastguard Worker             return NO_MEMORY;
175*d57664e9SAndroid Build Coastguard Worker         }
176*d57664e9SAndroid Build Coastguard Worker 
177*d57664e9SAndroid Build Coastguard Worker         int64_t remainingTime = (mStartTime + timeoutMs) - uptimeMillis();
178*d57664e9SAndroid Build Coastguard Worker         if (remainingTime <= 0) {
179*d57664e9SAndroid Build Coastguard Worker             VLOG("timed out due to long read");
180*d57664e9SAndroid Build Coastguard Worker             mTimedOut = true;
181*d57664e9SAndroid Build Coastguard Worker             break;
182*d57664e9SAndroid Build Coastguard Worker         }
183*d57664e9SAndroid Build Coastguard Worker 
184*d57664e9SAndroid Build Coastguard Worker         // wait for any pfds to be ready to perform IO
185*d57664e9SAndroid Build Coastguard Worker         int count = TEMP_FAILURE_RETRY(poll(pfds, 3, remainingTime));
186*d57664e9SAndroid Build Coastguard Worker         if (count == 0) {
187*d57664e9SAndroid Build Coastguard Worker             VLOG("timed out due to block calling poll");
188*d57664e9SAndroid Build Coastguard Worker             mTimedOut = true;
189*d57664e9SAndroid Build Coastguard Worker             break;
190*d57664e9SAndroid Build Coastguard Worker         } else if (count < 0) {
191*d57664e9SAndroid Build Coastguard Worker             VLOG("Fail to poll: %s", strerror(errno));
192*d57664e9SAndroid Build Coastguard Worker             return -errno;
193*d57664e9SAndroid Build Coastguard Worker         }
194*d57664e9SAndroid Build Coastguard Worker 
195*d57664e9SAndroid Build Coastguard Worker         // make sure no errors occur on any fds
196*d57664e9SAndroid Build Coastguard Worker         for (int i = 0; i < 3; ++i) {
197*d57664e9SAndroid Build Coastguard Worker             if ((pfds[i].revents & POLLERR) != 0) {
198*d57664e9SAndroid Build Coastguard Worker                 if (i == 0 && isSysfs) {
199*d57664e9SAndroid Build Coastguard Worker                     VLOG("fd %d is sysfs, ignore its POLLERR return value", fd);
200*d57664e9SAndroid Build Coastguard Worker                     continue;
201*d57664e9SAndroid Build Coastguard Worker                 }
202*d57664e9SAndroid Build Coastguard Worker                 VLOG("fd[%d]=%d returns error events: %s", i, fd, strerror(errno));
203*d57664e9SAndroid Build Coastguard Worker                 return errno != 0 ? -errno : UNKNOWN_ERROR;
204*d57664e9SAndroid Build Coastguard Worker             }
205*d57664e9SAndroid Build Coastguard Worker         }
206*d57664e9SAndroid Build Coastguard Worker 
207*d57664e9SAndroid Build Coastguard Worker         // read from fd
208*d57664e9SAndroid Build Coastguard Worker         if (cirSize != BUFFER_SIZE && pfds[0].fd != -1) {
209*d57664e9SAndroid Build Coastguard Worker             ssize_t amt;
210*d57664e9SAndroid Build Coastguard Worker             if (rpos >= wpos) {
211*d57664e9SAndroid Build Coastguard Worker                 amt = TEMP_FAILURE_RETRY(::read(fd, cirBuf + rpos, BUFFER_SIZE - rpos));
212*d57664e9SAndroid Build Coastguard Worker             } else {
213*d57664e9SAndroid Build Coastguard Worker                 amt = TEMP_FAILURE_RETRY(::read(fd, cirBuf + rpos, wpos - rpos));
214*d57664e9SAndroid Build Coastguard Worker             }
215*d57664e9SAndroid Build Coastguard Worker             if (amt < 0) {
216*d57664e9SAndroid Build Coastguard Worker                 if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
217*d57664e9SAndroid Build Coastguard Worker                     VLOG("Fail to read fd %d: %s", fd, strerror(errno));
218*d57664e9SAndroid Build Coastguard Worker                     return -errno;
219*d57664e9SAndroid Build Coastguard Worker                 }  // otherwise just continue
220*d57664e9SAndroid Build Coastguard Worker             } else if (amt == 0) {
221*d57664e9SAndroid Build Coastguard Worker                 VLOG("Reached EOF of input file %d", fd);
222*d57664e9SAndroid Build Coastguard Worker                 pfds[0].fd = -1;  // reach EOF so don't have to poll pfds[0].
223*d57664e9SAndroid Build Coastguard Worker             } else {
224*d57664e9SAndroid Build Coastguard Worker                 rpos += amt;
225*d57664e9SAndroid Build Coastguard Worker                 cirSize += amt;
226*d57664e9SAndroid Build Coastguard Worker             }
227*d57664e9SAndroid Build Coastguard Worker         }
228*d57664e9SAndroid Build Coastguard Worker 
229*d57664e9SAndroid Build Coastguard Worker         // write to parsing process
230*d57664e9SAndroid Build Coastguard Worker         if (cirSize > 0 && pfds[1].fd != -1) {
231*d57664e9SAndroid Build Coastguard Worker             ssize_t amt;
232*d57664e9SAndroid Build Coastguard Worker             if (rpos > wpos) {
233*d57664e9SAndroid Build Coastguard Worker                 amt = TEMP_FAILURE_RETRY(::write(toFd.get(), cirBuf + wpos, rpos - wpos));
234*d57664e9SAndroid Build Coastguard Worker             } else {
235*d57664e9SAndroid Build Coastguard Worker                 amt = TEMP_FAILURE_RETRY(::write(toFd.get(), cirBuf + wpos, BUFFER_SIZE - wpos));
236*d57664e9SAndroid Build Coastguard Worker             }
237*d57664e9SAndroid Build Coastguard Worker             if (amt < 0) {
238*d57664e9SAndroid Build Coastguard Worker                 if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
239*d57664e9SAndroid Build Coastguard Worker                     VLOG("Fail to write toFd %d: %s", toFd.get(), strerror(errno));
240*d57664e9SAndroid Build Coastguard Worker                     return -errno;
241*d57664e9SAndroid Build Coastguard Worker                 }  // otherwise just continue
242*d57664e9SAndroid Build Coastguard Worker             } else {
243*d57664e9SAndroid Build Coastguard Worker                 wpos += amt;
244*d57664e9SAndroid Build Coastguard Worker                 cirSize -= amt;
245*d57664e9SAndroid Build Coastguard Worker             }
246*d57664e9SAndroid Build Coastguard Worker         }
247*d57664e9SAndroid Build Coastguard Worker 
248*d57664e9SAndroid Build Coastguard Worker         // if buffer is empty and fd is closed, close write fd.
249*d57664e9SAndroid Build Coastguard Worker         if (cirSize == 0 && pfds[0].fd == -1 && pfds[1].fd != -1) {
250*d57664e9SAndroid Build Coastguard Worker             VLOG("Close write pipe %d", toFd.get());
251*d57664e9SAndroid Build Coastguard Worker             toFd.reset();
252*d57664e9SAndroid Build Coastguard Worker             pfds[1].fd = -1;
253*d57664e9SAndroid Build Coastguard Worker         }
254*d57664e9SAndroid Build Coastguard Worker 
255*d57664e9SAndroid Build Coastguard Worker         // circular buffer, reset rpos and wpos
256*d57664e9SAndroid Build Coastguard Worker         if (rpos >= BUFFER_SIZE) {
257*d57664e9SAndroid Build Coastguard Worker             rpos = 0;
258*d57664e9SAndroid Build Coastguard Worker         }
259*d57664e9SAndroid Build Coastguard Worker         if (wpos >= BUFFER_SIZE) {
260*d57664e9SAndroid Build Coastguard Worker             wpos = 0;
261*d57664e9SAndroid Build Coastguard Worker         }
262*d57664e9SAndroid Build Coastguard Worker 
263*d57664e9SAndroid Build Coastguard Worker         // read from parsing process
264*d57664e9SAndroid Build Coastguard Worker         ssize_t amt = TEMP_FAILURE_RETRY(
265*d57664e9SAndroid Build Coastguard Worker                 ::read(fromFd.get(), mBuffer->writeBuffer(), mBuffer->currentToWrite()));
266*d57664e9SAndroid Build Coastguard Worker         if (amt < 0) {
267*d57664e9SAndroid Build Coastguard Worker             if (!(errno == EAGAIN || errno == EWOULDBLOCK)) {
268*d57664e9SAndroid Build Coastguard Worker                 VLOG("Fail to read fromFd %d: %s", fromFd.get(), strerror(errno));
269*d57664e9SAndroid Build Coastguard Worker                 return -errno;
270*d57664e9SAndroid Build Coastguard Worker             }  // otherwise just continue
271*d57664e9SAndroid Build Coastguard Worker         } else if (amt == 0) {
272*d57664e9SAndroid Build Coastguard Worker             VLOG("Reached EOF of fromFd %d", fromFd.get());
273*d57664e9SAndroid Build Coastguard Worker             break;
274*d57664e9SAndroid Build Coastguard Worker         } else {
275*d57664e9SAndroid Build Coastguard Worker             mBuffer->wp()->move(amt);
276*d57664e9SAndroid Build Coastguard Worker         }
277*d57664e9SAndroid Build Coastguard Worker     }
278*d57664e9SAndroid Build Coastguard Worker 
279*d57664e9SAndroid Build Coastguard Worker     mFinishTime = uptimeMillis();
280*d57664e9SAndroid Build Coastguard Worker     return NO_ERROR;
281*d57664e9SAndroid Build Coastguard Worker }
282*d57664e9SAndroid Build Coastguard Worker 
write(uint8_t const * buf,size_t size)283*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::write(uint8_t const* buf, size_t size) {
284*d57664e9SAndroid Build Coastguard Worker     return mBuffer->writeRaw(buf, size);
285*d57664e9SAndroid Build Coastguard Worker }
286*d57664e9SAndroid Build Coastguard Worker 
write(const sp<ProtoReader> & reader)287*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::write(const sp<ProtoReader>& reader) {
288*d57664e9SAndroid Build Coastguard Worker     return mBuffer->writeRaw(reader);
289*d57664e9SAndroid Build Coastguard Worker }
290*d57664e9SAndroid Build Coastguard Worker 
write(const sp<ProtoReader> & reader,size_t size)291*d57664e9SAndroid Build Coastguard Worker status_t FdBuffer::write(const sp<ProtoReader>& reader, size_t size) {
292*d57664e9SAndroid Build Coastguard Worker     return mBuffer->writeRaw(reader, size);
293*d57664e9SAndroid Build Coastguard Worker }
294*d57664e9SAndroid Build Coastguard Worker 
size() const295*d57664e9SAndroid Build Coastguard Worker size_t FdBuffer::size() const {
296*d57664e9SAndroid Build Coastguard Worker     return mBuffer->size();
297*d57664e9SAndroid Build Coastguard Worker }
298*d57664e9SAndroid Build Coastguard Worker 
data() const299*d57664e9SAndroid Build Coastguard Worker sp<EncodedBuffer> FdBuffer::data() const {
300*d57664e9SAndroid Build Coastguard Worker     return mBuffer;
301*d57664e9SAndroid Build Coastguard Worker }
302*d57664e9SAndroid Build Coastguard Worker 
303*d57664e9SAndroid Build Coastguard Worker }  // namespace incidentd
304*d57664e9SAndroid Build Coastguard Worker }  // namespace os
305*d57664e9SAndroid Build Coastguard Worker }  // namespace android
306