summaryrefslogtreecommitdiffstats
path: root/cpukit/posix
diff options
context:
space:
mode:
authorRalf Corsepius <ralf.corsepius@rtems.org>2010-08-16 05:39:59 +0000
committerRalf Corsepius <ralf.corsepius@rtems.org>2010-08-16 05:39:59 +0000
commite501d79f46c347203a912332b5892836054335a0 (patch)
treed911feb87477659938e6bf793623d9d1a5b47b2a /cpukit/posix
parent2010-08-16 Alin Rus <alin.codejunkie@gmail.com> (diff)
downloadrtems-e501d79f46c347203a912332b5892836054335a0.tar.bz2
2010-08-16 Alin Rus <alin.codejunkie@gmail.com>
* posix/include/aio.h: Extend struct aiocb. * posix/include/rtems/posix/aio_misc.h: New.
Diffstat (limited to 'cpukit/posix')
-rw-r--r--cpukit/posix/Makefile.am3
-rw-r--r--cpukit/posix/include/aio.h4
-rw-r--r--cpukit/posix/include/rtems/posix/aio_misc.h101
3 files changed, 106 insertions, 2 deletions
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 <alin.codejunkie@gmail.com>
+ *
+ * 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 <stdio.h>
+#include <string.h>
+#include <aio.h>
+#include <pthread.h>
+#include <rtems.h>
+#include <rtems/chain.h>
+#include <rtems/system.h>
+#include <rtems/seterr.h>
+
+#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 <assert.h>
+
+#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