@@ -44,38 +44,39 @@ func (r *rpcClient) do(ctx context.Context, method string, args, result interfac
4444
4545type handlerFn func (conn * jsonrpc2.Conn , req * jsonrpc2.Request )
4646
47+ type handlerSt struct {
48+ fn handlerFn
49+ }
50+
4751type requestHandler struct {
48- handlersMu sync.RWMutex
49- handlers map [string ][]handlerFn
52+ handlersMu sync.Mutex
53+ handlers map [string ][]* handlerSt
5054}
5155
5256func newRequestHandler () * requestHandler {
53- return & requestHandler {handlers : make (map [string ][]handlerFn )}
57+ return & requestHandler {handlers : make (map [string ][]* handlerSt )}
5458}
5559
56- func (r * requestHandler ) register (requestType string , handler handlerFn ) func () {
60+ func (r * requestHandler ) register (requestType string , fn handlerFn ) func () {
5761 r .handlersMu .Lock ()
5862 defer r .handlersMu .Unlock ()
5963
60- if _ , ok := r .handlers [requestType ]; ! ok {
61- r .handlers [requestType ] = []handlerFn {}
62- }
63-
64- r .handlers [requestType ] = append (r .handlers [requestType ], handler )
64+ h := & handlerSt {fn : fn }
65+ r .handlers [requestType ] = append (r .handlers [requestType ], h )
6566
6667 return func () {
67- r .deregister (requestType , handler )
68+ r .deregister (requestType , h )
6869 }
6970}
7071
71- func (r * requestHandler ) deregister (requestType string , handler handlerFn ) {
72+ func (r * requestHandler ) deregister (requestType string , handler * handlerSt ) {
7273 r .handlersMu .Lock ()
7374 defer r .handlersMu .Unlock ()
7475
7576 if handlers , ok := r .handlers [requestType ]; ok {
76- newHandlers := []handlerFn {}
77+ newHandlers := []* handlerSt {}
7778 for _ , h := range handlers {
78- if & h != & handler {
79+ if h != handler {
7980 newHandlers = append (newHandlers , h )
8081 }
8182 }
@@ -87,15 +88,15 @@ func (r *requestHandler) deregister(requestType string, handler handlerFn) {
8788 }
8889}
8990
90- func (r * requestHandler ) handlerFn (requestType string ) []handlerFn {
91- r .handlersMu .RLock ()
92- defer r .handlersMu .RUnlock ()
91+ func (r * requestHandler ) getHandlers (requestType string ) []* handlerSt {
92+ r .handlersMu .Lock ()
93+ defer r .handlersMu .Unlock ()
9394
9495 return r .handlers [requestType ]
9596}
9697
9798func (r * requestHandler ) Handle (ctx context.Context , conn * jsonrpc2.Conn , req * jsonrpc2.Request ) {
98- for _ , handler := range r .handlerFn (req .Method ) {
99- go handler (conn , req )
99+ for _ , handler := range r .getHandlers (req .Method ) {
100+ go handler . fn (conn , req )
100101 }
101102}
0 commit comments