diff options
Diffstat (limited to 'nuttx/libc/aio/aio_read.c')
-rw-r--r-- | nuttx/libc/aio/aio_read.c | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/nuttx/libc/aio/aio_read.c b/nuttx/libc/aio/aio_read.c new file mode 100644 index 000000000..7e19fb0ed --- /dev/null +++ b/nuttx/libc/aio/aio_read.c @@ -0,0 +1,217 @@ +/**************************************************************************** + * libc/aio/aio_read.c + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name NuttX nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <signal.h> +#include <aio.h> +#include <assert.h> +#include <errno.h> + +#include "lib_internal.h" +#include "aio/aio.h" + +#ifndef CONFIG_LIBC_AIO + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ +/* Configuration ************************************************************/ + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Variables + ****************************************************************************/ + +/**************************************************************************** + * Public Variables + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: aio_read_worker + * + * Description: + * This function executes on the worker thread and performs the + * asynchronous I/O operation. + * + * Input Parameters: + * arg - Worker argument. In this case, a pointer to an instance of + * struct aiocb cast to void *. + * + * Returned Value: + * None + * + ****************************************************************************/ + +static void aio_read_worker(FAR void *arg) +{ + FAR struct aiocb *aiocbp = (FAR struct aiocb *)arg; + DEBASSERT(arg); +#warning Missing logic +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: aio_read + * + * Description: + * The aio_read() function reads aiocbp->aio_nbytes from the file + * associated with aiocbp->aio_fildes into the buffer pointed to by + * aiocbp->aio_buf. The function call will return when the read request + * has been initiated or queued to the file or device (even when the data + * cannot be delivered immediately). + * + * The aiocbp value may be used as an argument to aio_error() and + * aio_return() in order to determine the error status and return status, + * respectively, of the asynchronous operation while it is proceeding. If + * an error condition is encountered during queuing, the function call + * will return without having initiated or queued the request. The + * requested operation takes place at the absolute position in the file as + * given by aio_offset, as if lseek() were called immediately prior to the + * operation with an offset equal to aio_offset and a whence equal to + * SEEK_SET. After a successful call to enqueue an asynchronous I/O + * operation, the value of the file offset for the file is unspecified. + * + * The aiocbp->aio_lio_opcode field will be ignored by aio_read(). + * + * The aiocbp argument points to an aiocb structure. If the buffer pointed + * to by aiocbp->aio_buf or the control block pointed to by aiocbp becomes + * an illegal address prior to asynchronous I/O completion, then the + * behavior is undefined. + * + * Simultaneous asynchronous operations using the same aiocbp produce + * undefined results. + * + * For any system action that changes the process memory space while an + * synchronous I/O is outstanding to the address range being changed, the + * result of that action is undefined. + * + * Input Parameters: + * aiocbp - A pointer to an instance of struct aiocb + * + * Returned Value: + * + * The aio_read() function will return the value zero if the I/O operation + * is successfully queued; otherwise, the function will return the value + * -1 and set errno to indicate the error. The aio_read() function will + * ail if: + * + * EAGAIN - The requested asynchronous I/O operation was not queued due to + * system resource limitations. + * + * Each of the following conditions may be detected synchronously at the + * time of the call to aio_read(), or asynchronously. If any of the + * conditions below are detected synchronously, the aio_read() function + * will return -1 and set errno to the corresponding value. If any of the + * conditions below are detected asynchronously, the return status of the + * asynchronous operation is set to -1, and the error status of the + * asynchronous operation is set to the corresponding value. + * + * EBADF - The aiocbp->aio_fildes argument is not a valid file descriptor + * open for reading. + * EINVAL - The file offset value implied by aiocbp->aio_offset would be + * invalid, aiocbp->aio_reqprio is not a valid value, or + * aiocbp->aio_nbytes is an invalid value. + * + * In the case that the aio_read() successfully queues the I/O operation + * but the operation is subsequently cancelled or encounters an error, the + * return status of the asynchronous operation is one of the values + * normally returned by the read() function call. In addition, the error + * status of the asynchronous operation is set to one of the error + * statuses normally set by the read() function call, or one of the + * following values: + * + * EBADF - The aiocbp->aio_fildes argument is not a valid file descriptor + * open for reading. + * ECANCELED - The requested I/O was cancelled before the I/O completed + * due to an explicit aio_cancel() request. + * EINVAL - The file offset value implied by aiocbp->aio_offset would be + * invalid. + * + * The following condition may be detected synchronously or asynchronously: + * + * EOVERFLOW - The file is a regular file, aiobcp->aio_nbytes is greater + * than 0, and the starting offset in aiobcp->aio_offset is before the + * end-of-file and is at or beyond the offset maximum in the open file + * description associated with aiocbp->aio_fildes. + * + * POSIX Compliance: + * - The standard requires that if prioritized I/O is supported for this + * file, then the asynchronous operation will be submitted at a priority + * equal to a base scheduling priority minus aiocbp->aio_reqprio. If + * Thread Execution Scheduling is not supported, then the base scheduling + * priority is that of the calling thread. + * + * This implementation uses the NuttX work queues that run at a fixed, + * configured priority. + * + * - Most errors required in the standard are not detected at this point. + * There are no pre-queuing checks for the validity of the operation. + * + ****************************************************************************/ + +int aio_read(FAR struct aiocb *aiocbp); +{ + int ret; + + DEBUGASSERT(aiocbp); + + /* Defer the work to the worker thread */ + + ret = work_queue(AIO_QUEUE, &aiocbp->aio_work, aio_read_worker, aiocbp, 0); + if (ret < 0) + { + set_errno(ret); + return ERROR; + } + + return OK; +} + +#endif /* CONFIG_LIBC_AIO */ |