U
    be                      @   sd   d dl Z d dlZd dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZ edZG dd de
e ZdS )    N)CallableOptionalTypeVarDequeListGenericIteratorTc                   @   s   e Zd ZdZdeg ef ee ee eee dddZe	dd Z
e	d	d
 Zejdee dddZdd ZdddddZdddddZddddZdS )
ObjectPoolz:A pool of objects that release/creates/destroys as needed.Nr   )obj_creatorafter_removemax_sizeidle_timeoutlock_generatorc                 C   s   t  | _t  | _|| _|d kr.t | _n| | _|| _|pBd}t	|t
rV|dk r^td|| _|| _|rxtj| _nt| _d S )Nl        r   z%"max_size" must be a positive integer)collectionsdeque
_used_objs
_free_objs_obj_creator	threadingLock_lock_after_remove
isinstanceint
ValueErrorr   r   time_idle_clockfloat)selfr   r   r   r   r    r    Q/var/www/html/services/stratfitenv/lib/python3.8/site-packages/pymemcache/pool.py__init__   s    


zObjectPool.__init__c                 C   s
   t | jS N)tupler   r   r    r    r!   used6   s    zObjectPool.usedc                 C   s
   t | jS r#   )r$   r   r%   r    r    r!   free:   s    zObjectPool.freeF)returnc                 c   sR   |   }z
|V  W n0 tk
rB   |s2| | n
| |  Y nX | | d S r#   )get	Exceptionreleasedestroy)r   Zdestroy_on_failobjr    r    r!   get_and_release>   s    

zObjectPool.get_and_releasec              
   C   s   | j  |  }| jrH| j }||j | jkr2qv| jd k	r| | qt| j}|| j	krnt
d|| j	f |  }| j| ||_|W  5 Q R  S Q R X d S )NzToo many objects, %s >= %s)r   r   r   popleft
_last_usedr   r   lenr   r   RuntimeErrorr   append)r   nowr-   Z
curr_countr    r    r!   r)   K   s"    



zObjectPool.getTc              	   C   sb   d}| j 6 z| j| d}W n tk
r:   |s6 Y nX W 5 Q R X |r^| jd k	r^| | d S )NFT)r   r   remover   r   )r   r-   silentZwas_droppedr    r    r!   r,   c   s    zObjectPool.destroyc              	   C   sX   | j H z&| j| | j| |  |_W n tk
rH   |sD Y nX W 5 Q R X d S r#   )r   r   r5   r   r3   r   r0   r   )r   r-   r6   r    r    r!   r+   o   s    zObjectPool.releasec              	   C   s   | j d k	rbg }| j2 || j || j | j  | j  W 5 Q R X |D ]}|  | qPn&| j | j  | j  W 5 Q R X d S r#   )r   r   extendr   r   clear)r   Zneeds_destroyr-   r    r    r!   r8   y   s    


zObjectPool.clear)NNr   N)F)T)T)__name__
__module____qualname____doc__r   r	   r   r   r"   propertyr&   r'   
contextlibcontextmanagerr   r.   r)   r,   r+   r8   r    r    r    r!   r
      s,       



r
   )r   r>   r   r   typingr   r   r   r   r   r   r   r	   r
   r    r    r    r!   <module>   s   $