poll.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _LINUX_POLL_H
  2. #define _LINUX_POLL_H
  3. #include <asm/poll.h>
  4. #ifdef __KERNEL__
  5. #include <linux/wait.h>
  6. #include <linux/string.h>
  7. #include <linux/mm.h>
  8. #include <asm/uaccess.h>
  9. struct poll_table_page;
  10. typedef struct poll_table_struct {
  11. int error;
  12. struct poll_table_page * table;
  13. } poll_table;
  14. extern void __pollwait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p);
  15. static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
  16. {
  17. if (p && wait_address)
  18. __pollwait(filp, wait_address, p);
  19. }
  20. static inline void poll_initwait(poll_table* pt)
  21. {
  22. pt->error = 0;
  23. pt->table = NULL;
  24. }
  25. extern void poll_freewait(poll_table* pt);
  26. /*
  27.  * Scaleable version of the fd_set.
  28.  */
  29. typedef struct {
  30. unsigned long *in, *out, *ex;
  31. unsigned long *res_in, *res_out, *res_ex;
  32. } fd_set_bits;
  33. /*
  34.  * How many longwords for "nr" bits?
  35.  */
  36. #define FDS_BITPERLONG (8*sizeof(long))
  37. #define FDS_LONGS(nr) (((nr)+FDS_BITPERLONG-1)/FDS_BITPERLONG)
  38. #define FDS_BYTES(nr) (FDS_LONGS(nr)*sizeof(long))
  39. /*
  40.  * We do a VERIFY_WRITE here even though we are only reading this time:
  41.  * we'll write to it eventually..
  42.  *
  43.  * Use "unsigned long" accesses to let user-mode fd_set's be long-aligned.
  44.  */
  45. static inline
  46. int get_fd_set(unsigned long nr, void *ufdset, unsigned long *fdset)
  47. {
  48. nr = FDS_BYTES(nr);
  49. if (ufdset) {
  50. int error;
  51. error = verify_area(VERIFY_WRITE, ufdset, nr);
  52. if (!error && __copy_from_user(fdset, ufdset, nr))
  53. error = -EFAULT;
  54. return error;
  55. }
  56. memset(fdset, 0, nr);
  57. return 0;
  58. }
  59. static inline
  60. void set_fd_set(unsigned long nr, void *ufdset, unsigned long *fdset)
  61. {
  62. if (ufdset)
  63. __copy_to_user(ufdset, fdset, FDS_BYTES(nr));
  64. }
  65. static inline
  66. void zero_fd_set(unsigned long nr, unsigned long *fdset)
  67. {
  68. memset(fdset, 0, FDS_BYTES(nr));
  69. }
  70. extern int do_select(int n, fd_set_bits *fds, long *timeout);
  71. #endif /* KERNEL */
  72. #endif /* _LINUX_POLL_H */