Skip to content

Commit 1bfff8e

Browse files
committed
Initial gevent support
Because some cpp code ends up leaking into cython, we change the cython generator to generate cpp code.
1 parent 0bb2fe9 commit 1bfff8e

20 files changed

+881
-80
lines changed

.gitignore

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ python_pylint_venv/
1515
htmlcov/
1616
dist/
1717
*.egg
18-
py27/
19-
py3[0-9]*/
18+
py27_gevent/
19+
py27_native/
20+
py3[0-9]_gevent/
21+
py3[0-9]_native/
2022

2123
# Node installation output
2224
node_modules

setup.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@
103103
EXTRA_ENV_COMPILE_ARGS = os.environ.get('GRPC_PYTHON_CFLAGS', None)
104104
EXTRA_ENV_LINK_ARGS = os.environ.get('GRPC_PYTHON_LDFLAGS', None)
105105
if EXTRA_ENV_COMPILE_ARGS is None:
106-
EXTRA_ENV_COMPILE_ARGS = ''
106+
EXTRA_ENV_COMPILE_ARGS = ' -std=c++11'
107107
if 'win32' in sys.platform and sys.version_info < (3, 5):
108-
EXTRA_ENV_COMPILE_ARGS += ' -std=c++11'
108+
EXTRA_ENV_COMPILE_ARGS += ' -D_hypot=hypot'
109109
# We use define flags here and don't directly add to DEFINE_MACROS below to
110110
# ensure that the expert user/builder has a way of turning it off (via the
111111
# envvars) without adding yet more GRPC-specific envvars.
@@ -115,10 +115,10 @@
115115
else:
116116
EXTRA_ENV_COMPILE_ARGS += ' -D_ftime=_ftime64 -D_timeb=__timeb64'
117117
elif "linux" in sys.platform:
118-
EXTRA_ENV_COMPILE_ARGS += ' -std=c++11 -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions'
118+
EXTRA_ENV_COMPILE_ARGS += ' -std=gnu99 -fvisibility=hidden -fno-wrapv -fno-exceptions'
119119
elif "darwin" in sys.platform:
120120
EXTRA_ENV_COMPILE_ARGS += ' -fvisibility=hidden -fno-wrapv -fno-exceptions'
121-
EXTRA_ENV_COMPILE_ARGS += ' -DPB_FIELD_16BIT'
121+
EXTRA_ENV_COMPILE_ARGS += ' -DPB_FIELD_16BIT'
122122

123123
if EXTRA_ENV_LINK_ARGS is None:
124124
EXTRA_ENV_LINK_ARGS = ''
@@ -181,7 +181,7 @@
181181
CFLAGS = tuple(EXTRA_COMPILE_ARGS)
182182
if "linux" in sys.platform or "darwin" in sys.platform:
183183
pymodinit_type = 'PyObject*' if PY3 else 'void'
184-
pymodinit = '__attribute__((visibility ("default"))) {}'.format(pymodinit_type)
184+
pymodinit = 'extern "C" __attribute__((visibility ("default"))) {}'.format(pymodinit_type)
185185
DEFINE_MACROS += (('PyMODINIT_FUNC', pymodinit),)
186186
DEFINE_MACROS += (('GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK', 1),)
187187

src/core/lib/iomgr/gevent_util.h

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
*
3+
* Copyright 2018 gRPC authors.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
19+
#ifndef GRPC_CORE_LIB_IOMGR_GEVENT_UTIL_H
20+
#define GRPC_CORE_LIB_IOMGR_GEVENT_UTIL_H
21+
22+
#include <grpc/support/port_platform.h>
23+
24+
#include <grpc/impl/codegen/slice.h>
25+
#include <grpc/status.h>
26+
#include "src/core/lib/iomgr/error.h"
27+
28+
// These are only used by the gRPC Python extension for gevent
29+
// support. They are easier to define here (rather than in Cython)
30+
// because Cython doesn't handle #defines well.
31+
32+
grpc_error* grpc_socket_error(char* error) {
33+
return grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(error),
34+
GRPC_ERROR_INT_GRPC_STATUS,
35+
GRPC_STATUS_UNAVAILABLE);
36+
}
37+
38+
char* grpc_slice_buffer_start(grpc_slice_buffer* buffer, int i) {
39+
return (char*)GRPC_SLICE_START_PTR(buffer->slices[i]);
40+
}
41+
42+
int grpc_slice_buffer_length(grpc_slice_buffer* buffer, int i) {
43+
return GRPC_SLICE_LENGTH(buffer->slices[i]);
44+
}
45+
46+
#endif

