@@ -45,7 +45,7 @@ type storeKey struct {
4545
4646// wrappedProvider wraps a provider instance with a reference count.
4747type wrappedProvider struct {
48- provider Provider
48+ Provider
4949 refCount int
5050
5151 // A reference to the key and store are also kept here to override the
@@ -54,11 +54,21 @@ type wrappedProvider struct {
5454 store * store
5555}
5656
57- // wrappedProviderCloser wraps a provider instance with a reference count to avoid double
57+ // closedProvider always returns errProviderClosed error.
58+ type closedProvider struct {}
59+
60+ func (c closedProvider ) KeyMaterial (ctx context.Context ) (* KeyMaterial , error ) {
61+ return nil , errProviderClosed
62+ }
63+
64+ func (c closedProvider ) Close () {
65+ }
66+
67+ // singleCloseWrappedProvider wraps a provider instance with a reference count to avoid double
5868// close still in use provider.
59- type wrappedProviderCloser struct {
60- mu sync.RWMutex
61- wp * wrappedProvider
69+ type singleCloseWrappedProvider struct {
70+ mu sync.RWMutex
71+ provider Provider
6272}
6373
6474// store is a collection of provider instances, safe for concurrent access.
@@ -78,32 +88,28 @@ func (wp *wrappedProvider) Close() {
7888
7989 wp .refCount --
8090 if wp .refCount == 0 {
81- wp .provider .Close ()
91+ wp .Provider .Close ()
8292 delete (ps .providers , wp .storeKey )
8393 }
8494}
8595
8696// Close overrides the Close method of the embedded provider to avoid release the
8797// already released reference.
88- func (w * wrappedProviderCloser ) Close () {
98+ func (w * singleCloseWrappedProvider ) Close () {
8999 w .mu .Lock ()
90100 defer w .mu .Unlock ()
91- if wp := w .wp ; wp != nil {
92- w .wp = nil
93- wp .Close ()
94- }
101+
102+ w .provider .Close ()
103+ w .provider = closedProvider {}
95104}
96105
97106// KeyMaterial returns the key material sourced by the Provider.
98107// Callers are expected to use the returned value as read-only.
99- func (w * wrappedProviderCloser ) KeyMaterial (ctx context.Context ) (* KeyMaterial , error ) {
108+ func (w * singleCloseWrappedProvider ) KeyMaterial (ctx context.Context ) (* KeyMaterial , error ) {
100109 w .mu .RLock ()
101110 defer w .mu .RUnlock ()
102111
103- if w .wp == nil {
104- return nil , errProviderClosed
105- }
106- return w .wp .provider .KeyMaterial (ctx )
112+ return w .provider .KeyMaterial (ctx )
107113}
108114
109115// BuildableConfig wraps parsed provider configuration and functionality to
@@ -143,21 +149,21 @@ func (bc *BuildableConfig) Build(opts BuildOptions) (Provider, error) {
143149 }
144150 if wp , ok := provStore .providers [sk ]; ok {
145151 wp .refCount ++
146- return & wrappedProviderCloser { wp : wp }, nil
152+ return & singleCloseWrappedProvider { provider : wp }, nil
147153 }
148154
149155 provider := bc .starter (opts )
150156 if provider == nil {
151157 return nil , fmt .Errorf ("provider(%q, %q).Build(%v) failed" , sk .name , sk .config , opts )
152158 }
153159 wp := & wrappedProvider {
154- provider : provider ,
160+ Provider : provider ,
155161 refCount : 1 ,
156162 storeKey : sk ,
157163 store : provStore ,
158164 }
159165 provStore .providers [sk ] = wp
160- return & wrappedProviderCloser { wp : wp }, nil
166+ return & singleCloseWrappedProvider { provider : wp }, nil
161167}
162168
163169// String returns the provider name and config as a colon separated string.
0 commit comments