1df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang/*
2df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * Copyright (C) 2016 The Android Open Source Project
3df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang *
4df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * Licensed under the Apache License, Version 2.0 (the "License");
5df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * you may not use this file except in compliance with the License.
6df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * You may obtain a copy of the License at
7df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang *
8df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang *      http://www.apache.org/licenses/LICENSE-2.0
9df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang *
10df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * Unless required by applicable law or agreed to in writing, software
11df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * distributed under the License is distributed on an "AS IS" BASIS,
12df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * See the License for the specific language governing permissions and
14df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * limitations under the License.
15df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang */
16df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
17df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <android-base/logging.h>
18df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <condition_variable>
19df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <memory>
20df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <mutex>
21df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <queue>
22df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include <unistd.h>
23df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
24df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#include "PosixAsyncIO.h"
25df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
26df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangnamespace {
27df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
28df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangvoid read_func(struct aiocb *aiocbp) {
29df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    aiocbp->ret = TEMP_FAILURE_RETRY(pread(aiocbp->aio_fildes,
30df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang                aiocbp->aio_buf, aiocbp->aio_nbytes, aiocbp->aio_offset));
31df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    if (aiocbp->ret == -1) aiocbp->error = errno;
32df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
33df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
34df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangvoid write_func(struct aiocb *aiocbp) {
35df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    aiocbp->ret = TEMP_FAILURE_RETRY(pwrite(aiocbp->aio_fildes,
36df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang                aiocbp->aio_buf, aiocbp->aio_nbytes, aiocbp->aio_offset));
37df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    if (aiocbp->ret == -1) aiocbp->error = errno;
38df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
39df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
40df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang} // end anonymous namespace
41df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
42df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangaiocb::~aiocb() {
43df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    CHECK(!thread.joinable());
44df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
45df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
46df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangint aio_read(struct aiocb *aiocbp) {
47df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    aiocbp->thread = std::thread(read_func, aiocbp);
48df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    return 0;
49df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
50df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
51df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangint aio_write(struct aiocb *aiocbp) {
52df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    aiocbp->thread = std::thread(write_func, aiocbp);
53df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    return 0;
54df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
55df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
56df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangint aio_error(const struct aiocb *aiocbp) {
57df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    return aiocbp->error;
58df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
59df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
60df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangssize_t aio_return(struct aiocb *aiocbp) {
61df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    return aiocbp->ret;
62df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
63df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
64df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangint aio_suspend(struct aiocb *aiocbp[], int n,
65df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang        const struct timespec *) {
66df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    for (int i = 0; i < n; i++) {
67df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang        aiocbp[i]->thread.join();
68df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    }
69df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    return 0;
70df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
71df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang
72df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangvoid aio_prepare(struct aiocb *aiocbp, void* buf, size_t count, off_t offset) {
73df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    aiocbp->aio_buf = buf;
74df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    aiocbp->aio_offset = offset;
75df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang    aiocbp->aio_nbytes = count;
76df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang}
77