Fleshes out aio_read implementation
This commit is contained in:
parent
d7a46c05e7
commit
fa28c51c75
@ -133,7 +133,9 @@ struct aiocb
|
|||||||
|
|
||||||
/* Non-standard, implementation-dependent data */
|
/* Non-standard, implementation-dependent data */
|
||||||
|
|
||||||
struct work_s aio_work; /* Use to defer I/O to the work thread */
|
struct work_s aio_work; /* Used to defer I/O to the work thread */
|
||||||
|
pid_t aio_pid; /* ID of client to be notify at completion */
|
||||||
|
ssize_t aio_result; /* Support aio_error() and aio_return() */
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -39,6 +39,7 @@
|
|||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <aio.h>
|
#include <aio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
@ -90,7 +91,46 @@ static void aio_read_worker(FAR void *arg)
|
|||||||
{
|
{
|
||||||
FAR struct aiocb *aiocbp = (FAR struct aiocb *)arg;
|
FAR struct aiocb *aiocbp = (FAR struct aiocb *)arg;
|
||||||
DEBASSERT(arg);
|
DEBASSERT(arg);
|
||||||
#warning Missing logic
|
ssize_t nread;
|
||||||
|
|
||||||
|
/* Perform the read using:
|
||||||
|
*
|
||||||
|
* aio_fildes - File descriptor
|
||||||
|
* aio_buf - Location of buffer
|
||||||
|
* aio_nbytes - Length of transfer
|
||||||
|
* aio_offset - File offset
|
||||||
|
*/
|
||||||
|
|
||||||
|
nread = pread(aiocbp->aio_fildes, aiocbp->aio_buf, aiocbp->aio_nbytes,
|
||||||
|
aiocbp->aio_offset);
|
||||||
|
|
||||||
|
/* Set the result of the read */
|
||||||
|
|
||||||
|
if (nread < 0)
|
||||||
|
{
|
||||||
|
int errcode = get_errno();
|
||||||
|
fdbg("ERROR: pread failed: %d\n", errode);
|
||||||
|
DEBUGASSERT(errcode > 0);
|
||||||
|
aicbp->result = -errcode;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
aicbp->result = nread;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Signal the client */
|
||||||
|
|
||||||
|
if (aiocbp->aio_sigevent.sigev_notify == SIGEV_SIGNAL)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
#ifdef CONFIG_CAN_PASS_STRUCTS
|
||||||
|
ret = sigqueue(aiocbp->aio_pid, aiocbp->aio_sigevent.sigev_signo,
|
||||||
|
aiocbp->aio_sigevent.sigev_value);
|
||||||
|
#else
|
||||||
|
ret = sigqueue(aiocbp->aio_pid, aiocbp->aio_sigevent.sigev_sign,
|
||||||
|
aiocbp->aio_sigevent.sigev_value.sival_ptr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -202,11 +242,20 @@ int aio_read(FAR struct aiocb *aiocbp);
|
|||||||
|
|
||||||
DEBUGASSERT(aiocbp);
|
DEBUGASSERT(aiocbp);
|
||||||
|
|
||||||
|
/* The result -EBUSY means that the transfer has not yet completed */
|
||||||
|
|
||||||
|
aiocbp->aio_result = -EBUSY;
|
||||||
|
|
||||||
|
/* Save the ID of the calling, client thread */
|
||||||
|
|
||||||
|
aiocbp->aio_pid = getpid();
|
||||||
|
|
||||||
/* Defer the work to the worker thread */
|
/* Defer the work to the worker thread */
|
||||||
|
|
||||||
ret = work_queue(AIO_QUEUE, &aiocbp->aio_work, aio_read_worker, aiocbp, 0);
|
ret = work_queue(AIO_QUEUE, &aiocbp->aio_work, aio_read_worker, aiocbp, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
|
aio->aio_result = ret;
|
||||||
set_errno(ret);
|
set_errno(ret);
|
||||||
return ERROR;
|
return ERROR;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user