Skip to content

Commit

Permalink
Generic service and generic stub refactor.
Browse files Browse the repository at this point in the history
  • Loading branch information
yousukseung committed Apr 25, 2024
1 parent 4da74a5 commit 267205a
Show file tree
Hide file tree
Showing 11 changed files with 323 additions and 125 deletions.
37 changes: 37 additions & 0 deletions BUILD
Expand Up @@ -424,7 +424,9 @@ GRPCXX_PUBLIC_HDRS = [
"include/grpcpp/create_channel_posix.h",
"include/grpcpp/ext/health_check_service_server_builder_option.h",
"include/grpcpp/generic/async_generic_service.h",
"include/grpcpp/generic/callback_generic_service.h",
"include/grpcpp/generic/generic_stub.h",
"include/grpcpp/generic/generic_stub_callback.h",
"include/grpcpp/grpcpp.h",
"include/grpcpp/health_check_service_interface.h",
"include/grpcpp/impl/call_hook.h",
Expand Down Expand Up @@ -1242,6 +1244,7 @@ grpc_cc_library(
visibility = ["@grpc:public"],
deps = [
"channel_arg_names",
"generic_stub_internal",
"gpr",
"grpc++_base_unsecure",
"grpc++_codegen_proto",
Expand Down Expand Up @@ -2437,6 +2440,7 @@ grpc_cc_library(
"channel_stack_builder",
"config",
"exec_ctx",
"generic_stub_internal",
"gpr",
"grpc",
"grpc++_codegen_proto",
Expand Down Expand Up @@ -2521,6 +2525,7 @@ grpc_cc_library(
"channel_stack_builder",
"config",
"exec_ctx",
"generic_stub_internal",
"gpr",
"grpc_base",
"grpc_core_credentials_header",
Expand Down Expand Up @@ -2914,6 +2919,38 @@ grpc_cc_library(
],
)

grpc_cc_library(
name = "generic_stub_internal",
hdrs = [
"include/grpcpp/impl/generic_stub_internal.h",
],
language = "c++",
deps = [
"grpc++_public_hdrs",
],
)

grpc_cc_library(
name = "generic_stub_callback",
hdrs = [
"include/grpcpp/generic/generic_stub_callback.h",
],
language = "c++",
visibility = ["@grpc:public"],
deps = [
"generic_stub_internal",
],
)

grpc_cc_library(
name = "callback_generic_service",
hdrs = [
"include/grpcpp/generic/callback_generic_service.h",
],
language = "c++",
visibility = ["@grpc:public"],
)

grpc_cc_library(
name = "work_serializer",
srcs = [
Expand Down
6 changes: 6 additions & 0 deletions CMakeLists.txt

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions build_autogenerated.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions gRPC-C++.podspec

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 1 addition & 53 deletions include/grpcpp/generic/async_generic_service.h
Expand Up @@ -20,10 +20,9 @@
#define GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H

#include <grpc/support/port_platform.h>
#include <grpcpp/impl/server_callback_handlers.h>
#include <grpcpp/generic/callback_generic_service.h>
#include <grpcpp/support/async_stream.h>
#include <grpcpp/support/byte_buffer.h>
#include <grpcpp/support/server_callback.h>

struct grpc_server;

Expand Down Expand Up @@ -78,57 +77,6 @@ class AsyncGenericService final {
grpc::Server* server_;
};

/// \a ServerGenericBidiReactor is the reactor class for bidi streaming RPCs
/// invoked on a CallbackGenericService. It is just a ServerBidi reactor with
/// ByteBuffer arguments.
using ServerGenericBidiReactor = ServerBidiReactor<ByteBuffer, ByteBuffer>;

class GenericCallbackServerContext final : public grpc::CallbackServerContext {
public:
const std::string& method() const { return method_; }
const std::string& host() const { return host_; }

private:
friend class grpc::Server;

std::string method_;
std::string host_;
};

/// \a CallbackGenericService is the base class for generic services implemented
/// using the callback API and registered through the ServerBuilder using
/// RegisterCallbackGenericService.
class CallbackGenericService {
public:
CallbackGenericService() {}
virtual ~CallbackGenericService() {}

/// The "method handler" for the generic API. This function should be
/// overridden to provide a ServerGenericBidiReactor that implements the
/// application-level interface for this RPC. Unimplemented by default.
virtual ServerGenericBidiReactor* CreateReactor(
GenericCallbackServerContext* /*ctx*/) {
class Reactor : public ServerGenericBidiReactor {
public:
Reactor() { this->Finish(Status(StatusCode::UNIMPLEMENTED, "")); }
void OnDone() override { delete this; }
};
return new Reactor;
}

private:
friend class grpc::Server;

internal::CallbackBidiHandler<ByteBuffer, ByteBuffer>* Handler() {
return new internal::CallbackBidiHandler<ByteBuffer, ByteBuffer>(
[this](grpc::CallbackServerContext* ctx) {
return CreateReactor(static_cast<GenericCallbackServerContext*>(ctx));
});
}

grpc::Server* server_{nullptr};
};

} // namespace grpc

#endif // GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H
84 changes: 84 additions & 0 deletions include/grpcpp/generic/callback_generic_service.h
@@ -0,0 +1,84 @@
//
//
// Copyright 2024 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.
//
//

#ifndef GRPCPP_GENERIC_CALLBACK_GENERIC_SERVICE_H
#define GRPCPP_GENERIC_CALLBACK_GENERIC_SERVICE_H

#include <grpc/support/port_platform.h>
#include <grpcpp/impl/server_callback_handlers.h>
#include <grpcpp/support/byte_buffer.h>
#include <grpcpp/support/server_callback.h>

struct grpc_server;

namespace grpc {

/// \a ServerGenericBidiReactor is the reactor class for bidi streaming RPCs
/// invoked on a CallbackGenericService. It is just a ServerBidi reactor with
/// ByteBuffer arguments.
using ServerGenericBidiReactor = ServerBidiReactor<ByteBuffer, ByteBuffer>;

class GenericCallbackServerContext final : public grpc::CallbackServerContext {
public:
const std::string& method() const { return method_; }
const std::string& host() const { return host_; }

private:
friend class grpc::Server;

std::string method_;
std::string host_;
};

/// \a CallbackGenericService is the base class for generic services implemented
/// using the callback API and registered through the ServerBuilder using
/// RegisterCallbackGenericService.
class CallbackGenericService {
public:
CallbackGenericService() {}
virtual ~CallbackGenericService() {}

/// The "method handler" for the generic API. This function should be
/// overridden to provide a ServerGenericBidiReactor that implements the
/// application-level interface for this RPC. Unimplemented by default.
virtual ServerGenericBidiReactor* CreateReactor(
GenericCallbackServerContext* /*ctx*/) {
class Reactor : public ServerGenericBidiReactor {
public:
Reactor() { this->Finish(Status(StatusCode::UNIMPLEMENTED, "")); }
void OnDone() override { delete this; }
};
return new Reactor;
}

private:
friend class grpc::Server;

internal::CallbackBidiHandler<ByteBuffer, ByteBuffer>* Handler() {
return new internal::CallbackBidiHandler<ByteBuffer, ByteBuffer>(
[this](grpc::CallbackServerContext* ctx) {
return CreateReactor(static_cast<GenericCallbackServerContext*>(ctx));
});
}

grpc::Server* server_{nullptr};
};

} // namespace grpc

#endif // GRPCPP_GENERIC_CALLBACK_GENERIC_SERVICE_H

0 comments on commit 267205a

Please sign in to comment.