Panda3D

Loading...
Searching...
No Matches
socket_selector.h
1#ifndef __SOCKET_SELECTOR_H__
2#define __SOCKET_SELECTOR_H__
3
4// This is a structure on purpose. only used as a helper class to save on
5// typing
6 struct Socket_Selector
7{
8 Socket_fdset _read;
9 Socket_fdset _write;
10 Socket_fdset _error;
11 int _answer;
12
13 Socket_Selector() : _answer( -1)
14 {
15 }
16
17 Socket_Selector(const Socket_fdset &fd) : _read(fd), _write(fd), _error(fd) , _answer( -1)
18 {
19 }
20
21 int WaitFor(const Time_Span &timeout);
22 int WaitFor_All(const Socket_fdset & fd, const Time_Span & timeout);
23 int WaitFor_Read_Error(const Socket_fdset & fd, const Time_Span & timeout);
24 int WaitFor_Write_Error(const Socket_fdset & fd, const Time_Span & timeout);
25};
26
27/**
28 * This function is the reason this call exists.. It will wait for a read,
29 * write or error condition on a socket or it will time out
30 */
31 inline int Socket_Selector::WaitFor(const Time_Span &timeout)
32{
33 SOCKET local_max = 0;
34 if (local_max < _read._maxid)
35 local_max = _read._maxid;
36 if (local_max < _write._maxid)
37 local_max = _write._maxid;
38 if (local_max < _error._maxid)
39 local_max = _error._maxid;
40
41 timeval localtv = timeout.GetTval();
42 _answer = DO_SELECT(local_max + 1, &_read._the_set, &_write._the_set, &_error._the_set, &localtv);
43 return _answer;
44}
45
46/**
47 * Helper function to utilize the WaitFor function
48 */
49 inline int Socket_Selector::WaitFor_All(const Socket_fdset & fd, const Time_Span & timeout)
50{
51 _read = fd;
52 _write = fd;
53 _error = fd;
54 return WaitFor(timeout);
55}
56
57/**
58 * Helper function for WaitFor Only looks for readability and errors
59 */
60 inline int Socket_Selector::WaitFor_Read_Error(const Socket_fdset & fd, const Time_Span & timeout)
61{
62 _read = fd;
63 _write.clear();
64 _error = fd;
65 return WaitFor(timeout);
66}
67
68/**
69 * Helper function for WaitFor Only looks for writability and errors
70 */
71 inline int Socket_Selector::WaitFor_Write_Error(const Socket_fdset & fd, const Time_Span & timeout)
72{
73 _read.clear();
74 _write = fd;
75 _error = fd;
76 return WaitFor(timeout);
77}
78
79#endif //__SOCKET_SELECTOR_H__
Socket_fdset
Definition socket_fdset.h:16
Socket_fdset::clear
void clear()
Marks the content as empty.
Definition socket_fdset.h:124
Time_Span
Definition time_span.h:7
Socket_Selector::WaitFor_Write_Error
int WaitFor_Write_Error(const Socket_fdset &fd, const Time_Span &timeout)
Helper function for WaitFor Only looks for writability and errors.
Definition socket_selector.h:71
Socket_Selector::WaitFor_All
int WaitFor_All(const Socket_fdset &fd, const Time_Span &timeout)
Helper function to utilize the WaitFor function.
Definition socket_selector.h:49
Socket_Selector::WaitFor_Read_Error
int WaitFor_Read_Error(const Socket_fdset &fd, const Time_Span &timeout)
Helper function for WaitFor Only looks for readability and errors.
Definition socket_selector.h:60
Socket_Selector::WaitFor
int WaitFor(const Time_Span &timeout)
This function is the reason this call exists.
Definition socket_selector.h:31