You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							96 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							96 lines
						
					
					
						
							3.2 KiB
						
					
					
				| package resource_pool | |
| 
 | |
| import ( | |
| 	"time" | |
| ) | |
| 
 | |
| type Options struct { | |
| 	// The maximum number of active resource handles per resource location.  (A | |
| 	// non-positive value indicates the number of active resource handles is | |
| 	// unbounded). | |
| 	MaxActiveHandles int32 | |
| 
 | |
| 	// The maximum number of idle resource handles per resource location that | |
| 	// are kept alive by the resource pool. | |
| 	MaxIdleHandles uint32 | |
| 
 | |
| 	// The maximum amount of time an idle resource handle can remain alive (if | |
| 	// specified). | |
| 	MaxIdleTime *time.Duration | |
| 
 | |
| 	// This limits the number of concurrent Open calls (there's no limit when | |
| 	// OpenMaxConcurrency is non-positive). | |
| 	OpenMaxConcurrency int | |
| 
 | |
| 	// This function creates a resource handle (e.g., a connection) for a | |
| 	// resource location.  The function must be thread-safe. | |
| 	Open func(resourceLocation string) ( | |
| 		handle interface{}, | |
| 		err error) | |
| 
 | |
| 	// This function destroys a resource handle and performs the necessary | |
| 	// cleanup to free up resources.  The function must be thread-safe. | |
| 	Close func(handle interface{}) error | |
| 
 | |
| 	// This specifies the now time function.  When the function is non-nil, the | |
| 	// resource pool will use the specified function instead of time.Now to | |
| 	// generate the current time. | |
| 	NowFunc func() time.Time | |
| } | |
| 
 | |
| func (o Options) getCurrentTime() time.Time { | |
| 	if o.NowFunc == nil { | |
| 		return time.Now() | |
| 	} else { | |
| 		return o.NowFunc() | |
| 	} | |
| } | |
| 
 | |
| // A generic interface for managed resource pool.  All resource pool | |
| // implementations must be threadsafe. | |
| type ResourcePool interface { | |
| 	// This returns the number of active resource handles. | |
| 	NumActive() int32 | |
| 
 | |
| 	// This returns the highest number of actives handles for the entire | |
| 	// lifetime of the pool.  If the pool contains multiple sub-pools, the | |
| 	// high water mark is the max of the sub-pools' high water marks. | |
| 	ActiveHighWaterMark() int32 | |
| 
 | |
| 	// This returns the number of alive idle handles.  NOTE: This is only used | |
| 	// for testing. | |
| 	NumIdle() int | |
| 
 | |
| 	// This associates a resource location to the resource pool; afterwhich, | |
| 	// the user can get resource handles for the resource location. | |
| 	Register(resourceLocation string) error | |
| 
 | |
| 	// This dissociates a resource location from the resource pool; afterwhich, | |
| 	// the user can no longer get resource handles for the resource location. | |
| 	// If the given resource location corresponds to a sub-pool, the unregistered | |
| 	// sub-pool will enter lame duck mode. | |
| 	Unregister(resourceLocation string) error | |
| 
 | |
| 	// This returns the list of registered resource location entries. | |
| 	ListRegistered() []string | |
| 
 | |
| 	// This gets an active resource handle from the resource pool.  The | |
| 	// handle will remain active until one of the following is called: | |
| 	//  1. handle.Release() | |
| 	//  2. handle.Discard() | |
| 	//  3. pool.Release(handle) | |
| 	//  4. pool.Discard(handle) | |
| 	Get(key string) (ManagedHandle, error) | |
| 
 | |
| 	// This releases an active resource handle back to the resource pool. | |
| 	Release(handle ManagedHandle) error | |
| 
 | |
| 	// This discards an active resource from the resource pool. | |
| 	Discard(handle ManagedHandle) error | |
| 
 | |
| 	// Enter the resource pool into lame duck mode.  The resource pool | |
| 	// will no longer return resource handles, and all idle resource handles | |
| 	// are closed immediately (including active resource handles that are | |
| 	// released back to the pool afterward). | |
| 	EnterLameDuckMode() | |
| }
 |