code.gitea.io/gitea@v1.22.3/modules/graceful/releasereopen/releasereopen.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package releasereopen
     5  
     6  import (
     7  	"errors"
     8  	"sync"
     9  )
    10  
    11  type ReleaseReopener interface {
    12  	ReleaseReopen() error
    13  }
    14  
    15  type Manager struct {
    16  	mu      sync.Mutex
    17  	counter int64
    18  
    19  	releaseReopeners map[int64]ReleaseReopener
    20  }
    21  
    22  func (r *Manager) Register(rr ReleaseReopener) (cancel func()) {
    23  	r.mu.Lock()
    24  	defer r.mu.Unlock()
    25  
    26  	r.counter++
    27  	currentCounter := r.counter
    28  	r.releaseReopeners[r.counter] = rr
    29  
    30  	return func() {
    31  		r.mu.Lock()
    32  		defer r.mu.Unlock()
    33  
    34  		delete(r.releaseReopeners, currentCounter)
    35  	}
    36  }
    37  
    38  func (r *Manager) ReleaseReopen() error {
    39  	r.mu.Lock()
    40  	defer r.mu.Unlock()
    41  
    42  	var errs []error
    43  	for _, rr := range r.releaseReopeners {
    44  		if err := rr.ReleaseReopen(); err != nil {
    45  			errs = append(errs, err)
    46  		}
    47  	}
    48  	return errors.Join(errs...)
    49  }
    50  
    51  func GetManager() *Manager {
    52  	return manager
    53  }
    54  
    55  func NewManager() *Manager {
    56  	return &Manager{
    57  		releaseReopeners: make(map[int64]ReleaseReopener),
    58  	}
    59  }
    60  
    61  var manager = NewManager()