Skip to content

Commit 341ebc5

Browse files
authored
perf: optimize usage of RWMutex in MCPServer for performance (#181)
* refact: optimize usage of RWMutex in MCPServer for concurrency performance * fix double-checking for AddTools/AddPromt
1 parent 9d62b19 commit 341ebc5

File tree

1 file changed

+41
-12
lines changed

1 file changed

+41
-12
lines changed

server/server.go

+41-12
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()
@@ -444,11 +451,19 @@ func (s *MCPServer) AddResourceTemplate(
444451
template mcp.ResourceTemplate,
445452
handler ResourceTemplateHandlerFunc,
446453
) {
447-
s.capabilitiesMu.Lock()
454+
s.capabilitiesMu.RLock()
448455
if s.capabilities.resources == nil {
449-
s.capabilities.resources = &resourceCapabilities{}
456+
s.capabilitiesMu.RUnlock()
457+
458+
s.capabilitiesMu.Lock()
459+
if s.capabilities.resources == nil {
460+
s.capabilities.resources = &resourceCapabilities{}
461+
}
462+
s.capabilitiesMu.Unlock()
463+
} else {
464+
s.capabilitiesMu.RUnlock()
450465
}
451-
s.capabilitiesMu.Unlock()
466+
452467

453468
s.resourcesMu.Lock()
454469
defer s.resourcesMu.Unlock()
@@ -466,11 +481,18 @@ func (s *MCPServer) AddResourceTemplate(
466481

467482
// AddPrompt registers a new prompt handler with the given name
468483
func (s *MCPServer) AddPrompt(prompt mcp.Prompt, handler PromptHandlerFunc) {
469-
s.capabilitiesMu.Lock()
484+
s.capabilitiesMu.RLock()
470485
if s.capabilities.prompts == nil {
471-
s.capabilities.prompts = &promptCapabilities{}
486+
s.capabilitiesMu.RUnlock()
487+
488+
s.capabilitiesMu.Lock()
489+
if s.capabilities.prompts == nil {
490+
s.capabilities.prompts = &promptCapabilities{}
491+
}
492+
s.capabilitiesMu.Unlock()
493+
} else {
494+
s.capabilitiesMu.RUnlock()
472495
}
473-
s.capabilitiesMu.Unlock()
474496

475497
s.promptsMu.Lock()
476498
defer s.promptsMu.Unlock()
@@ -491,11 +513,18 @@ func (s *MCPServer) AddTool(tool mcp.Tool, handler ToolHandlerFunc) {
491513

492514
// AddTools registers multiple tools at once
493515
func (s *MCPServer) AddTools(tools ...ServerTool) {
494-
s.capabilitiesMu.Lock()
516+
s.capabilitiesMu.RLock()
495517
if s.capabilities.tools == nil {
496-
s.capabilities.tools = &toolCapabilities{}
518+
s.capabilitiesMu.RUnlock()
519+
520+
s.capabilitiesMu.Lock()
521+
if s.capabilities.tools == nil {
522+
s.capabilities.tools = &toolCapabilities{}
523+
}
524+
s.capabilitiesMu.Unlock()
525+
} else {
526+
s.capabilitiesMu.RUnlock()
497527
}
498-
s.capabilitiesMu.Unlock()
499528

500529
s.toolsMu.Lock()
501530
for _, entry := range tools {

0 commit comments

Comments
 (0)