github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/db/connection_tracker.go (about) 1 package db 2 3 import ( 4 "runtime/debug" 5 "sync" 6 ) 7 8 var GlobalConnectionTracker = NewConnectionTracker() 9 10 type ConnectionTracker struct { 11 sessions map[*ConnectionSession]struct{} 12 sessionsL *sync.Mutex 13 } 14 15 func NewConnectionTracker() *ConnectionTracker { 16 return &ConnectionTracker{ 17 sessions: map[*ConnectionSession]struct{}{}, 18 sessionsL: &sync.Mutex{}, 19 } 20 } 21 22 func (tracker *ConnectionTracker) Track() *ConnectionSession { 23 session := &ConnectionSession{ 24 tracker: tracker, 25 stack: string(debug.Stack()), 26 } 27 28 tracker.sessionsL.Lock() 29 tracker.sessions[session] = struct{}{} 30 tracker.sessionsL.Unlock() 31 32 return session 33 } 34 35 func (tracker *ConnectionTracker) Current() []string { 36 stacks := []string{} 37 38 tracker.sessionsL.Lock() 39 40 for session := range tracker.sessions { 41 stacks = append(stacks, session.stack) 42 } 43 44 tracker.sessionsL.Unlock() 45 46 return stacks 47 } 48 49 func (tracker *ConnectionTracker) remove(session *ConnectionSession) { 50 tracker.sessionsL.Lock() 51 delete(tracker.sessions, session) 52 tracker.sessionsL.Unlock() 53 } 54 55 type ConnectionSession struct { 56 tracker *ConnectionTracker 57 stack string 58 } 59 60 func (session *ConnectionSession) Release() { 61 session.tracker.remove(session) 62 }