(root)/
glibc-2.38/
sysdeps/
generic/
aio_misc.h
       1  /* Copyright (C) 1997-2023 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 _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 unsigned int *counterp;
      55      /* The next field is used in asynchronous `lio_listio' operations.  */
      56      struct sigevent *sigevp;
      57    };
      58  
      59  
      60  /* Status of a request.  */
      61  enum
      62  {
      63    no,
      64    queued,
      65    yes,
      66    allocated,
      67    done
      68  };
      69  
      70  
      71  /* Used to queue requests..  */
      72  struct requestlist
      73    {
      74      int running;
      75  
      76      struct requestlist *last_fd;
      77      struct requestlist *next_fd;
      78      struct requestlist *next_prio;
      79      struct requestlist *next_run;
      80  
      81      /* Pointer to the actual data.  */
      82      aiocb_union *aiocbp;
      83  
      84      /* List of waiting processes.  */
      85      struct waitlist *waiting;
      86    };
      87  
      88  
      89  /* Lock for global I/O list of requests.  */
      90  extern pthread_mutex_t __aio_requests_mutex attribute_hidden;
      91  
      92  
      93  /* Enqueue request.  */
      94  extern struct requestlist *__aio_enqueue_request (aiocb_union *aiocbp,
      95  						  int operation)
      96    attribute_hidden;
      97  
      98  /* Find request entry for given AIO control block.  */
      99  extern struct requestlist *__aio_find_req (aiocb_union *elem) attribute_hidden;
     100  
     101  /* Find request entry for given file descriptor.  */
     102  extern struct requestlist *__aio_find_req_fd (int fildes) attribute_hidden;
     103  
     104  /* Remove request from the list.  */
     105  extern void __aio_remove_request (struct requestlist *last,
     106  				  struct requestlist *req, int all)
     107    attribute_hidden;
     108  
     109  /* Release the entry for the request.  */
     110  extern void __aio_free_request (struct requestlist *req) attribute_hidden;
     111  
     112  /* Notify initiator of request and tell this everybody listening.  */
     113  extern void __aio_notify (struct requestlist *req) attribute_hidden;
     114  
     115  /* Notify initiator of request.  */
     116  extern int __aio_notify_only (struct sigevent *sigev) attribute_hidden;
     117  
     118  /* Send the signal.  */
     119  extern int __aio_sigqueue (int sig, const union sigval val, pid_t caller_pid)
     120    attribute_hidden;
     121  
     122  #endif /* aio_misc.h */