@@ -187,8 +187,7 @@ type Response struct {
187
187
188
188
// Server represents an RPC Server.
189
189
type Server struct {
190
- mu sync.RWMutex // protects the serviceMap
191
- serviceMap map [string ]* service
190
+ serviceMap sync.Map // map[string]*service
192
191
reqLock sync.Mutex // protects freeReq
193
192
freeReq * Request
194
193
respLock sync.Mutex // protects freeResp
@@ -197,7 +196,7 @@ type Server struct {
197
196
198
197
// NewServer returns a new Server.
199
198
func NewServer () * Server {
200
- return & Server {serviceMap : make ( map [ string ] * service ) }
199
+ return & Server {}
201
200
}
202
201
203
202
// DefaultServer is the default instance of *Server.
@@ -240,11 +239,6 @@ func (server *Server) RegisterName(name string, rcvr interface{}) error {
240
239
}
241
240
242
241
func (server * Server ) register (rcvr interface {}, name string , useName bool ) error {
243
- server .mu .Lock ()
244
- defer server .mu .Unlock ()
245
- if server .serviceMap == nil {
246
- server .serviceMap = make (map [string ]* service )
247
- }
248
242
s := new (service )
249
243
s .typ = reflect .TypeOf (rcvr )
250
244
s .rcvr = reflect .ValueOf (rcvr )
@@ -262,9 +256,6 @@ func (server *Server) register(rcvr interface{}, name string, useName bool) erro
262
256
log .Print (s )
263
257
return errors .New (s )
264
258
}
265
- if _ , present := server .serviceMap [sname ]; present {
266
- return errors .New ("rpc: service already defined: " + sname )
267
- }
268
259
s .name = sname
269
260
270
261
// Install the methods
@@ -283,7 +274,10 @@ func (server *Server) register(rcvr interface{}, name string, useName bool) erro
283
274
log .Print (str )
284
275
return errors .New (str )
285
276
}
286
- server .serviceMap [s .name ] = s
277
+
278
+ if _ , dup := server .serviceMap .LoadOrStore (sname , s ); dup {
279
+ return errors .New ("rpc: service already defined: " + sname )
280
+ }
287
281
return nil
288
282
}
289
283
@@ -581,7 +575,7 @@ func (server *Server) readRequest(codec ServerCodec) (service *service, mtype *m
581
575
return
582
576
}
583
577
584
- func (server * Server ) readRequestHeader (codec ServerCodec ) (service * service , mtype * methodType , req * Request , keepReading bool , err error ) {
578
+ func (server * Server ) readRequestHeader (codec ServerCodec ) (svc * service , mtype * methodType , req * Request , keepReading bool , err error ) {
585
579
// Grab the request header.
586
580
req = server .getRequest ()
587
581
err = codec .ReadRequestHeader (req )
@@ -607,14 +601,13 @@ func (server *Server) readRequestHeader(codec ServerCodec) (service *service, mt
607
601
methodName := req .ServiceMethod [dot + 1 :]
608
602
609
603
// Look up the request.
610
- server .mu .RLock ()
611
- service = server .serviceMap [serviceName ]
612
- server .mu .RUnlock ()
613
- if service == nil {
604
+ svci , ok := server .serviceMap .Load (serviceName )
605
+ if ! ok {
614
606
err = errors .New ("rpc: can't find service " + req .ServiceMethod )
615
607
return
616
608
}
617
- mtype = service .method [methodName ]
609
+ svc = svci .(* service )
610
+ mtype = svc .method [methodName ]
618
611
if mtype == nil {
619
612
err = errors .New ("rpc: can't find method " + req .ServiceMethod )
620
613
}
0 commit comments