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