Fix up service types and method handlers so that FC unary can work properly.

pull/7018/head
vjpai 9 years ago
parent ba6597f297
commit 7142a91fc9
  1. 3
      include/grpc++/impl/codegen/rpc_method.h
  2. 1
      include/grpc++/impl/codegen/rpc_service_method.h
  3. 7
      include/grpc++/impl/codegen/service_type.h
  4. 9
      src/compiler/cpp_generator.cc

@ -61,11 +61,12 @@ class RpcMethod {
const char* name() const { return name_; }
RpcType method_type() const { return method_type_; }
void SetMethodType(RpcType type) { method_type_ = type; }
void* channel_tag() const { return channel_tag_; }
private:
const char* const name_;
const RpcType method_type_;
RpcType method_type_;
void* const channel_tag_;
};

@ -82,6 +82,7 @@ class RpcServiceMethod : public RpcMethod {
// if MethodHandler is nullptr, then this is an async method
MethodHandler* handler() const { return handler_.get(); }
void ResetHandler() { handler_.reset(); }
void SetHandler(MethodHandler *handler) { handler_.reset(handler); }
private:
void* server_tag_;

@ -147,6 +147,13 @@ class Service {
methods_[index].reset();
}
void MarkMethodFCUnary(int index, MethodHandler* fc_unary_method) {
GPR_CODEGEN_ASSERT(methods_[index] && methods_[index]->handler() &&
"Cannot mark an async or generic method as FCUnary");
methods_[index]->SetMethodType(::grpc::RpcMethod::FC_UNARY);
methods_[index]->SetHandler(fc_unary_method);
}
private:
friend class Server;
friend class ServerInterface;

@ -129,6 +129,7 @@ grpc::string GetHeaderIncludes(File *file,
"grpc++/impl/codegen/async_stream.h",
"grpc++/impl/codegen/async_unary_call.h",
"grpc++/impl/codegen/fc_unary.h",
"grpc++/impl/codegen/method_handler_impl.h",
"grpc++/impl/codegen/proto_utils.h",
"grpc++/impl/codegen/rpc_method.h",
"grpc++/impl/codegen/service_type.h",
@ -625,6 +626,11 @@ void PrintHeaderServerMethodFCUnary(
printer->Indent();
printer->Print(*vars,
"WithFCUnaryMethod_$Method$() {\n"
" ::grpc::Status (*fn)(::grpc::ServerContext*, ::grpc::FCUnary< $Request$,$Response$>*) = this->WithFCUnaryMethod_$Method$<BaseClass>::$Method$;\n"
" ::grpc::Service::MarkMethodFCUnary($Idx$,\n"
" new ::grpc::FCUnaryMethodHandler<Service, "
"$Request$, "
"$Response$>(fn, this));\n"
"}\n");
printer->Print(*vars,
"~WithFCUnaryMethod_$Method$() GRPC_OVERRIDE {\n"
@ -1138,6 +1144,9 @@ void PrintSourceService(Printer *printer,
(*vars)["Idx"] = as_string(i);
if (method->NoStreaming()) {
(*vars)["StreamingType"] = "NORMAL_RPC";
// NOTE: There is no reason to consider FC_UNARY as a separate
// category here since this part is setting up the client-side stub
// and this appears as a NORMAL_RPC from the client-side.
} else if (method->ClientOnlyStreaming()) {
(*vars)["StreamingType"] = "CLIENT_STREAMING";
} else if (method->ServerOnlyStreaming()) {

Loading…
Cancel
Save