Skip to content

Commit 552c66f

Browse files
committed
refact: optimize usage of RWMutex in MCPServer for concurrency performance
1 parent 9f39a43 commit 552c66f

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

server/server.go

+32-9
Original file line numberDiff line numberDiff line change
@@ -407,11 +407,18 @@ func (s *MCPServer) AddResource(
407407
resource mcp.Resource,
408408
handler ResourceHandlerFunc,
409409
) {
410-
s.capabilitiesMu.Lock()
410+
s.capabilitiesMu.RLock()
411411
if s.capabilities.resources == nil {
412-
s.capabilities.resources = &resourceCapabilities{}
412+
s.capabilitiesMu.RUnlock()
413+
414+
s.capabilitiesMu.Lock()
415+
if s.capabilities.resources == nil {
416+
s.capabilities.resources = &resourceCapabilities{}
417+
}
418+
s.capabilitiesMu.Unlock()
419+
} else {
420+
s.capabilitiesMu.RUnlock()
413421
}
414-
s.capabilitiesMu.Unlock()
415422

416423
s.resourcesMu.Lock()
417424
defer s.resourcesMu.Unlock()
@@ -438,11 +445,17 @@ func (s *MCPServer) AddResourceTemplate(
438445
template mcp.ResourceTemplate,
439446
handler ResourceTemplateHandlerFunc,
440447
) {
441-
s.capabilitiesMu.Lock()
448+
s.capabilitiesMu.RLock()
442449
if s.capabilities.resources == nil {
450+
s.capabilitiesMu.RUnlock()
451+
452+
s.capabilitiesMu.Lock()
443453
s.capabilities.resources = &resourceCapabilities{}
454+
s.capabilitiesMu.Unlock()
455+
} else {
456+
s.capabilitiesMu.RUnlock()
444457
}
445-
s.capabilitiesMu.Unlock()
458+
446459

447460
s.resourcesMu.Lock()
448461
defer s.resourcesMu.Unlock()
@@ -454,11 +467,16 @@ func (s *MCPServer) AddResourceTemplate(
454467

455468
// AddPrompt registers a new prompt handler with the given name
456469
func (s *MCPServer) AddPrompt(prompt mcp.Prompt, handler PromptHandlerFunc) {
457-
s.capabilitiesMu.Lock()
470+
s.capabilitiesMu.RLock()
458471
if s.capabilities.prompts == nil {
472+
s.capabilitiesMu.RUnlock()
473+
474+
s.capabilitiesMu.Lock()
459475
s.capabilities.prompts = &promptCapabilities{}
476+
s.capabilitiesMu.Unlock()
477+
} else {
478+
s.capabilitiesMu.RUnlock()
460479
}
461-
s.capabilitiesMu.Unlock()
462480

463481
s.promptsMu.Lock()
464482
defer s.promptsMu.Unlock()
@@ -473,11 +491,16 @@ func (s *MCPServer) AddTool(tool mcp.Tool, handler ToolHandlerFunc) {
473491

474492
// AddTools registers multiple tools at once
475493
func (s *MCPServer) AddTools(tools ...ServerTool) {
476-
s.capabilitiesMu.Lock()
494+
s.capabilitiesMu.RLock()
477495
if s.capabilities.tools == nil {
496+
s.capabilitiesMu.RUnlock()
497+
498+
s.capabilitiesMu.Lock()
478499
s.capabilities.tools = &toolCapabilities{}
500+
s.capabilitiesMu.Unlock()
501+
} else {
502+
s.capabilitiesMu.RUnlock()
479503
}
480-
s.capabilitiesMu.Unlock()
481504

482505
s.toolsMu.Lock()
483506
for _, entry := range tools {

0 commit comments

Comments
 (0)