Update copyright notices with scripts/update-copyrights
[jlayton/glibc.git] / sysdeps / pthread / aio_misc.h
1 /* Copyright (C) 1997-2014 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <http://www.gnu.org/licenses/>.  */
17
18 #ifndef _AIO_MISC_H
19 #define _AIO_MISC_H     1
20
21 #include <aio.h>
22 #include <pthread.h>
23
24
25 /* Extend the operation enum.  */
26 enum
27 {
28   LIO_DSYNC = LIO_NOP + 1,
29   LIO_SYNC,
30   LIO_READ64 = LIO_READ | 128,
31   LIO_WRITE64 = LIO_WRITE | 128
32 };
33
34
35 /* Union of the two request types.  */
36 typedef union
37   {
38     struct aiocb aiocb;
39     struct aiocb64 aiocb64;
40   } aiocb_union;
41
42
43 /* Used to synchronize.  */
44 struct waitlist
45   {
46     struct waitlist *next;
47
48     /* The next two fields is used in synchronous `lio_listio' operations.  */
49 #ifndef DONT_NEED_AIO_MISC_COND
50     pthread_cond_t *cond;
51 #endif
52     int *result;
53
54     volatile int *counterp;
55     /* The next field is used in asynchronous `lio_listio' operations.  */
56     struct sigevent *sigevp;
57 #ifdef BROKEN_THREAD_SIGNALS
58     /* XXX See requestlist, it's used to work around the broken signal
59        handling in Linux.  */
60     pid_t caller_pid;
61 #endif
62   };
63
64
65 /* Status of a request.  */
66 enum
67 {
68   no,
69   queued,
70   yes,
71   allocated,
72   done
73 };
74
75
76 /* Used to queue requests..  */
77 struct requestlist
78   {
79     int running;
80
81     struct requestlist *last_fd;
82     struct requestlist *next_fd;
83     struct requestlist *next_prio;
84     struct requestlist *next_run;
85
86     /* Pointer to the actual data.  */
87     aiocb_union *aiocbp;
88
89 #ifdef BROKEN_THREAD_SIGNALS
90     /* PID of the initiator thread.
91        XXX This is only necessary for the broken signal handling on Linux.  */
92     pid_t caller_pid;
93 #endif
94
95     /* List of waiting processes.  */
96     struct waitlist *waiting;
97   };
98
99
100 /* Lock for global I/O list of requests.  */
101 extern pthread_mutex_t __aio_requests_mutex attribute_hidden;
102
103
104 /* Enqueue request.  */
105 extern struct requestlist *__aio_enqueue_request (aiocb_union *aiocbp,
106                                                   int operation)
107      attribute_hidden internal_function;
108
109 /* Find request entry for given AIO control block.  */
110 extern struct requestlist *__aio_find_req (aiocb_union *elem)
111      attribute_hidden internal_function;
112
113 /* Find request entry for given file descriptor.  */
114 extern struct requestlist *__aio_find_req_fd (int fildes)
115      attribute_hidden internal_function;
116
117 /* Remove request from the list.  */
118 extern void __aio_remove_request (struct requestlist *last,
119                                   struct requestlist *req, int all)
120      attribute_hidden internal_function;
121
122 /* Release the entry for the request.  */
123 extern void __aio_free_request (struct requestlist *req)
124      attribute_hidden internal_function;
125
126 /* Notify initiator of request and tell this everybody listening.  */
127 extern void __aio_notify (struct requestlist *req)
128      attribute_hidden internal_function;
129
130 /* Notify initiator of request.  */
131 #ifdef BROKEN_THREAD_SIGNALS
132 extern int __aio_notify_only (struct sigevent *sigev, pid_t caller_pid)
133      attribute_hidden internal_function;
134 #else
135 extern int __aio_notify_only (struct sigevent *sigev)
136      attribute_hidden internal_function;
137 #endif
138
139 /* Send the signal.  */
140 extern int __aio_sigqueue (int sig, const union sigval val, pid_t caller_pid)
141      attribute_hidden internal_function;
142
143 #endif /* aio_misc.h */