LCOV - code coverage report
Current view: top level - include/linux - poll.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 10 10 100.0 %
Date: 2014-02-18 Functions: 0 0 -
Branches: 37 47 78.7 %

           Branch data     Line data    Source code
       1                 :            : #ifndef _LINUX_POLL_H
       2                 :            : #define _LINUX_POLL_H
       3                 :            : 
       4                 :            : 
       5                 :            : #include <linux/compiler.h>
       6                 :            : #include <linux/ktime.h>
       7                 :            : #include <linux/wait.h>
       8                 :            : #include <linux/string.h>
       9                 :            : #include <linux/fs.h>
      10                 :            : #include <linux/sysctl.h>
      11                 :            : #include <asm/uaccess.h>
      12                 :            : #include <uapi/linux/poll.h>
      13                 :            : 
      14                 :            : extern struct ctl_table epoll_table[]; /* for sysctl */
      15                 :            : /* ~832 bytes of stack space used max in sys_select/sys_poll before allocating
      16                 :            :    additional memory. */
      17                 :            : #define MAX_STACK_ALLOC 832
      18                 :            : #define FRONTEND_STACK_ALLOC    256
      19                 :            : #define SELECT_STACK_ALLOC      FRONTEND_STACK_ALLOC
      20                 :            : #define POLL_STACK_ALLOC        FRONTEND_STACK_ALLOC
      21                 :            : #define WQUEUES_STACK_ALLOC     (MAX_STACK_ALLOC - FRONTEND_STACK_ALLOC)
      22                 :            : #define N_INLINE_POLL_ENTRIES   (WQUEUES_STACK_ALLOC / sizeof(struct poll_table_entry))
      23                 :            : 
      24                 :            : #define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
      25                 :            : 
      26                 :            : struct poll_table_struct;
      27                 :            : 
      28                 :            : /* 
      29                 :            :  * structures and helpers for f_op->poll implementations
      30                 :            :  */
      31                 :            : typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);
      32                 :            : 
      33                 :            : /*
      34                 :            :  * Do not touch the structure directly, use the access functions
      35                 :            :  * poll_does_not_wait() and poll_requested_events() instead.
      36                 :            :  */
      37                 :            : typedef struct poll_table_struct {
      38                 :            :         poll_queue_proc _qproc;
      39                 :            :         unsigned long _key;
      40                 :            : } poll_table;
      41                 :            : 
      42                 :            : static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
      43                 :            : {
      44 [ +  - ][ +  + ]:     909598 :         if (p && p->_qproc && wait_address)
         [ +  - ][ +  + ]
         [ +  + ][ +  - ]
         [ #  # ][ #  # ]
                 [ #  # ]
      45                 :     335009 :                 p->_qproc(filp, wait_address, p);
      46                 :            : }
      47                 :            : 
      48                 :            : /*
      49                 :            :  * Return true if it is guaranteed that poll will not wait. This is the case
      50                 :            :  * if the poll() of another file descriptor in the set got an event, so there
      51                 :            :  * is no need for waiting.
      52                 :            :  */
      53                 :            : static inline bool poll_does_not_wait(const poll_table *p)
      54                 :            : {
      55                 :            :         return p == NULL || p->_qproc == NULL;
      56                 :            : }
      57                 :            : 
      58                 :            : /*
      59                 :            :  * Return the set of events that the application wants to poll for.
      60                 :            :  * This is useful for drivers that need to know whether a DMA transfer has
      61                 :            :  * to be started implicitly on poll(). You typically only want to do that
      62                 :            :  * if the application is actually polling for POLLIN and/or POLLOUT.
      63                 :            :  */
      64                 :            : static inline unsigned long poll_requested_events(const poll_table *p)
      65                 :            : {
      66                 :            :         return p ? p->_key : ~0UL;
      67                 :            : }
      68                 :            : 
      69                 :            : static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc)
      70                 :            : {
      71                 :     198678 :         pt->_qproc = qproc;
      72                 :     198678 :         pt->_key   = ~0UL; /* all events enabled */
      73                 :            : }
      74                 :            : 
      75                 :            : struct poll_table_entry {
      76                 :            :         struct file *filp;
      77                 :            :         unsigned long key;
      78                 :            :         wait_queue_t wait;
      79                 :            :         wait_queue_head_t *wait_address;
      80                 :            : };
      81                 :            : 
      82                 :            : /*
      83                 :            :  * Structures and helpers for select/poll syscall
      84                 :            :  */
      85                 :            : struct poll_wqueues {
      86                 :            :         poll_table pt;
      87                 :            :         struct poll_table_page *table;
      88                 :            :         struct task_struct *polling_task;
      89                 :            :         int triggered;
      90                 :            :         int error;
      91                 :            :         int inline_index;
      92                 :            :         struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES];
      93                 :            : };
      94                 :            : 
      95                 :            : extern void poll_initwait(struct poll_wqueues *pwq);
      96                 :            : extern void poll_freewait(struct poll_wqueues *pwq);
      97                 :            : extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
      98                 :            :                                  ktime_t *expires, unsigned long slack);
      99                 :            : extern long select_estimate_accuracy(struct timespec *tv);
     100                 :            : 
     101                 :            : 
     102                 :            : static inline int poll_schedule(struct poll_wqueues *pwq, int state)
     103                 :            : {
     104                 :            :         return poll_schedule_timeout(pwq, state, NULL, 0);
     105                 :            : }
     106                 :            : 
     107                 :            : /*
     108                 :            :  * Scalable version of the fd_set.
     109                 :            :  */
     110                 :            : 
     111                 :            : typedef struct {
     112                 :            :         unsigned long *in, *out, *ex;
     113                 :            :         unsigned long *res_in, *res_out, *res_ex;
     114                 :            : } fd_set_bits;
     115                 :            : 
     116                 :            : /*
     117                 :            :  * How many longwords for "nr" bits?
     118                 :            :  */
     119                 :            : #define FDS_BITPERLONG  (8*sizeof(long))
     120                 :            : #define FDS_LONGS(nr)   (((nr)+FDS_BITPERLONG-1)/FDS_BITPERLONG)
     121                 :            : #define FDS_BYTES(nr)   (FDS_LONGS(nr)*sizeof(long))
     122                 :            : 
     123                 :            : /*
     124                 :            :  * We do a VERIFY_WRITE here even though we are only reading this time:
     125                 :            :  * we'll write to it eventually..
     126                 :            :  *
     127                 :            :  * Use "unsigned long" accesses to let user-mode fd_set's be long-aligned.
     128                 :            :  */
     129                 :            : static inline
     130                 :            : int get_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
     131                 :            : {
     132                 :            :         nr = FDS_BYTES(nr);
     133 [ +  + ][ +  + ]:     590407 :         if (ufdset)
                 [ +  + ]
     134 [ +  + ][ +  + ]:     436563 :                 return copy_from_user(fdset, ufdset, nr) ? -EFAULT : 0;
                    [ + ]
     135                 :            : 
     136 [ +  - ][ +  + ]:     153841 :         memset(fdset, 0, nr);
                 [ +  + ]
     137                 :            :         return 0;
     138                 :            : }
     139                 :            : 
     140                 :            : static inline unsigned long __must_check
     141                 :            : set_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
     142                 :            : {
     143 [ +  + ][ +  + ]:     588015 :         if (ufdset)
                 [ +  + ]
     144                 :     434899 :                 return __copy_to_user(ufdset, fdset, FDS_BYTES(nr));
     145                 :            :         return 0;
     146                 :            : }
     147                 :            : 
     148                 :            : static inline
     149                 :            : void zero_fd_set(unsigned long nr, unsigned long *fdset)
     150                 :            : {
     151 [ +  + ][ +  + ]:     196800 :         memset(fdset, 0, FDS_BYTES(nr));
                 [ +  + ]
     152                 :            : }
     153                 :            : 
     154                 :            : #define MAX_INT64_SECONDS (((s64)(~((u64)0)>>1)/HZ)-1)
     155                 :            : 
     156                 :            : extern int do_select(int n, fd_set_bits *fds, struct timespec *end_time);
     157                 :            : extern int do_sys_poll(struct pollfd __user * ufds, unsigned int nfds,
     158                 :            :                        struct timespec *end_time);
     159                 :            : extern int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
     160                 :            :                            fd_set __user *exp, struct timespec *end_time);
     161                 :            : 
     162                 :            : extern int poll_select_set_timeout(struct timespec *to, long sec, long nsec);
     163                 :            : 
     164                 :            : #endif /* _LINUX_POLL_H */

Generated by: LCOV version 1.9