Skip to content

Commit 211ae97

Browse files
committed
add implementations for eventloop functions sock_*
1 parent 5747a3a commit 211ae97

File tree

2 files changed

+50
-9
lines changed

2 files changed

+50
-9
lines changed

include/boost/python/eventloop.hpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ class event_loop
6767
}
6868

6969

70-
void sock_recv(object sock, int bytes);
70+
object sock_recv(object sock, size_t nbytes);
7171

72-
void sock_recv_into(object sock, object buffer);
72+
size_t sock_recv_into(object sock, object buffer);
7373

74-
void sock_sendall(object sock, object data);
74+
object sock_sendall(object sock, object data);
7575

7676
void sock_connect(object sock, object address);
7777

src/eventloop.cpp

+47-6
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,28 @@
1111
#include <boost/bind.hpp>
1212
#include <boost/python.hpp>
1313
#include <boost/python/eventloop.hpp>
14+
#include <boost/mpl/vector.hpp>
15+
#include <Python.h>
1416

1517

1618
namespace boost { namespace python { namespace asio {
19+
namespace
20+
{
21+
22+
void _sock_recv_handler(std::promise<std::vector<char>>& prom, size_t nbytes, int fd, size_t& nbytes_read)
23+
{
24+
std::vector<char> buffer(nbytes);
25+
nbytes_read = read(fd, buffer.data(), nbytes);
26+
prom.set_value(std::move(buffer));
27+
}
28+
29+
void _sock_send_handler(std::promise<size_t>& prom, int fd, const char *py_str, size_t len)
30+
{
31+
size_t nwrite = write(fd, py_str, len);
32+
prom.set_value(nwrite);
33+
}
34+
35+
}
1736

1837
void event_loop::_add_reader_or_writer(int fd, object f, int key)
1938
{
@@ -76,19 +95,41 @@ void event_loop::call_at(double when, object f)
7695
return call_soon(f);
7796
}
7897

79-
void event_loop::sock_recv(object sock, int bytes)
98+
object event_loop::sock_recv(object sock, size_t nbytes)
8099
{
81-
100+
int fd = extract<int>(sock.attr("fileno")());
101+
std::promise<std::vector<char>> prom;
102+
std::future<std::vector<char>> fut = prom.get_future();
103+
size_t nbytes_read;
104+
add_reader(fd, make_function(bind(_sock_recv_handler, std::ref(prom), nbytes, fd, nbytes_read),
105+
default_call_policies(), boost::mpl::vector<void, object>()));
106+
return object(handle<>(PyBytes_FromStringAndSize(fut.get().data(), nbytes)));
82107
}
83108

84-
void event_loop::sock_recv_into(object sock, object buffer)
109+
size_t event_loop::sock_recv_into(object sock, object buffer)
85110
{
86-
111+
int fd = extract<int>(sock.attr("fileno")());
112+
size_t nbytes = extract<size_t>(buffer.attr("__len__")());
113+
std::promise<std::vector<char>> prom;
114+
std::future<std::vector<char>> fut = prom.get_future();
115+
size_t nbytes_read;
116+
add_reader(fd, make_function(bind(_sock_recv_handler, std::ref(prom), nbytes, fd, nbytes_read),
117+
default_call_policies(), boost::mpl::vector<void, object>()));
118+
buffer = object(handle<>(PyBytes_FromStringAndSize(fut.get().data(), nbytes)));
119+
return nbytes_read;
87120
}
88121

89-
void event_loop::sock_sendall(object sock, object data)
122+
object event_loop::sock_sendall(object sock, object data)
90123
{
91-
124+
int fd = extract<int>(sock.attr("fileno")());
125+
char const* py_str = extract<char const*>(data.attr("decode")());
126+
size_t len = extract<size_t>(data.attr("__len__")());
127+
std::promise<size_t> prom;
128+
std::future<size_t> fut = prom.get_future();
129+
add_writer(fd, make_function(bind(_sock_send_handler, std::ref(prom), fd, py_str, len),
130+
default_call_policies(), boost::mpl::vector<void, object>()));
131+
fut.wait();
132+
return object();
92133
}
93134

94135
void event_loop::sock_connect(object sock, object address)

0 commit comments

Comments
 (0)