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()