Blame view

include/linux/poll.h 3.68 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
  #ifndef _LINUX_POLL_H
  #define _LINUX_POLL_H
  
  #include <asm/poll.h>
  
  #ifdef __KERNEL__
  
  #include <linux/compiler.h>
a99bbaf5e   Alexey Dobriyan   headers: remove s...
9
  #include <linux/ktime.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
  #include <linux/wait.h>
  #include <linux/string.h>
f23f6e08c   Al Viro   [PATCH] severing ...
12
  #include <linux/fs.h>
9ff993394   Dave Young   sysctl extern cle...
13
  #include <linux/sysctl.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
  #include <asm/uaccess.h>
9ff993394   Dave Young   sysctl extern cle...
15
  extern struct ctl_table epoll_table[]; /* for sysctl */
70674f95c   Andi Kleen   [PATCH] Optimize ...
16
17
18
19
20
21
22
23
  /* ~832 bytes of stack space used max in sys_select/sys_poll before allocating
     additional memory. */
  #define MAX_STACK_ALLOC 832
  #define FRONTEND_STACK_ALLOC	256
  #define SELECT_STACK_ALLOC	FRONTEND_STACK_ALLOC
  #define POLL_STACK_ALLOC	FRONTEND_STACK_ALLOC
  #define WQUEUES_STACK_ALLOC	(MAX_STACK_ALLOC - FRONTEND_STACK_ALLOC)
  #define N_INLINE_POLL_ENTRIES	(WQUEUES_STACK_ALLOC / sizeof(struct poll_table_entry))
dd23aae4f   Alexey Dobriyan   Fix select on /pr...
24
  #define DEFAULT_POLLMASK (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
29
30
31
32
33
  struct poll_table_struct;
  
  /* 
   * structures and helpers for f_op->poll implementations
   */
  typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);
  
  typedef struct poll_table_struct {
  	poll_queue_proc qproc;
4938d7e02   Eric Dumazet   poll: avoid extra...
34
  	unsigned long key;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
40
41
42
43
44
45
  } poll_table;
  
  static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
  {
  	if (p && wait_address)
  		p->qproc(filp, wait_address, p);
  }
  
  static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc)
  {
  	pt->qproc = qproc;
4938d7e02   Eric Dumazet   poll: avoid extra...
46
  	pt->key   = ~0UL; /* all events enabled */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47
  }
70674f95c   Andi Kleen   [PATCH] Optimize ...
48
  struct poll_table_entry {
5f820f648   Tejun Heo   poll: allow f_op-...
49
  	struct file *filp;
4938d7e02   Eric Dumazet   poll: avoid extra...
50
  	unsigned long key;
70674f95c   Andi Kleen   [PATCH] Optimize ...
51
  	wait_queue_t wait;
5f820f648   Tejun Heo   poll: allow f_op-...
52
  	wait_queue_head_t *wait_address;
70674f95c   Andi Kleen   [PATCH] Optimize ...
53
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
  /*
dac36dd87   Namhyung Kim   poll: fix a typo ...
55
   * Structures and helpers for select/poll syscall
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
   */
  struct poll_wqueues {
  	poll_table pt;
5f820f648   Tejun Heo   poll: allow f_op-...
59
60
61
  	struct poll_table_page *table;
  	struct task_struct *polling_task;
  	int triggered;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
  	int error;
70674f95c   Andi Kleen   [PATCH] Optimize ...
63
64
  	int inline_index;
  	struct poll_table_entry inline_entries[N_INLINE_POLL_ENTRIES];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
67
68
  };
  
  extern void poll_initwait(struct poll_wqueues *pwq);
  extern void poll_freewait(struct poll_wqueues *pwq);
5f820f648   Tejun Heo   poll: allow f_op-...
69
70
  extern int poll_schedule_timeout(struct poll_wqueues *pwq, int state,
  				 ktime_t *expires, unsigned long slack);
95aac7b1c   Shawn Bohrer   epoll: make epoll...
71
  extern long select_estimate_accuracy(struct timespec *tv);
5f820f648   Tejun Heo   poll: allow f_op-...
72
73
74
75
76
  
  static inline int poll_schedule(struct poll_wqueues *pwq, int state)
  {
  	return poll_schedule_timeout(pwq, state, NULL, 0);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
  
  /*
25985edce   Lucas De Marchi   Fix common misspe...
79
   * Scalable version of the fd_set.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
   */
  
  typedef struct {
  	unsigned long *in, *out, *ex;
  	unsigned long *res_in, *res_out, *res_ex;
  } fd_set_bits;
  
  /*
   * How many longwords for "nr" bits?
   */
  #define FDS_BITPERLONG	(8*sizeof(long))
  #define FDS_LONGS(nr)	(((nr)+FDS_BITPERLONG-1)/FDS_BITPERLONG)
  #define FDS_BYTES(nr)	(FDS_LONGS(nr)*sizeof(long))
  
  /*
   * We do a VERIFY_WRITE here even though we are only reading this time:
   * we'll write to it eventually..
   *
   * Use "unsigned long" accesses to let user-mode fd_set's be long-aligned.
   */
  static inline
  int get_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
  {
  	nr = FDS_BYTES(nr);
  	if (ufdset)
  		return copy_from_user(fdset, ufdset, nr) ? -EFAULT : 0;
  
  	memset(fdset, 0, nr);
  	return 0;
  }
  
  static inline unsigned long __must_check
  set_fd_set(unsigned long nr, void __user *ufdset, unsigned long *fdset)
  {
  	if (ufdset)
  		return __copy_to_user(ufdset, fdset, FDS_BYTES(nr));
  	return 0;
  }
  
  static inline
  void zero_fd_set(unsigned long nr, unsigned long *fdset)
  {
  	memset(fdset, 0, FDS_BYTES(nr));
  }
9f72949f6   David Woodhouse   [PATCH] Add psele...
124
  #define MAX_INT64_SECONDS (((s64)(~((u64)0)>>1)/HZ)-1)
8ff3e8e85   Arjan van de Ven   select: switch se...
125
  extern int do_select(int n, fd_set_bits *fds, struct timespec *end_time);
9f72949f6   David Woodhouse   [PATCH] Add psele...
126
  extern int do_sys_poll(struct pollfd __user * ufds, unsigned int nfds,
8ff3e8e85   Arjan van de Ven   select: switch se...
127
  		       struct timespec *end_time);
a2dcb44c3   Al Viro   [PATCH] make osf_...
128
  extern int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
8ff3e8e85   Arjan van de Ven   select: switch se...
129
  			   fd_set __user *exp, struct timespec *end_time);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130

b773ad40a   Thomas Gleixner   select: add poll_...
131
  extern int poll_select_set_timeout(struct timespec *to, long sec, long nsec);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
133
134
  #endif /* KERNEL */
  
  #endif /* _LINUX_POLL_H */