src/core/lib/iomgr/port.h

+2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
#define GRPC_CORE_LIB_IOMGR_PORT_H
2323

2424
#ifdef GRPC_UV
25+
#ifndef GRPC_CUSTOM_SOCKET
2526
#define GRPC_CUSTOM_SOCKET
2627
#endif
28+
#endif
2729
#if defined(GRPC_CUSTOM_SOCKET)
2830
// Do Nothing
2931
#elif defined(GPR_MANYLINUX1)

src/core/lib/iomgr/sockaddr_utils.cc

+2
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ void grpc_string_to_sockaddr(grpc_resolved_address* out, char* addr, int port) {
204204

205205
if (grpc_inet_pton(GRPC_AF_INET6, addr, &addr6->sin6_addr) == 1) {
206206
addr6->sin6_family = GRPC_AF_INET6;
207+
addr6->sin6_flowinfo = 0;
208+
addr6->sin6_scope_id = 0;
207209
out->len = sizeof(grpc_sockaddr_in6);
208210
} else if (grpc_inet_pton(GRPC_AF_INET, addr, &addr4->sin_addr) == 1) {
209211
addr4->sin_family = GRPC_AF_INET;

src/python/grpcio/grpc/_cython/.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cygrpc.c
1+
cygrpc.cpp
22
*.a
33
*.so
44
*.dll
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
# Copyright 2017 gRPC authors.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
# distutils: language=c++
15+
16+
from libc.stdint cimport uint32_t
17+
18+
cdef extern from "grpc/impl/codegen/slice.h":
19+
struct grpc_slice_buffer:
20+
int count
21+
22+
cdef extern from "src/core/lib/iomgr/error.h":
23+
struct grpc_error:
24+
pass
25+
26+
cdef extern from "src/core/lib/iomgr/gevent_util.h":
27+
grpc_error* grpc_socket_error(char* error)
28+
char* grpc_slice_buffer_start(grpc_slice_buffer* buffer, int i)
29+
int grpc_slice_buffer_length(grpc_slice_buffer* buffer, int i)
30+
31+
cdef extern from "src/core/lib/iomgr/sockaddr.h":
32+
ctypedef struct grpc_sockaddr:
33+
pass
34+
35+
cdef extern from "src/core/lib/iomgr/resolve_address.h":
36+
ctypedef struct grpc_resolved_addresses:
37+
size_t naddrs
38+
grpc_resolved_address* addrs
39+
40+
ctypedef struct grpc_resolved_address:
41+
char[128] addr
42+
size_t len
43+
44+
cdef extern from "src/core/lib/iomgr/resolve_address_custom.h":
45+
struct grpc_custom_resolver:
46+
pass
47+
48+
struct grpc_custom_resolver_vtable:
49+
grpc_error* (*resolve)(char* host, char* port, grpc_resolved_addresses** res);
50+
void (*resolve_async)(grpc_custom_resolver* resolver, char* host, char* port);
51+
52+
void grpc_custom_resolve_callback(grpc_custom_resolver* resolver,
53+
grpc_resolved_addresses* result,
54+
grpc_error* error);
55+
56+
cdef extern from "src/core/lib/iomgr/tcp_custom.h":
57+
struct grpc_custom_socket:
58+
void* impl
59+
# We don't care about the rest of the fields
60+
ctypedef void (*grpc_custom_connect_callback)(grpc_custom_socket* socket,
61+
grpc_error* error)
62+
ctypedef void (*grpc_custom_write_callback)(grpc_custom_socket* socket,
63+
grpc_error* error)
64+
ctypedef void (*grpc_custom_read_callback)(grpc_custom_socket* socket,
65+
size_t nread, grpc_error* error)
66+
ctypedef void (*grpc_custom_accept_callback)(grpc_custom_socket* socket,
67+
grpc_custom_socket* client,
68+
grpc_error* error)
69+
ctypedef void (*grpc_custom_close_callback)(grpc_custom_socket* socket)
70+
71+
struct grpc_socket_vtable:
72+
grpc_error* (*init)(grpc_custom_socket* socket, int domain);
73+
void (*connect)(grpc_custom_socket* socket, const grpc_sockaddr* addr,
74+
size_t len, grpc_custom_connect_callback cb);
75+
void (*destroy)(grpc_custom_socket* socket);
76+
void (*shutdown)(grpc_custom_socket* socket);
77+
void (*close)(grpc_custom_socket* socket, grpc_custom_close_callback cb);
78+
void (*write)(grpc_custom_socket* socket, grpc_slice_buffer* slices,
79+
grpc_custom_write_callback cb);
80+
void (*read)(grpc_custom_socket* socket, char* buffer, size_t length,
81+
grpc_custom_read_callback cb);
82+
grpc_error* (*getpeername)(grpc_custom_socket* socket,
83+
const grpc_sockaddr* addr, int* len);
84+
grpc_error* (*getsockname)(grpc_custom_socket* socket,
85+
const grpc_sockaddr* addr, int* len);
86+
grpc_error* (*setsockopt)(grpc_custom_socket* socket, int level, int optname,
87+
const void* optval, uint32_t len);
88+
grpc_error* (*bind)(grpc_custom_socket* socket, const grpc_sockaddr* addr,
89+
size_t len, int flags);
90+
grpc_error* (*listen)(grpc_custom_socket* socket);
91+
void (*accept)(grpc_custom_socket* socket, grpc_custom_socket* client,
92+
grpc_custom_accept_callback cb);
93+
94+
cdef extern from "src/core/lib/iomgr/timer_custom.h":
95+
struct grpc_custom_timer:
96+
void* timer
97+
int timeout_ms
98+
# We don't care about the rest of the fields
99+
100+
struct grpc_custom_timer_vtable:
101+
void (*start)(grpc_custom_timer* t);
102+
void (*stop)(grpc_custom_timer* t);
103+
104+
void grpc_custom_timer_callback(grpc_custom_timer* t, grpc_error* error);
105+
106+
cdef extern from "src/core/lib/iomgr/pollset_custom.h":
107+
struct grpc_custom_poller_vtable:
108+
void (*init)()
109+
void (*poll)(size_t timeout_ms)
110+
void (*kick)()
111+
void (*shutdown)()
112+
113+
cdef extern from "src/core/lib/iomgr/iomgr_custom.h":
114+
void grpc_custom_iomgr_init(grpc_socket_vtable* socket,
115+
grpc_custom_resolver_vtable* resolver,
116+
grpc_custom_timer_vtable* timer,
117+
grpc_custom_poller_vtable* poller);
118+
119+
cdef extern from "src/core/lib/iomgr/sockaddr_utils.h":
120+
int grpc_sockaddr_get_port(const grpc_resolved_address *addr);
121+
int grpc_sockaddr_to_string(char **out, const grpc_resolved_address *addr,
122+
int normalize);
123+
void grpc_string_to_sockaddr(grpc_resolved_address *out, char* addr, int port);
124+
int grpc_sockaddr_set_port(const grpc_resolved_address *resolved_addr,
125+
int port)
126+
const char* grpc_sockaddr_get_uri_scheme(const grpc_resolved_address* resolved_addr)
127+
128+
129+
cdef class TimerWrapper:
130+
131+
cdef grpc_custom_timer *c_timer
132+
cdef object timer
133+
cdef object event
134+
135+
cdef class SocketWrapper:
136+
cdef object sockopts
137+
cdef object socket
138+
cdef object closed
139+
cdef grpc_custom_socket *c_socket
140+
cdef char* c_buffer
141+
cdef size_t len
142+
cdef grpc_custom_socket *accepting_socket
143+
144+
cdef grpc_custom_connect_callback connect_cb
145+
cdef grpc_custom_write_callback write_cb
146+
cdef grpc_custom_read_callback read_cb
147+
cdef grpc_custom_accept_callback accept_cb
148+
cdef grpc_custom_close_callback close_cb
149+
150+
151+
cdef class ResolveWrapper:
152+
cdef grpc_custom_resolver *c_resolver
153+
cdef char* c_host
154+
cdef char* c_port

0 commit comments

Comments
 (0)