| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef _ASYNCIO_H |
| #define _ASYNCIO_H |
| |
| #include <fcntl.h> |
| #include <linux/aio_abi.h> |
| #include <memory> |
| #include <signal.h> |
| #include <sys/cdefs.h> |
| #include <sys/types.h> |
| #include <time.h> |
| #include <thread> |
| #include <unistd.h> |
| |
| /** |
| * Provides a subset of POSIX aio operations, as well |
| * as similar operations with splice and threadpools. |
| */ |
| |
| struct aiocb { |
| int aio_fildes; // Assumed to be the source for splices |
| void *aio_buf; // Unused for splices |
| |
| // Used for threadpool operations only, freed automatically |
| std::unique_ptr<char[]> aio_pool_buf; |
| |
| off_t aio_offset; |
| size_t aio_nbytes; |
| |
| int aio_sink; // Unused for non splice r/w |
| |
| // Used internally |
| std::thread thread; |
| ssize_t ret; |
| int error; |
| |
| ~aiocb(); |
| }; |
| |
| // Submit a request for IO to be completed |
| int aio_read(struct aiocb *); |
| int aio_write(struct aiocb *); |
| int aio_splice_read(struct aiocb *); |
| int aio_splice_write(struct aiocb *); |
| |
| // Suspend current thread until given IO is complete, at which point |
| // its return value and any errors can be accessed |
| // All submitted requests must have a corresponding suspend. |
| // aiocb->aio_buf must refer to valid memory until after the suspend call |
| int aio_suspend(struct aiocb *[], int, const struct timespec *); |
| int aio_error(const struct aiocb *); |
| ssize_t aio_return(struct aiocb *); |
| |
| // (Currently unimplemented) |
| int aio_cancel(int, struct aiocb *); |
| |
| // Initialize a threadpool to perform IO. Only one pool can be |
| // running at a time. |
| void aio_pool_write_init(); |
| void aio_pool_splice_init(); |
| // Suspend current thread until all queued work is complete, then ends the threadpool |
| void aio_pool_end(); |
| // Submit IO work for the threadpool to complete. Memory associated with the work is |
| // freed automatically when the work is complete. |
| int aio_pool_write(struct aiocb *); |
| |
| #endif // ASYNCIO_H |
| |