From 9738b8b68cc96a06758e6630f7c48b60f7e2b00b Mon Sep 17 00:00:00 2001 From: iamqizhao Date: Fri, 12 Jun 2015 17:31:53 -0700 Subject: [PATCH] add the sanity check back and refactor --- server.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server.go b/server.go index bc8914b3..cbf4947b 100644 --- a/server.go +++ b/server.go @@ -38,6 +38,7 @@ import ( "fmt" "io" "net" + "reflect" "strings" "sync" @@ -138,9 +139,17 @@ func NewServer(opt ...ServerOption) *Server { // server. Called from the IDL generated code. This must be called before // invoking Serve. func (s *Server) RegisterService(sd *ServiceDesc, ss interface{}) { + ht := reflect.TypeOf(sd.HandlerType).Elem() + st := reflect.TypeOf(ss) + if !st.Implements(ht) { + grpclog.Fatalf("grpc: Server.RegisterService found the handler of type %v that does not satisfy %v", st, ht) + } + s.register(sd, ss) +} + +func (s *Server) register(sd *ServiceDesc, ss interface{}) { s.mu.Lock() defer s.mu.Unlock() - // Does some sanity checks. if _, ok := s.m[sd.ServiceName]; ok { grpclog.Fatalf("grpc: Server.RegisterService found duplicate service registration for %q", sd.ServiceName) }