1487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang/* 2487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Copyright (C) 2016 The Android Open Source Project 3487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * 4487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 5487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * you may not use this file except in compliance with the License. 6487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * You may obtain a copy of the License at 7487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * 8487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * http://www.apache.org/licenses/LICENSE-2.0 9487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * 10487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * Unless required by applicable law or agreed to in writing, software 11487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * distributed under the License is distributed on an "AS IS" BASIS, 12487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * See the License for the specific language governing permissions and 14487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang * limitations under the License. 15487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang */ 16487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 17df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#ifndef _POSIXASYNCIO_H 18df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#define _POSIXASYNCIO_H 19487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 20487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <sys/cdefs.h> 21487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <sys/types.h> 22487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <time.h> 23487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <thread> 24487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang#include <unistd.h> 25487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 26487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang/** 27df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang * Provides a subset of POSIX aio operations. 28487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang */ 29487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 30487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangstruct aiocb { 31df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang int aio_fildes; 32df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang void *aio_buf; 33487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 34487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang off_t aio_offset; 35487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang size_t aio_nbytes; 36487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 37487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang // Used internally 38487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang std::thread thread; 39487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang ssize_t ret; 40487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang int error; 417063c936e50326883e672837036381f77080c2f3Jerry Zhang 427063c936e50326883e672837036381f77080c2f3Jerry Zhang ~aiocb(); 43487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang}; 44487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 45487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang// Submit a request for IO to be completed 46487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint aio_read(struct aiocb *); 47487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint aio_write(struct aiocb *); 48487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 49487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang// Suspend current thread until given IO is complete, at which point 50487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang// its return value and any errors can be accessed 517063c936e50326883e672837036381f77080c2f3Jerry Zhang// All submitted requests must have a corresponding suspend. 527063c936e50326883e672837036381f77080c2f3Jerry Zhang// aiocb->aio_buf must refer to valid memory until after the suspend call 53487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint aio_suspend(struct aiocb *[], int, const struct timespec *); 54487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangint aio_error(const struct aiocb *); 55487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhangssize_t aio_return(struct aiocb *); 567063c936e50326883e672837036381f77080c2f3Jerry Zhang 57df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang// Helper method for setting aiocb members 58df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhangvoid aio_prepare(struct aiocb *, void*, size_t, off_t); 59487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 60df69dd33b4d8a2f9926b5eaccbf53ee7f67475c2Jerry Zhang#endif // POSIXASYNCIO_H 61487be61fb0a38873aec1d12da92437fba5e728f2Jerry Zhang 62