protobuf_grpc: use pthread
Fixes pagefaults. This includes the changes provided by ssumpf in 6726aef. Issue #190
This commit is contained in:
committed by
Christian Helmuth
parent
c2d93a3fa9
commit
12d69338c5
@@ -14,3 +14,5 @@ _ZN9grpc_impl13ServerBuilderD1Ev W
|
|||||||
_ZN9grpc_impl17CreateChannelImplERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_18ChannelCredentialsEE W
|
_ZN9grpc_impl17CreateChannelImplERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKSt10shared_ptrINS_18ChannelCredentialsEE W
|
||||||
_ZN9grpc_impl25InsecureServerCredentialsEv W
|
_ZN9grpc_impl25InsecureServerCredentialsEv W
|
||||||
_ZN9grpc_impl26InsecureChannelCredentialsEv W
|
_ZN9grpc_impl26InsecureChannelCredentialsEv W
|
||||||
|
_ZN9grpc_impl7ChannelD0Ev W
|
||||||
|
_ZN4grpc12experimental29ChannelResetConnectionBackoffEPN9grpc_impl7ChannelE W
|
||||||
|
|||||||
157
run/grpc-server.run
Normal file
157
run/grpc-server.run
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
# To execute this run script on a development PC, you need to setup a TAP device
|
||||||
|
# first:
|
||||||
|
|
||||||
|
# netdev=wlp2s0
|
||||||
|
# tapdev=tap0
|
||||||
|
# user=developer
|
||||||
|
#
|
||||||
|
# sudo ip tuntap add dev $tapdev mode tap user $user
|
||||||
|
# sudo ip address flush dev $tapdev
|
||||||
|
# sudo ip address add 10.0.2.1/24 brd 10.0.2.255 dev $tapdev
|
||||||
|
# sudo ip link set dev $tapdev addr 02:00:00:ca:fe:01
|
||||||
|
# sudo ip link set dev $tapdev up
|
||||||
|
#
|
||||||
|
# connect using your favorite grpc client
|
||||||
|
# E.g. https://github.com/sidhussmann/grpc-connection-stress
|
||||||
|
# ./stress_grpc.sh 10.0.2.55:8899
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
create_boot_directory
|
||||||
|
|
||||||
|
|
||||||
|
import_from_depot [depot_user]/src/[base_src]
|
||||||
|
import_from_depot [depot_user]/src/init
|
||||||
|
import_from_depot [depot_user]/src/libc
|
||||||
|
import_from_depot [depot_user]/src/libcrypto
|
||||||
|
import_from_depot [depot_user]/src/nic_router
|
||||||
|
import_from_depot [depot_user]/src/posix
|
||||||
|
import_from_depot [depot_user]/src/protobuf
|
||||||
|
import_from_depot [depot_user]/src/libssl
|
||||||
|
import_from_depot [depot_user]/src/report_rom
|
||||||
|
import_from_depot [depot_user]/src/stdcxx
|
||||||
|
import_from_depot [depot_user]/src/vfs
|
||||||
|
import_from_depot [depot_user]/src/vfs_lxip
|
||||||
|
import_from_depot [depot_user]/src/zlib
|
||||||
|
|
||||||
|
|
||||||
|
set build_components {
|
||||||
|
drivers/nic
|
||||||
|
test/grpc/server
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
build $build_components
|
||||||
|
|
||||||
|
|
||||||
|
set nic_router_reporting 0
|
||||||
|
|
||||||
|
|
||||||
|
set config {
|
||||||
|
<config verbose="no">
|
||||||
|
<parent-provides>
|
||||||
|
<service name="CPU"/>
|
||||||
|
<service name="LOG"/>
|
||||||
|
<service name="PD"/>
|
||||||
|
<service name="ROM"/>
|
||||||
|
</parent-provides>
|
||||||
|
<default-route>
|
||||||
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
|
</default-route>
|
||||||
|
<default caps="100"/>
|
||||||
|
|
||||||
|
<start name="timer">
|
||||||
|
<resource name="RAM" quantum="1M"/>
|
||||||
|
<provides> <service name="Timer"/> </provides>
|
||||||
|
</start>
|
||||||
|
}
|
||||||
|
|
||||||
|
append config {
|
||||||
|
|
||||||
|
<start name="grpc_server" caps="200">
|
||||||
|
<resource name="RAM" quantum="96M"/>
|
||||||
|
<config server_address="0.0.0.0:8899">
|
||||||
|
<arg value="grpc_server"/>
|
||||||
|
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" socket="/dev/socket"/>
|
||||||
|
<vfs>
|
||||||
|
<dir name="dev">
|
||||||
|
<log/> <null/>
|
||||||
|
<inline name="rtc">2000-01-01 00:00</inline>
|
||||||
|
<dir name="socket">
|
||||||
|
<lxip ip_addr="10.0.3.2" netmask="255.255.255.0" gateway="10.0.3.1"/>
|
||||||
|
</dir>
|
||||||
|
</dir>
|
||||||
|
</vfs>
|
||||||
|
</config>
|
||||||
|
<route>
|
||||||
|
<service name="Nic"> <child name="nic_router" label="grpc2tee -> "/> </service>
|
||||||
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
|
</route>
|
||||||
|
</start>
|
||||||
|
|
||||||
|
<start name="nic_router">
|
||||||
|
<resource name="RAM" quantum="5M"/>
|
||||||
|
<provides><service name="Nic"/></provides>
|
||||||
|
<config verbose_domain_state="no"
|
||||||
|
verbose_packets="no"
|
||||||
|
verbose_packet_drop="no">
|
||||||
|
|
||||||
|
<policy label="grpc2tee -> " domain="server"/>
|
||||||
|
<uplink domain="uplink"/>
|
||||||
|
|
||||||
|
<domain name="uplink" interface="10.0.2.55/24" gateway="10.0.2.1">
|
||||||
|
<nat domain="server" tcp-ports="100" />
|
||||||
|
<tcp-forward port="8899" domain="server" to="10.0.3.2" />
|
||||||
|
</domain>
|
||||||
|
|
||||||
|
<domain name="server" interface="10.0.3.1/24">
|
||||||
|
<dhcp-server ip_first="10.0.3.2"
|
||||||
|
ip_last="10.0.3.2"
|
||||||
|
ip_lease_time_sec="600"/>
|
||||||
|
</domain>
|
||||||
|
|
||||||
|
</config>
|
||||||
|
<route>
|
||||||
|
<service name="Nic"> <child name="nic_drv"/> </service>
|
||||||
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
|
</route>
|
||||||
|
</start>
|
||||||
|
|
||||||
|
<start name="nic_drv" ld="no">
|
||||||
|
<binary name="linux_nic_drv"/>
|
||||||
|
<resource name="RAM" quantum="4M"/>
|
||||||
|
<provides>
|
||||||
|
<service name="Nic"/>
|
||||||
|
</provides>
|
||||||
|
<config>
|
||||||
|
<nic mac="02:00:00:00:00:01" tap="tap0"/>
|
||||||
|
</config>
|
||||||
|
<route>
|
||||||
|
<any-service> <parent/> </any-service>
|
||||||
|
</route>
|
||||||
|
</start>
|
||||||
|
|
||||||
|
</config>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
install_config $config
|
||||||
|
|
||||||
|
|
||||||
|
set boot_modules {
|
||||||
|
grpc_server
|
||||||
|
grpc.lib.so
|
||||||
|
libc_pipe.lib.so
|
||||||
|
vfs_lwip.lib.so
|
||||||
|
linux_nic_drv
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
append qemu_args " -nographic "
|
||||||
|
|
||||||
|
|
||||||
|
build_boot_image $boot_modules
|
||||||
|
|
||||||
|
|
||||||
|
run_genode_until forever
|
||||||
169
run/grpc-startup.run
Normal file
169
run/grpc-startup.run
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
create_boot_directory
|
||||||
|
|
||||||
|
|
||||||
|
import_from_depot [depot_user]/src/[base_src]
|
||||||
|
import_from_depot [depot_user]/src/dynamic_rom
|
||||||
|
import_from_depot [depot_user]/src/init
|
||||||
|
import_from_depot [depot_user]/src/libc
|
||||||
|
import_from_depot [depot_user]/src/libcrypto
|
||||||
|
import_from_depot [depot_user]/src/nic_router
|
||||||
|
import_from_depot [depot_user]/src/posix
|
||||||
|
import_from_depot [depot_user]/src/protobuf
|
||||||
|
import_from_depot [depot_user]/src/libssl
|
||||||
|
import_from_depot [depot_user]/src/report_rom
|
||||||
|
import_from_depot [depot_user]/src/stdcxx
|
||||||
|
import_from_depot [depot_user]/src/vfs
|
||||||
|
import_from_depot [depot_user]/src/vfs_lwip
|
||||||
|
import_from_depot [depot_user]/src/zlib
|
||||||
|
|
||||||
|
|
||||||
|
set build_components {
|
||||||
|
test/grpc/server
|
||||||
|
test/grpc/client
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
build $build_components
|
||||||
|
|
||||||
|
|
||||||
|
set nic_router_reporting 0
|
||||||
|
|
||||||
|
|
||||||
|
set config {
|
||||||
|
<config verbose="no">
|
||||||
|
<parent-provides>
|
||||||
|
<service name="CPU"/>
|
||||||
|
<service name="LOG"/>
|
||||||
|
<service name="PD"/>
|
||||||
|
<service name="ROM"/>
|
||||||
|
</parent-provides>
|
||||||
|
<default-route>
|
||||||
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
|
</default-route>
|
||||||
|
<default caps="100"/>
|
||||||
|
|
||||||
|
<start name="timer">
|
||||||
|
<resource name="RAM" quantum="1M"/>
|
||||||
|
<provides> <service name="Timer"/> </provides>
|
||||||
|
</start>
|
||||||
|
}
|
||||||
|
append_if $nic_router_reporting config {
|
||||||
|
<start name="report_rom">
|
||||||
|
<resource name="RAM" quantum="2M"/>
|
||||||
|
<provides>
|
||||||
|
<service name="ROM"/>
|
||||||
|
<service name="Report"/>
|
||||||
|
</provides>
|
||||||
|
<config verbose="yes">
|
||||||
|
</config>
|
||||||
|
</start>
|
||||||
|
}
|
||||||
|
append config {
|
||||||
|
<start name="nic_router">
|
||||||
|
<resource name="RAM" quantum="8M"/>
|
||||||
|
<provides> <service name="Nic"/> </provides>
|
||||||
|
<config verbose="no"
|
||||||
|
verbose_packets="no"
|
||||||
|
verbose_domain_state="yes"
|
||||||
|
verbose_packet_drop="yes"
|
||||||
|
dhcp_discover_timeout_sec="3"
|
||||||
|
dhcp_request_timeout_sec="3"
|
||||||
|
dhcp_offer_timeout_sec="3"
|
||||||
|
udp_idle_timeout_sec="30"
|
||||||
|
tcp_idle_timeout_sec="30"
|
||||||
|
tcp_max_segm_lifetime_sec="15">}
|
||||||
|
append_if $nic_router_reporting config {
|
||||||
|
<report bytes="yes"
|
||||||
|
config="yes"
|
||||||
|
quota="no"
|
||||||
|
stats="no"
|
||||||
|
interval_sec="2"/>}
|
||||||
|
append config {
|
||||||
|
<domain name="server" interface="10.10.10.1/24">
|
||||||
|
<ip dst="10.10.20.0/0" domain="client"/>
|
||||||
|
</domain>
|
||||||
|
<domain name="client" interface="10.10.20.1/24">
|
||||||
|
<ip dst="10.10.10.0/0" domain="server"/>
|
||||||
|
</domain>
|
||||||
|
<policy label="init -> grpc_server -> lwip" domain="server"/>
|
||||||
|
<policy label="init -> grpc_client -> lwip" domain="client"/>
|
||||||
|
</config>
|
||||||
|
</start>
|
||||||
|
|
||||||
|
<start name="dynamic_rom" caps="100">
|
||||||
|
<resource name="RAM" quantum="4M"/>
|
||||||
|
<provides> <service name="ROM"/> </provides>
|
||||||
|
<config>
|
||||||
|
<rom name="init.config">
|
||||||
|
<inline description="server_only">
|
||||||
|
<config verbose="yes">
|
||||||
|
<parent-provides>
|
||||||
|
<service name="CPU"/>
|
||||||
|
<service name="LOG"/>
|
||||||
|
<service name="Nic"/>
|
||||||
|
<service name="PD"/>
|
||||||
|
<service name="ROM"/>
|
||||||
|
<service name="Timer"/>
|
||||||
|
</parent-provides>
|
||||||
|
<default-route>
|
||||||
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
|
</default-route>
|
||||||
|
<default caps="100"/>
|
||||||
|
<start name="grpc_server" caps="200">
|
||||||
|
<resource name="RAM" quantum="8M"/>
|
||||||
|
<config port="50051">
|
||||||
|
<arg value="grpc_server"/>
|
||||||
|
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" socket="/dev/socket"/>
|
||||||
|
<vfs>
|
||||||
|
<dir name="dev">
|
||||||
|
<log/> <null/>
|
||||||
|
<inline name="rtc">2000-01-01 00:00</inline>
|
||||||
|
<dir name="socket">
|
||||||
|
<lwip ip_addr="10.10.10.55" netmask="255.255.255.0" gateway="10.10.10.1"/>
|
||||||
|
</dir>
|
||||||
|
</dir>
|
||||||
|
</vfs>
|
||||||
|
</config>
|
||||||
|
</start>
|
||||||
|
</config>
|
||||||
|
</inline>
|
||||||
|
<sleep milliseconds="2000"/>
|
||||||
|
<inline description="empty">
|
||||||
|
<config verbose="no">
|
||||||
|
</config>
|
||||||
|
</inline>
|
||||||
|
<sleep milliseconds="2000"/>
|
||||||
|
</rom>
|
||||||
|
</config>
|
||||||
|
</start>
|
||||||
|
|
||||||
|
<start name="init" caps="1500">
|
||||||
|
<resource name="RAM" quantum="20M" />
|
||||||
|
<route>
|
||||||
|
<service name="ROM" label="config"> <child name="dynamic_rom" label="init.config"/> </service>
|
||||||
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
|
</route>
|
||||||
|
</start>
|
||||||
|
|
||||||
|
</config>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
install_config $config
|
||||||
|
|
||||||
|
|
||||||
|
set boot_modules {
|
||||||
|
grpc_server
|
||||||
|
grpc_client
|
||||||
|
grpc.lib.so
|
||||||
|
libc_pipe.lib.so
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
append qemu_args " -nographic "
|
||||||
|
|
||||||
|
|
||||||
|
build_boot_image $boot_modules
|
||||||
|
|
||||||
|
|
||||||
|
run_genode_until {.*Error: thread 'runner' tried to self de-struct - sleeping forever.} 300
|
||||||
27
run/grpc.run
27
run/grpc.run
@@ -1,7 +1,7 @@
|
|||||||
create_boot_directory
|
create_boot_directory
|
||||||
|
|
||||||
|
|
||||||
import_from_depot [depot_user]/src/[base_src]
|
# import_from_depot [depot_user]/src/[base_src]
|
||||||
import_from_depot [depot_user]/src/dynamic_rom
|
import_from_depot [depot_user]/src/dynamic_rom
|
||||||
import_from_depot [depot_user]/src/init
|
import_from_depot [depot_user]/src/init
|
||||||
import_from_depot [depot_user]/src/libc
|
import_from_depot [depot_user]/src/libc
|
||||||
@@ -14,10 +14,13 @@ import_from_depot [depot_user]/src/report_rom
|
|||||||
import_from_depot [depot_user]/src/stdcxx
|
import_from_depot [depot_user]/src/stdcxx
|
||||||
import_from_depot [depot_user]/src/vfs
|
import_from_depot [depot_user]/src/vfs
|
||||||
import_from_depot [depot_user]/src/vfs_lwip
|
import_from_depot [depot_user]/src/vfs_lwip
|
||||||
|
import_from_depot [depot_user]/src/vfs_lxip
|
||||||
import_from_depot [depot_user]/src/zlib
|
import_from_depot [depot_user]/src/zlib
|
||||||
|
|
||||||
|
|
||||||
set build_components {
|
set build_components {
|
||||||
|
core
|
||||||
|
timer
|
||||||
test/grpc/server
|
test/grpc/server
|
||||||
test/grpc/client
|
test/grpc/client
|
||||||
}
|
}
|
||||||
@@ -35,6 +38,7 @@ set config {
|
|||||||
<service name="CPU"/>
|
<service name="CPU"/>
|
||||||
<service name="LOG"/>
|
<service name="LOG"/>
|
||||||
<service name="PD"/>
|
<service name="PD"/>
|
||||||
|
<service name="RM"/>
|
||||||
<service name="ROM"/>
|
<service name="ROM"/>
|
||||||
</parent-provides>
|
</parent-provides>
|
||||||
<default-route>
|
<default-route>
|
||||||
@@ -102,6 +106,7 @@ append config {
|
|||||||
<service name="LOG"/>
|
<service name="LOG"/>
|
||||||
<service name="Nic"/>
|
<service name="Nic"/>
|
||||||
<service name="PD"/>
|
<service name="PD"/>
|
||||||
|
<service name="RM"/>
|
||||||
<service name="ROM"/>
|
<service name="ROM"/>
|
||||||
<service name="Timer"/>
|
<service name="Timer"/>
|
||||||
</parent-provides>
|
</parent-provides>
|
||||||
@@ -110,8 +115,8 @@ append config {
|
|||||||
</default-route>
|
</default-route>
|
||||||
<default caps="100"/>
|
<default caps="100"/>
|
||||||
<start name="grpc_server" caps="200">
|
<start name="grpc_server" caps="200">
|
||||||
<resource name="RAM" quantum="8M"/>
|
<resource name="RAM" quantum="50M"/>
|
||||||
<config port="50051">
|
<config server_address="10.10.10.55:50051">
|
||||||
<arg value="grpc_server"/>
|
<arg value="grpc_server"/>
|
||||||
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" socket="/dev/socket"/>
|
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" socket="/dev/socket"/>
|
||||||
<vfs>
|
<vfs>
|
||||||
@@ -135,6 +140,7 @@ append config {
|
|||||||
<service name="LOG"/>
|
<service name="LOG"/>
|
||||||
<service name="Nic"/>
|
<service name="Nic"/>
|
||||||
<service name="PD"/>
|
<service name="PD"/>
|
||||||
|
<service name="RM"/>
|
||||||
<service name="ROM"/>
|
<service name="ROM"/>
|
||||||
<service name="Timer"/>
|
<service name="Timer"/>
|
||||||
</parent-provides>
|
</parent-provides>
|
||||||
@@ -143,8 +149,8 @@ append config {
|
|||||||
</default-route>
|
</default-route>
|
||||||
<default caps="100"/>
|
<default caps="100"/>
|
||||||
<start name="grpc_server" caps="200">
|
<start name="grpc_server" caps="200">
|
||||||
<resource name="RAM" quantum="8M"/>
|
<resource name="RAM" quantum="50M"/>
|
||||||
<config>
|
<config server_address="10.10.10.55:50051">
|
||||||
<arg value="grpc_server"/>
|
<arg value="grpc_server"/>
|
||||||
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" socket="/dev/socket"/>
|
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" socket="/dev/socket"/>
|
||||||
<vfs>
|
<vfs>
|
||||||
@@ -158,8 +164,8 @@ append config {
|
|||||||
</vfs>
|
</vfs>
|
||||||
</config>
|
</config>
|
||||||
</start>
|
</start>
|
||||||
<start name="grpc_client" caps="200">
|
<start name="grpc_client" caps="400">
|
||||||
<resource name="RAM" quantum="8M"/>
|
<resource name="RAM" quantum="100M"/>
|
||||||
<config>
|
<config>
|
||||||
<arg value="grpc_client"/>
|
<arg value="grpc_client"/>
|
||||||
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" socket="/dev/socket"/>
|
<libc stdout="/dev/log" stderr="/dev/log" rtc="/dev/rtc" socket="/dev/socket"/>
|
||||||
@@ -176,13 +182,13 @@ append config {
|
|||||||
</start>
|
</start>
|
||||||
</config>
|
</config>
|
||||||
</inline>
|
</inline>
|
||||||
<sleep milliseconds="2000000000"/>
|
<sleep milliseconds="30000"/>
|
||||||
</rom>
|
</rom>
|
||||||
</config>
|
</config>
|
||||||
</start>
|
</start>
|
||||||
|
|
||||||
<start name="init" caps="1500">
|
<start name="init" caps="1500">
|
||||||
<resource name="RAM" quantum="20M" />
|
<resource name="RAM" quantum="200M" />
|
||||||
<route>
|
<route>
|
||||||
<service name="ROM" label="config"> <child name="dynamic_rom" label="init.config"/> </service>
|
<service name="ROM" label="config"> <child name="dynamic_rom" label="init.config"/> </service>
|
||||||
<any-service> <parent/> <any-child/> </any-service>
|
<any-service> <parent/> <any-child/> </any-service>
|
||||||
@@ -197,8 +203,11 @@ install_config $config
|
|||||||
|
|
||||||
|
|
||||||
set boot_modules {
|
set boot_modules {
|
||||||
|
core
|
||||||
|
timer
|
||||||
grpc_server
|
grpc_server
|
||||||
grpc_client
|
grpc_client
|
||||||
|
ld.lib.so
|
||||||
grpc.lib.so
|
grpc.lib.so
|
||||||
libc_pipe.lib.so
|
libc_pipe.lib.so
|
||||||
}
|
}
|
||||||
|
|||||||
95
src/test/grpc/client/greeter_client.cc
Normal file
95
src/test/grpc/client/greeter_client.cc
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright 2015 gRPC authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include <grpcpp/grpcpp.h>
|
||||||
|
|
||||||
|
#ifdef BAZEL_BUILD
|
||||||
|
#include "examples/protos/helloworld.grpc.pb.h"
|
||||||
|
#else
|
||||||
|
#include "helloworld.grpc.pb.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
using grpc::Channel;
|
||||||
|
using grpc::ClientContext;
|
||||||
|
using grpc::Status;
|
||||||
|
using helloworld::HelloRequest;
|
||||||
|
using helloworld::HelloReply;
|
||||||
|
using helloworld::Greeter;
|
||||||
|
|
||||||
|
class GreeterClient {
|
||||||
|
public:
|
||||||
|
GreeterClient(std::shared_ptr<Channel> channel)
|
||||||
|
: stub_(Greeter::NewStub(channel)) {}
|
||||||
|
|
||||||
|
// Assembles the client's payload, sends it and presents the response back
|
||||||
|
// from the server.
|
||||||
|
std::string SayHello(const std::string& user) {
|
||||||
|
// Data we are sending to the server.
|
||||||
|
HelloRequest request;
|
||||||
|
request.set_name(user);
|
||||||
|
|
||||||
|
// Container for the data we expect from the server.
|
||||||
|
HelloReply reply;
|
||||||
|
|
||||||
|
// Context for the client. It could be used to convey extra information to
|
||||||
|
// the server and/or tweak certain RPC behaviors.
|
||||||
|
ClientContext context;
|
||||||
|
|
||||||
|
// The actual RPC.
|
||||||
|
Status status = stub_->SayHello(&context, request, &reply);
|
||||||
|
|
||||||
|
// Act upon its status.
|
||||||
|
if (status.ok()) {
|
||||||
|
return reply.message();
|
||||||
|
} else {
|
||||||
|
std::cout << status.error_code() << ": " << status.error_message()
|
||||||
|
<< std::endl;
|
||||||
|
return "RPC failed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<Greeter::Stub> stub_;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char** argv) {
|
||||||
|
// Instantiate the client. It requires a channel, out of which the actual RPCs
|
||||||
|
// are created. This channel models a connection to an endpoint (in this case,
|
||||||
|
// localhost at port 50051). We indicate that the channel isn't authenticated
|
||||||
|
// (use of InsecureChannelCredentials()).
|
||||||
|
|
||||||
|
|
||||||
|
std::cout << "GreeterClient started" << std::endl;
|
||||||
|
for (auto i = 0; i < 100; i++) {
|
||||||
|
std::shared_ptr<Channel> channel { grpc::CreateChannel(
|
||||||
|
"10.10.10.55:50051", grpc::InsecureChannelCredentials()) };
|
||||||
|
GreeterClient greeter(channel);
|
||||||
|
std::string user("world");
|
||||||
|
std::string reply = greeter.SayHello(user);
|
||||||
|
std::cout << "Greeter " << i << " received: " << reply << std::endl;
|
||||||
|
|
||||||
|
grpc::experimental::ChannelResetConnectionBackoff(channel.get());
|
||||||
|
}
|
||||||
|
std::cout << "GreeterClient stopped" << std::endl;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -17,7 +17,6 @@ SRC_CC := greeter_client.cc
|
|||||||
SRC_CC += helloworld.pb.cc
|
SRC_CC += helloworld.pb.cc
|
||||||
SRC_CC += helloworld.grpc.pb.cc
|
SRC_CC += helloworld.grpc.pb.cc
|
||||||
|
|
||||||
vpath greeter_client.cc $(GRPC_DIR)/examples/cpp/helloworld
|
|
||||||
vpath helloworld.proto $(PROTO_DIR)
|
vpath helloworld.proto $(PROTO_DIR)
|
||||||
|
|
||||||
$(SRC_CC): helloworld.grpc.pb.h
|
$(SRC_CC): helloworld.grpc.pb.h
|
||||||
|
|||||||
@@ -49,8 +49,7 @@ class GreeterServiceImpl final : public Greeter::Service {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void RunServer() {
|
void RunServer(const char* server_address) {
|
||||||
std::string server_address("10.10.10.55:50051");
|
|
||||||
GreeterServiceImpl service;
|
GreeterServiceImpl service;
|
||||||
|
|
||||||
ServerBuilder builder;
|
ServerBuilder builder;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
void RunServer();
|
void RunServer(const char* server_address);
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include <base/heap.h>
|
#include <base/heap.h>
|
||||||
#include <base/log.h>
|
#include <base/log.h>
|
||||||
#include <base/thread.h>
|
#include <base/thread.h>
|
||||||
|
#include <pthread.h>
|
||||||
#include "greeter_server.h"
|
#include "greeter_server.h"
|
||||||
|
|
||||||
enum { STACK_SIZE = 0xF000 };
|
enum { STACK_SIZE = 0xF000 };
|
||||||
@@ -10,37 +11,32 @@ enum { STACK_SIZE = 0xF000 };
|
|||||||
namespace Grpc_server {
|
namespace Grpc_server {
|
||||||
using namespace Genode;
|
using namespace Genode;
|
||||||
|
|
||||||
class Runner;
|
|
||||||
class Server_main;
|
class Server_main;
|
||||||
}
|
}
|
||||||
|
|
||||||
class Grpc_server::Runner : public Thread
|
static void *start_func(void* envp)
|
||||||
{
|
{
|
||||||
public:
|
Genode::Env& env = *(reinterpret_cast<Genode::Env*>(envp));
|
||||||
Runner(Env& env)
|
Genode::Attached_rom_dataspace config { env, "config" };
|
||||||
: Thread(env, "runner", STACK_SIZE)
|
Genode::String<256> server_address = config.xml().attribute_value("server_address", Genode::String<256>("0.0.0.0:8899"));
|
||||||
{
|
Libc::with_libc([&] () {
|
||||||
}
|
RunServer(server_address.string());
|
||||||
|
|
||||||
void entry() override
|
|
||||||
{
|
|
||||||
Libc::with_libc([] () {
|
|
||||||
RunServer();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
class Grpc_server::Server_main
|
class Grpc_server::Server_main
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
Env& _env;
|
Env& _env;
|
||||||
Runner _runner { _env };
|
pthread_t _t;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Server_main(Env& env)
|
Server_main(Env& env)
|
||||||
: _env(env)
|
: _env(env)
|
||||||
{
|
{
|
||||||
_runner.start();
|
pthread_create(&_t, 0, start_func, &env);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user