From e501d79f46c347203a912332b5892836054335a0 Mon Sep 17 00:00:00 2001 From: Ralf Corsepius Date: Mon, 16 Aug 2010 05:39:59 +0000 Subject: 2010-08-16 Alin Rus * posix/include/aio.h: Extend struct aiocb. * posix/include/rtems/posix/aio_misc.h: New. --- cpukit/posix/Makefile.am | 3 +- cpukit/posix/include/aio.h | 4 ++ cpukit/posix/include/rtems/posix/aio_misc.h | 101 ++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 cpukit/posix/include/rtems/posix/aio_misc.h (limited to 'cpukit/posix') diff --git a/cpukit/posix/Makefile.am b/cpukit/posix/Makefile.am index f71b34b48a..463705e688 100644 --- a/cpukit/posix/Makefile.am +++ b/cpukit/posix/Makefile.am @@ -24,12 +24,11 @@ include_rtems_posix_HEADERS = include/rtems/posix/sigset.h if HAS_PTHREADS # include - include_HEADERS = include/aio.h include/mqueue.h \ include/semaphore.h include/devctl.h # include/rtems/posix - +include_rtems_posix_HEADERS += include/rtems/posix/aio_misc.h include_rtems_posix_HEADERS += include/rtems/posix/cancel.h \ include/rtems/posix/cond.h include/rtems/posix/config.h \ diff --git a/cpukit/posix/include/aio.h b/cpukit/posix/include/aio.h index 7472d8a54d..bc74126287 100644 --- a/cpukit/posix/include/aio.h +++ b/cpukit/posix/include/aio.h @@ -60,6 +60,7 @@ extern "C" { */ struct aiocb { + /* public */ int aio_fildes; /* File descriptor */ off_t aio_offset; /* File offset */ volatile void *aio_buf; /* Location of buffer */ @@ -67,6 +68,9 @@ struct aiocb { int aio_reqprio; /* Request priority offset */ struct sigevent aio_sigevent; /* Signal number and value */ int aio_lio_opcode; /* Operation to be performed */ + /* private */ + int error_code; /* Used for aio_error() */ + ssize_t return_value; /* Used for aio_return() */ }; /* diff --git a/cpukit/posix/include/rtems/posix/aio_misc.h b/cpukit/posix/include/rtems/posix/aio_misc.h new file mode 100644 index 0000000000..3adbd11cac --- /dev/null +++ b/cpukit/posix/include/rtems/posix/aio_misc.h @@ -0,0 +1,101 @@ +/* + * Copyright 2010, Alin Rus + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + + +#ifndef _AIO_MISC_H +#define _AIO_MISC_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + /* Actual request being processed */ + typedef struct rtems_aio_request_s + { + int policy; /* If _POSIX_PRIORITIZED_IO and + _POSIX_PRIORITY_SCHEDULING are defined */ + int priority; /* see above */ + rtems_chain_node next_prio; /* chain requests in order of priority */ + pthread_t caller_thread; /* used for notification */ + struct aiocb *aiocbp; /* aio control block */ + } rtems_aio_request; + + typedef struct rtems_aio_request_chain_s + { + int fildes; /* file descriptor to be processed */ + int new_fd; /* if this is a newly created chain */ + rtems_chain_node next_fd; /* order fd chains in queue */ + rtems_chain_control perfd; /* chain of requests for this fd */ + pthread_mutex_t mutex; + pthread_cond_t cond; + + } rtems_aio_request_chain; + + typedef struct rtems_aio_queue_s + { + pthread_mutex_t mutex; + pthread_cond_t new_req; + pthread_attr_t attr; + + rtems_chain_control work_req; /* chains being worked by active threads */ + rtems_chain_control idle_req; /* fd chains waiting to be processed */ + unsigned int initialized; /* specific value if queue is initialized */ + int size; + int active_threads; /* the number of active threads */ + int idle_threads; /* number of idle threads */ + + } rtems_aio_queue; + +#define AIO_QUEUE_INITIALIZED 0xB00B + +#ifndef AIO_MAX_THREADS +#define AIO_MAX_THREADS 5 +#endif + +#ifndef AIO_MAX_QUEUE_SIZE +#define AIO_MAX_QUEUE_SIZE 30 +#endif + +extern int rtems_aio_init (void); +extern int rtems_aio_enqueue (rtems_aio_request * req); +extern rtems_aio_request_chain *rtems_aio_search_fd (rtems_chain_control * + chain, int fildes, + int create); + +#ifdef RTEMS_DEBUG +#include + +#define AIO_assert(_x) assert(_x) +#define AIO_printf(_x) printf(_x) +#else +#define AIO_assert(_x) +#define AIO_printf(_x) +#endif + +#define rtems_aio_set_errno_return_minus_one( _error, _aiocbp ) \ + do { (_aiocbp)->error_code = (_error); \ + (_aiocbp)->return_value = -1; \ + rtems_set_errno_and_return_minus_one (_error);} while(0) + +#ifdef __cplusplus +} +#endif + +#endif -- cgit v1.2.3