Welcome to mirror list, hosted at ThFree Co, Russian Federation.

select.h « local_includes « cygwin « winsup - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: b794690b6c0dce9d1edf2c1c902fc9dbb305d00f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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
124
125
126
127
128
129
130
131
132
133
134
135
/* select.h

This file is part of Cygwin.

This software is a copyrighted work licensed under the terms of the
Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
details. */

#ifndef _SELECT_H_
#define _SELECT_H_

struct fh_select_data_serial
{
  DWORD event;
  OVERLAPPED ov;

  fh_select_data_serial () : event (0) { memset (&ov, 0, sizeof ov); }
};

struct select_record
{
  int fd;
  HANDLE h;
  fhandler_base *fh;
  _cygtls *tls;
  int thread_errno;
  bool windows_handle;
  bool read_ready, write_ready, except_ready;
  bool read_selected, write_selected, except_selected;
  bool except_on_write;
  int (*startup) (select_record *, class select_stuff *);
  int (*peek) (select_record *, bool);
  int (*verify) (select_record *, fd_set *, fd_set *, fd_set *);
  void (*cleanup) (select_record *, class select_stuff *);
  struct select_record *next;
  /* If an fhandler type needs per-fhandler, per-select data, this union
     is the place to add it.  First candidate: fhandler_serial. */
  union
  {
    fh_select_data_serial *fh_data_serial;
    void *fh_data_union; /* type-agnostic placeholder for constructor */
  };
  void set_select_errno () {__seterrno (); thread_errno = errno;}
  int saw_error () {return thread_errno;}
  select_record (int): next (NULL) {}
  select_record () :
    fd (0), h (NULL), fh (NULL), tls (&_my_tls), thread_errno (0),
    windows_handle (false), read_ready (false), write_ready (false),
    except_ready (false), read_selected (false), write_selected (false),
    except_selected (false), except_on_write (false),
    startup (NULL), peek (NULL), verify (NULL), cleanup (NULL),
    next (NULL), fh_data_union (NULL) {}
#ifdef DEBUGGING
  void dump_select_record ();
#endif
};

struct select_info
{
  cygthread *thread;
  bool stop_thread;
  HANDLE bye;
  select_record *start;
  select_info (): thread (NULL), stop_thread (0), start (NULL) {}
};

struct select_console_info: public select_info
{
  select_console_info (): select_info () {}
};

struct select_pipe_info: public select_info
{
  select_pipe_info (): select_info () {}
};

struct select_fifo_info: public select_info
{
  select_fifo_info (): select_info () {}
};

struct select_socket_info: public select_info
{
  int num_w4;
  LONG *ser_num;
  HANDLE *w4;
  select_socket_info (): select_info (), num_w4 (0), ser_num (0), w4 (NULL) {}
};

class select_stuff
{
public:
  enum wait_states
  {
    select_signalled = -3,
    select_error = -1,
    select_ok = 0,
    select_set_zero = 1
  };

  ~select_stuff ();
  bool return_on_signal;
  bool always_ready, windows_used;
  select_record start;

  /* If an fhandler type needs a singleton per-select datastructure for all
     its objects in the descriptor lists, here's the place to be.  This is
     mainly used to maintain a single thread for all fhandlers of a single
     type in the descriptor lists. */
  select_console_info *device_specific_console;
  select_pipe_info *device_specific_pipe;
  select_pipe_info *device_specific_ptys;
  select_fifo_info *device_specific_fifo;
  select_socket_info *device_specific_socket;

  bool test_and_set (int, fd_set *, fd_set *, fd_set *);
  int poll (fd_set *, fd_set *, fd_set *);
  wait_states wait (fd_set *, fd_set *, fd_set *, LONGLONG);
  void cleanup ();
  void destroy ();

  select_stuff (): return_on_signal (false), always_ready (false),
		   windows_used (false), start (),
		   device_specific_console (NULL),
		   device_specific_pipe (NULL),
		   device_specific_ptys (NULL),
		   device_specific_fifo (NULL),
		   device_specific_socket (NULL)
		   {}
};

extern "C" int cygwin_select (int , fd_set *, fd_set *, fd_set *,
			      struct timeval *to);

#endif /* _SELECT_H_ */