1 /* Copyright (C) 2001-2022 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 <https://www.gnu.org/licenses/>. */ 17 18 #ifndef _GAI_MISC_H 19 #define _GAI_MISC_H 1 20 21 #include <netdb.h> 22 #include <signal.h> 23 24 25 /* Used to synchronize. */ 26 struct waitlist 27 { 28 struct waitlist *next; 29 30 #ifndef DONT_NEED_GAI_MISC_COND 31 pthread_cond_t *cond; 32 #endif 33 volatile unsigned int *counterp; 34 /* The next field is used in asynchronous `lio_listio' operations. */ 35 struct sigevent *sigevp; 36 /* XXX See requestlist, it's used to work around the broken signal 37 handling in Linux. */ 38 pid_t caller_pid; 39 }; 40 41 42 /* Used to queue requests.. */ 43 struct requestlist 44 { 45 int running; 46 47 struct requestlist *next; 48 49 /* Pointer to the actual data. */ 50 struct gaicb *gaicbp; 51 52 /* List of waiting processes. */ 53 struct waitlist *waiting; 54 }; 55 56 /* To customize the implementation one can use the following struct. 57 This implementation follows the one in Irix. */ 58 struct gaiinit 59 { 60 int gai_threads; /* Maximal number of threads. */ 61 int gai_num; /* Number of expected simultanious requests. */ 62 int gai_locks; /* Not used. */ 63 int gai_usedba; /* Not used. */ 64 int gai_debug; /* Not used. */ 65 int gai_numusers; /* Not used. */ 66 int gai_idle_time; /* Number of seconds before idle thread 67 terminates. */ 68 int gai_reserved; 69 }; 70 71 72 /* Lock for global I/O list of requests. */ 73 extern pthread_mutex_t __gai_requests_mutex; 74 75 76 /* Enqueue request. */ 77 extern struct requestlist *__gai_enqueue_request (struct gaicb *gaicbp) 78 attribute_hidden; 79 80 /* Find request on wait list. */ 81 extern struct requestlist *__gai_find_request (const struct gaicb *gaicbp) 82 attribute_hidden; 83 84 /* Remove request from waitlist. */ 85 extern int __gai_remove_request (struct gaicb *gaicbp) 86 attribute_hidden; 87 88 /* Notify initiator of request and tell this everybody listening. */ 89 extern void __gai_notify (struct requestlist *req) 90 attribute_hidden; 91 92 /* Notify initiator of request. */ 93 extern int __gai_notify_only (struct sigevent *sigev, pid_t caller_pid) 94 attribute_hidden; 95 96 /* Send the signal. */ 97 extern int __gai_sigqueue (int sig, const union sigval val, pid_t caller_pid); 98 libc_hidden_proto (__gai_sigqueue) 99 100 #endif /* gai_misc.h */ 101