diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-18 13:29:28 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-18 13:29:28 +0300 |
| commit | 371a609297bb06b232ba31ef8cbec76396cee681 (patch) | |
| tree | 12c7cb04bc1ced22715bb6fde621d71228e1020d /internal/probemanager/manager.go | |
| parent | 6c66afc7e4fbabc42c2df832c31d9380e3e68eac (diff) | |
fix probemanager close serialization for task 55
Diffstat (limited to 'internal/probemanager/manager.go')
| -rw-r--r-- | internal/probemanager/manager.go | 64 |
1 files changed, 33 insertions, 31 deletions
diff --git a/internal/probemanager/manager.go b/internal/probemanager/manager.go index bb6d44d..288af41 100644 --- a/internal/probemanager/manager.go +++ b/internal/probemanager/manager.go @@ -136,14 +136,6 @@ func (m *Manager) Attach(syscall string) error { m.mu.Unlock() return err } - if entry.active { - m.mu.Unlock() - return nil - } - - enterTP := entry.enterTP - exitTP := entry.exitTP - attacher := m.attacher m.mu.Unlock() entry.attachMu.Lock() defer entry.attachMu.Unlock() @@ -158,6 +150,9 @@ func (m *Manager) Attach(syscall string) error { m.mu.Unlock() return nil } + enterTP := entry.enterTP + exitTP := entry.exitTP + attacher := m.attacher m.mu.Unlock() enterLink, exitLink, attachErr := attachPair(attacher, enterTP, exitTP) @@ -230,10 +225,6 @@ func (m *Manager) Detach(syscall string) error { m.mu.Lock() defer m.mu.Unlock() - entry, err = m.entryLocked(syscall) - if err != nil { - return err - } if enterErr == nil { entry.enterLink = nil } @@ -319,39 +310,47 @@ func (m *Manager) Close() error { m.mu.Unlock() return nil } - type pairLinks struct { - syscall string - enterLink Link - exitLink Link + type pairEntry struct { + syscall string + entry *probeEntry + hasLinks bool } - links := make([]pairLinks, 0, len(m.probes)) + entries := make([]pairEntry, 0, len(m.probes)) for syscall, entry := range m.probes { - links = append(links, pairLinks{ - syscall: syscall, - enterLink: entry.enterLink, - exitLink: entry.exitLink, + entries = append(entries, pairEntry{ + syscall: syscall, + entry: entry, + hasLinks: entry.enterLink != nil || entry.exitLink != nil, }) - entry.enterLink = nil - entry.exitLink = nil - entry.active = false - entry.lastErr = nil } m.closed = true m.mu.Unlock() var firstErr error - for _, l := range links { + for _, item := range entries { + if item.hasLinks { + item.entry.attachMu.Lock() + } var errForSyscall error - if l.enterLink != nil { - if err := l.enterLink.Destroy(); err != nil { + m.mu.Lock() + enterLink := item.entry.enterLink + exitLink := item.entry.exitLink + item.entry.enterLink = nil + item.entry.exitLink = nil + item.entry.active = false + item.entry.lastErr = nil + m.mu.Unlock() + + if enterLink != nil { + if err := enterLink.Destroy(); err != nil { errForSyscall = err if firstErr == nil { firstErr = err } } } - if l.exitLink != nil { - if err := l.exitLink.Destroy(); err != nil { + if exitLink != nil { + if err := exitLink.Destroy(); err != nil { if errForSyscall == nil { errForSyscall = err } @@ -360,7 +359,10 @@ func (m *Manager) Close() error { } } } - m.setLastError(l.syscall, errForSyscall) + m.setLastError(item.syscall, errForSyscall) + if item.hasLinks { + item.entry.attachMu.Unlock() + } } return firstErr } |
