9
9
# ifndef EVENT_LOOP_PY2021_H_
10
10
# define EVENT_LOOP_PY2021_H_
11
11
12
- #include < mutex>
13
- #include < functional>
14
12
#include < unordered_map>
15
13
#include < boost/asio.hpp>
16
- #include < boost/bind.hpp>
17
14
#include < boost/python.hpp>
18
15
19
16
namespace a = boost::asio;
@@ -32,40 +29,8 @@ class EventLoop
32
29
std::unordered_map<int , std::unique_ptr<a::posix::stream_descriptor>> _descriptor_map;
33
30
std::chrono::steady_clock::time_point _created_time;
34
31
35
- void _add_reader_or_writer (int fd, py::object f, int key)
36
- {
37
- // add descriptor
38
- if (_descriptor_map.find (key) == _descriptor_map.end ())
39
- {
40
- _descriptor_map.emplace (key,
41
- std::move (std::make_unique<a::posix::stream_descriptor>(_strand.context (), fd))
42
- );
43
- }
44
-
45
- _descriptor_map.find (key)->second ->async_wait (a::posix::descriptor::wait_type::wait_read,
46
- a::bind_executor (_strand, [key, f, loop=this ] (const boost::system ::error_code& ec)
47
- {
48
- // move descriptor
49
- auto iter = loop->_descriptor_map .find (key);
50
- if (iter != loop->_descriptor_map .end ())
51
- {
52
- iter->second ->release ();
53
- loop->_descriptor_map .erase (iter);
54
- }
55
- loop->call_soon (f);
56
- }));
57
- return ;
58
- }
59
-
60
- void _remove_reader_or_writer (int key)
61
- {
62
- auto iter = _descriptor_map.find (key);
63
- if (iter != _descriptor_map.end ())
64
- {
65
- iter->second ->release ();
66
- _descriptor_map.erase (iter);
67
- }
68
- }
32
+ void _add_reader_or_writer (int fd, py::object f, int key);
33
+ void _remove_reader_or_writer (int key);
69
34
70
35
public:
71
36
EventLoop (a::io_context& ctx):
@@ -83,98 +48,53 @@ class EventLoop
83
48
}
84
49
85
50
// TODO: implement this
86
- void call_soon_thread_safe (py::object f)
87
- {
88
- return ;
89
- }
51
+ inline void call_soon_thread_safe (py::object f) {};
90
52
91
53
// Schedule callback to be called after the given delay number of seconds
92
54
// TODO: An instance of asyncio.Handle is returned, which can be used later to cancel the callback.
93
- void call_later (double delay, py::object f)
94
- {
95
- // add timer
96
- _id_to_timer_map.emplace (_timer_id,
97
- std::move (std::make_unique<a::steady_timer>(_strand.context (),
98
- std::chrono::steady_clock::now () + std::chrono::nanoseconds (int64_t (delay * 1e9 ))))
99
- );
100
-
101
- _id_to_timer_map.find (_timer_id)->second ->async_wait (
102
- // remove timer
103
- a::bind_executor (_strand, [id=_timer_id, f, loop=this ] (const boost::system ::error_code& ec)
104
- {
105
- loop->_id_to_timer_map .erase (id);
106
- loop->call_soon (f);
107
- }));
108
- _timer_id++;
109
- }
55
+ void call_later (double delay, py::object f);
110
56
111
- void call_at (double when, py::object f)
112
- {
113
- double diff = when - time ();
114
- if (diff > 0 )
115
- return call_later (diff, f);
116
- return call_soon (f);
117
- }
57
+ void call_at (double when, py::object f);
118
58
119
- double time ()
59
+ inline double time ()
120
60
{
121
- auto now = std::chrono::steady_clock::now ();
122
- std::chrono::duration<double > diff = now - _created_time;
123
- return diff.count ();
61
+ return static_cast <std::chrono::duration<double >>(std::chrono::steady_clock::now () - _created_time).count ();
124
62
}
125
63
126
64
// week 2 ......start......
127
65
128
- void add_reader (int fd, py::object f)
66
+ inline void add_reader (int fd, py::object f)
129
67
{
130
68
_add_reader_or_writer (fd, f, fd * 2 );
131
69
}
132
70
133
- void remove_reader (int fd)
71
+ inline void remove_reader (int fd)
134
72
{
135
73
_remove_reader_or_writer (fd * 2 );
136
74
}
137
75
138
- void add_writer (int fd, py::object f)
76
+ inline void add_writer (int fd, py::object f)
139
77
{
140
78
_add_reader_or_writer (fd, f, fd * 2 + 1 );
141
79
}
142
80
143
- void remove_writer (int fd)
81
+ inline void remove_writer (int fd)
144
82
{
145
83
_remove_reader_or_writer (fd * 2 + 1 );
146
84
}
147
85
148
86
149
- void sock_recv ()
150
- {
151
-
152
- }
153
-
154
- void sock_recv_into ()
155
- {
156
-
157
- }
158
-
159
- void sock_sendall ()
160
- {
87
+ void sock_recv (py::object sock, int bytes);
161
88
162
- }
89
+ void sock_recv_into (py::object sock, py::object buffer);
163
90
164
- void sock_connect ()
165
- {
91
+ void sock_sendall (py::object sock, py::object data);
166
92
167
- }
168
-
169
- void sock_accept ()
170
- {
93
+ void sock_connect (py::object sock, py::object address);
171
94
172
- }
173
-
174
- void sock_sendfile ()
175
- {
176
-
177
- }
95
+ void sock_accept (py::object sock);
96
+
97
+ void sock_sendfile (py::object sock, py::object file, int offset = 0 , int count = 0 , bool fallback = true );
178
98
179
99
// week 2 ......end......
180
100
0 commit comments