changed embedded mutex to private field (#222)
This commit is contained in:
		| @@ -9,7 +9,6 @@ import ( | |||||||
| 	"slices" | 	"slices" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" |  | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v4/errors" | 	"go.unistack.org/micro/v4/errors" | ||||||
| @@ -46,7 +45,6 @@ type httpHandler struct { | |||||||
| 	handlers *rhttp.Trie | 	handlers *rhttp.Trie | ||||||
| 	name     string | 	name     string | ||||||
| 	sopts    server.Options | 	sopts    server.Options | ||||||
| 	sync.RWMutex |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func (h *httpHandler) Name() string { | func (h *httpHandler) Name() string { | ||||||
|   | |||||||
							
								
								
									
										84
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										84
									
								
								http.go
									
									
									
									
									
								
							| @@ -36,18 +36,18 @@ type Server struct { | |||||||
| 	stateReady   *atomic.Uint32 | 	stateReady   *atomic.Uint32 | ||||||
| 	stateHealth  *atomic.Uint32 | 	stateHealth  *atomic.Uint32 | ||||||
| 	registerRPC  bool | 	registerRPC  bool | ||||||
| 	sync.RWMutex | 	mu           sync.RWMutex | ||||||
| 	registered bool | 	registered   bool | ||||||
| 	init       bool | 	init         bool | ||||||
| } | } | ||||||
|  |  | ||||||
| func (h *Server) newCodec(ct string) (codec.Codec, error) { | func (h *Server) newCodec(ct string) (codec.Codec, error) { | ||||||
| 	if idx := strings.IndexRune(ct, ';'); idx >= 0 { | 	if idx := strings.IndexRune(ct, ';'); idx >= 0 { | ||||||
| 		ct = ct[:idx] | 		ct = ct[:idx] | ||||||
| 	} | 	} | ||||||
| 	h.RLock() | 	h.mu.RLock() | ||||||
| 	cf, ok := h.opts.Codecs[ct] | 	cf, ok := h.opts.Codecs[ct] | ||||||
| 	h.RUnlock() | 	h.mu.RUnlock() | ||||||
| 	if ok { | 	if ok { | ||||||
| 		return cf, nil | 		return cf, nil | ||||||
| 	} | 	} | ||||||
| @@ -55,9 +55,9 @@ func (h *Server) newCodec(ct string) (codec.Codec, error) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (h *Server) Options() server.Options { | func (h *Server) Options() server.Options { | ||||||
| 	h.Lock() | 	h.mu.Lock() | ||||||
| 	opts := h.opts | 	opts := h.opts | ||||||
| 	h.Unlock() | 	h.mu.Unlock() | ||||||
| 	return opts | 	return opts | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -66,7 +66,7 @@ func (h *Server) Init(opts ...server.Option) error { | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	h.Lock() | 	h.mu.Lock() | ||||||
|  |  | ||||||
| 	for _, o := range opts { | 	for _, o := range opts { | ||||||
| 		o(&h.opts) | 		o(&h.opts) | ||||||
| @@ -89,41 +89,41 @@ func (h *Server) Init(opts ...server.Option) error { | |||||||
| 		for pm, ps := range phs.h { | 		for pm, ps := range phs.h { | ||||||
| 			for pp, ph := range ps { | 			for pp, ph := range ps { | ||||||
| 				if err := h.pathHandlers.Insert([]string{pm}, pp, ph); err != nil { | 				if err := h.pathHandlers.Insert([]string{pm}, pp, ph); err != nil { | ||||||
| 					h.Unlock() | 					h.mu.Unlock() | ||||||
| 					return err | 					return err | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	h.Unlock() | 	h.mu.Unlock() | ||||||
|  |  | ||||||
| 	h.RLock() | 	h.mu.RLock() | ||||||
| 	if err := h.opts.Register.Init(); err != nil { | 	if err := h.opts.Register.Init(); err != nil { | ||||||
| 		h.RUnlock() | 		h.mu.RUnlock() | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err := h.opts.Broker.Init(); err != nil { | 	if err := h.opts.Broker.Init(); err != nil { | ||||||
| 		h.RUnlock() | 		h.mu.RUnlock() | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err := h.opts.Tracer.Init(); err != nil { | 	if err := h.opts.Tracer.Init(); err != nil { | ||||||
| 		h.RUnlock() | 		h.mu.RUnlock() | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err := h.opts.Logger.Init(); err != nil { | 	if err := h.opts.Logger.Init(); err != nil { | ||||||
| 		h.RUnlock() | 		h.mu.RUnlock() | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err := h.opts.Meter.Init(); err != nil { | 	if err := h.opts.Meter.Init(); err != nil { | ||||||
| 		h.RUnlock() | 		h.mu.RUnlock() | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	h.RUnlock() | 	h.mu.RUnlock() | ||||||
|  |  | ||||||
| 	h.Lock() | 	h.mu.Lock() | ||||||
| 	h.init = true | 	h.init = true | ||||||
| 	h.Unlock() | 	h.mu.Unlock() | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| @@ -132,27 +132,27 @@ func (h *Server) Handle(handler server.Handler) error { | |||||||
| 	// passed unknown handler | 	// passed unknown handler | ||||||
| 	hdlr, ok := handler.(*httpHandler) | 	hdlr, ok := handler.(*httpHandler) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		h.Lock() | 		h.mu.Lock() | ||||||
| 		h.hd = handler | 		h.hd = handler | ||||||
| 		h.Unlock() | 		h.mu.Unlock() | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// passed http.Handler like some muxer | 	// passed http.Handler like some muxer | ||||||
| 	if _, ok := hdlr.hd.(http.Handler); ok { | 	if _, ok := hdlr.hd.(http.Handler); ok { | ||||||
| 		h.Lock() | 		h.mu.Lock() | ||||||
| 		h.hd = handler | 		h.hd = handler | ||||||
| 		h.Unlock() | 		h.mu.Unlock() | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// passed micro compat handler | 	// passed micro compat handler | ||||||
| 	h.Lock() | 	h.mu.Lock() | ||||||
| 	if h.handlers == nil { | 	if h.handlers == nil { | ||||||
| 		h.handlers = make(map[string]server.Handler) | 		h.handlers = make(map[string]server.Handler) | ||||||
| 	} | 	} | ||||||
| 	h.handlers[handler.Name()] = handler | 	h.handlers[handler.Name()] = handler | ||||||
| 	h.Unlock() | 	h.mu.Unlock() | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| @@ -294,10 +294,10 @@ func (h *Server) NewHandler(handler interface{}, opts ...server.HandlerOption) s | |||||||
| } | } | ||||||
|  |  | ||||||
| func (h *Server) Register() error { | func (h *Server) Register() error { | ||||||
| 	h.RLock() | 	h.mu.RLock() | ||||||
| 	rsvc := h.rsvc | 	rsvc := h.rsvc | ||||||
| 	config := h.opts | 	config := h.opts | ||||||
| 	h.RUnlock() | 	h.mu.RUnlock() | ||||||
|  |  | ||||||
| 	// if service already filled, reuse it and return early | 	// if service already filled, reuse it and return early | ||||||
| 	if rsvc != nil { | 	if rsvc != nil { | ||||||
| @@ -312,9 +312,9 @@ func (h *Server) Register() error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	h.RLock() | 	h.mu.RLock() | ||||||
| 	registered := h.registered | 	registered := h.registered | ||||||
| 	h.RUnlock() | 	h.mu.RUnlock() | ||||||
|  |  | ||||||
| 	if !registered { | 	if !registered { | ||||||
| 		if config.Logger.V(logger.InfoLevel) { | 		if config.Logger.V(logger.InfoLevel) { | ||||||
| @@ -332,19 +332,19 @@ func (h *Server) Register() error { | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	h.Lock() | 	h.mu.Lock() | ||||||
|  |  | ||||||
| 	h.registered = true | 	h.registered = true | ||||||
| 	h.rsvc = service | 	h.rsvc = service | ||||||
| 	h.Unlock() | 	h.mu.Unlock() | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (h *Server) Deregister() error { | func (h *Server) Deregister() error { | ||||||
| 	h.RLock() | 	h.mu.RLock() | ||||||
| 	config := h.opts | 	config := h.opts | ||||||
| 	h.RUnlock() | 	h.mu.RUnlock() | ||||||
|  |  | ||||||
| 	service, err := server.NewRegisterService(h) | 	service, err := server.NewRegisterService(h) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -359,24 +359,24 @@ func (h *Server) Deregister() error { | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	h.Lock() | 	h.mu.Lock() | ||||||
| 	h.rsvc = nil | 	h.rsvc = nil | ||||||
|  |  | ||||||
| 	if !h.registered { | 	if !h.registered { | ||||||
| 		h.Unlock() | 		h.mu.Unlock() | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	h.registered = false | 	h.registered = false | ||||||
|  |  | ||||||
| 	h.Unlock() | 	h.mu.Unlock() | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
| func (h *Server) Start() error { | func (h *Server) Start() error { | ||||||
| 	h.RLock() | 	h.mu.RLock() | ||||||
| 	config := h.opts | 	config := h.opts | ||||||
| 	h.RUnlock() | 	h.mu.RUnlock() | ||||||
|  |  | ||||||
| 	// micro: config.Transport.Listen(config.Address) | 	// micro: config.Transport.Listen(config.Address) | ||||||
| 	var ts net.Listener | 	var ts net.Listener | ||||||
| @@ -406,9 +406,9 @@ func (h *Server) Start() error { | |||||||
| 		config.Logger.Info(config.Context, "Listening on "+ts.Addr().String()) | 		config.Logger.Info(config.Context, "Listening on "+ts.Addr().String()) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	h.Lock() | 	h.mu.Lock() | ||||||
| 	h.opts.Address = ts.Addr().String() | 	h.opts.Address = ts.Addr().String() | ||||||
| 	h.Unlock() | 	h.mu.Unlock() | ||||||
|  |  | ||||||
| 	var handler http.Handler | 	var handler http.Handler | ||||||
|  |  | ||||||
| @@ -499,9 +499,9 @@ func (h *Server) Start() error { | |||||||
| 			select { | 			select { | ||||||
| 			// register self on interval | 			// register self on interval | ||||||
| 			case <-t.C: | 			case <-t.C: | ||||||
| 				h.RLock() | 				h.mu.RLock() | ||||||
| 				registered := h.registered | 				registered := h.registered | ||||||
| 				h.RUnlock() | 				h.mu.RUnlock() | ||||||
| 				rerr := config.RegisterCheck(h.opts.Context) | 				rerr := config.RegisterCheck(h.opts.Context) | ||||||
| 				// nolint: nestif | 				// nolint: nestif | ||||||
| 				if rerr != nil && registered { | 				if rerr != nil && registered { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user