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  }