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